查看: 3813|回复: 3
打印 上一主题 下一主题

详解程序化交易Dual Thrust策略

[复制链接]
跳转到指定楼层
1
 楼主| 发表于 2019-3-17 16:51:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
详解程序化交易Dual Thrust策略
来自量化投资Quant的雪球原创专栏
Dual Thrust系统是 Michael Chalek 在80 年代开发的 Dual Thrust。在自动化交易排名中,目前为止,仍然排名第二左右。下表是我自己按5分钟周期跑回测的结果,效果非常好:

这是上表成绩最好的沪铜指数的成绩走势图:
通过几个关键数据的对比发现,该模型对于多品种还是有一定的普适性,模型中的参数也采用默认,未针对个别产品进行优化,虽然选出的四个产品都达到了正收益,但由于品种的差异性,区别还是较大。
我们可以看下它的源代码,并不复杂:
Inputs: K1(.5),K2(.5),Mday(1),Nday(1);
Vars: BuyRange(0), SellRange(0);
Vars: BuyTrig(0),SellTrig(0);
Vars: HH(0),LL(0),HC(0),LC(0);
If CurrentBar > 1 Then Begin
HH = Highest(High,Mday);
HC = Highest(Close,Mday);
LL = Lowest(Low,Mday);
LC = Lowest(Close,Mday);
If (HH - LC) >= (HC - LL) Then Begin
SellRange = HH - LC;
End Else Begin
SellRange = HC - LL;
End;
HH = Highest(High,Nday);
HC = Highest(Close,Nday);
LL = Lowest(Low,Nday);
LC = Lowest(Close,Nday);
If (HH - LC) >= (HC - LL) Then Begin
BuyRange = HH - LC;
End Else Begin
BuyRange = HC - LL;
End;
BuyTrig = K1*BuyRange;
SellTrig = K2*SellRange;
If MarketPosition = 0 Then Begin
Buy at Open of next bar + BuyTrig Stop;
Sell at Open of next bar - SellTrig Stop;
End;
If MarketPosition = -1 Then Begin
Buy at Open of next bar + Buytrig Stop;
End;
If MarketPosition = 1 Then Begin
Sell at Open of next bar - SellTrig Stop;
End;
End;
短短几十行而已,难度并不大,但其背后的交易策略却是很厉害。

它的逻辑原型是较为常见的日内交易策略之一开盘区间突破策略,以今日开盘价加减一定比例的昨日振幅,确定上下轨。日内突破上轨时平空做多,突破下轨时平多做空。
开盘区间突破策略基本原理
1. 在今天的收盘,计算两个值:最高价-收盘价,和收盘价-最低价。然后取这两个值较大的那个,乘以k值0.7。把结果称为触发值。
2. 在明天的开盘,记录开盘价,然后在价格超过(开盘+触发值)时马上买入,或者价格低于(开盘-触发值)时马上卖空。
3. 没有明确止损。这个系统是反转系统,也就是说,如果在价格超过(开盘+触发值)时手头有一口空单,则买入两口。同理,如果在价格低于(开盘-触发值)时手上有一口多单,则卖出两口。
Dual Thrust在开盘区间突破策略上进行了相关改进:
1、在范围(range)的设置上,引入前N日的四个价位,使得一定时期内的范围相对稳定,可以适用于日间的趋势跟踪;
2、Dual Thrust对于多头和空头的触发条件,考虑了非对称的幅度,做多和做空参考的Range可以选择不同的周期数,也可以通过参数K1和K2来确定。当K1时,多头相对容易被触发,当K1>K2时,空头相对容易被触发。
因此,在使用该策略时,一方面可以参考历史数据测试的最优参数,另一方面,则可以根据自己对后势的判断,或从其他大周期的技术指标入手,阶段性地动态调整K1和K2的值。
就是一个典型的观望、等待信号、进场、套利、离场的套路,却效果卓著。
因此对于学习程序化,一是对编程语言和工具的掌握,这个和所有的码农进阶之路一样,练是硬道理,技术要求与你的策略复杂程度成正相关。二就是对交易策略的领会,赚钱本身是体力活,赚钱的逻辑才是脑力活。
推荐几篇程序化交易入门材料:
资料来源此网站

日内交易模型的设计思路
【入市设计】
系统模型入市的设计思路,事实上应与投资者的交易风格喜好、交易时间框架密切相关,可以分别是趋势跟踪、震荡交易、套利交易等,近年来甚至也出现了基于基本面分析数据的量化模型,以及带有人工智能性质的神经网络、遗传算法等具备自学习、自适应市场能力的高级交易系统模型。不过,最简单、最实用、最适合普通投资者的交易系统入市设计思路仍然是趋势跟踪,而趋势跟踪的实质就是追涨杀跌或者美其名曰:顺势而为。突破,是趋势跟踪系统设计中最为简洁实用的设计思路,具体应用设计思路可能包括:
⒈通道突破。最著名的此类程式设计代表作为:海龟交易法则与四周规则。其入市信号触发设计为:价格突破最近N根K线的高低点。长期来看,这种设计思路虽然简单,但永远也不会失效或显得过时。事实上,越简单的反而越有效。
⒉ 均线突破。该设计思路的代表作品有:克罗均线,它由4、9、18等三条均线组成;鳄鱼组线,它由5、8、13等三条移中平均线组成;自适应均线,它由考夫曼博士提出,以市场效率生成弹性浮动参数,以均线拐头为信号触发。
⒊ 指标突破。常见的技术分析指标,如MACD、KDJ、RSI、BOLL、SAR、WR、ADX等,均可独立构成一个简单的趋势跟踪系统,当然,是使用系统默认参数,还是使用优化参数;是使用其常规用法,还是使用创新用法,可能存在仁者见仁、智者见智的分歧。
⒋ 形态突破。形态突破,包括K线形态组合突破、经典技术分析形态突破等,K线形态组合的突破,以酒田战法为最经典,著名的红三兵、黑三兵、希望之星等经典K 线形态均源于此,共分为酒田战法70型。至于经典的双顶、双底、趋势线突破、横盘突破、头肩顶底、三角形态、楔形、旗形、钻石型、圆弧顶底等技术形态,因普通的模型编写语言较难精确描述而存在一定的设计使用障碍,需要使用转向函数及图形模糊识别技术来克服。
⒌ 波动性突破。波动性可以定义为:最高价与最低价、当根K线的最高价与昨收盘、当根K线的最低价与昨收盘,这三组价格差额的最大者即该品种的波动性值,波动性既可以进行横向比较品种间的波动性水平,也可以用于纵向判断价格波动的异常,并作为入市信号的触发器。
⒍ 时间价格突破。在趋势行情的必经之路,守株待兔,是我们进行突破系统设计的基本思路。而时间、价格突破,从速度、幅度的两维视角预约了趋势行情,堪称突破系统设计的典范。基本设计思路为价格在N时间范围内、上涨或下跌了N个点位。进一步拓展思路后,还可以引入周间日、日间时的概念,细化不同时间段的突破标准,以便更好地适应品种个性,此外,还可以时间、价格过滤器的方法来实现对趋势行情的确认,以减少价格盘整阶段的假突破现象。
【离市设计】
⒈ 止损。止损,是交易系统模型设计中一个不可或缺的元素,资金止损、技术止损,是两种主要的考虑方案,采用两者孰低的方案可能更为科学。一方面,你要确保每笔交易不冒过大的风险,另一方面,你要背靠一个关键的压力、支撑技术位置,采用反向交易信号作为自动止损的依据,则是持续在市的交易系统模型的一个常用止损方法。
⒉止盈。虽然固定点位的止盈、止损,也是系统设计中可以采用的方法,但我们更倾向于兼顾利润保护和放大功能的跟踪止盈或SAR抛物线止盈模式,随着利润的扩大,而不断抬高甚至收紧止盈目标位置,可以在一定程度上起到利润最大化的设计目标。
⒊ 时间清仓。以时间为因素考虑离场,无论是作为一种辅助离场方法,还是作为一种独立的出市方法,都是一个不错的思路。比如三根K线过后,如果既没有达到止盈位、也没有触及止损位,就主动离场。
绩效指标的迷失
1、总获利金额(Net Profit)
有没有合理考虑成本?从每笔交易纪录中,推算成本金额,是否合理包含交易税,手续费与滑价损失。另外,换约必然产生的成本,有无考虑?
有没有考虑合理执行达标率?讯号产生到实际交易执行成功,之间的滑价,是否合理估计,这包含交易执行的准备时间充不充分,交易单的方式合不合理?
多久的交易期间?系统总是有表现好的时后,与表现不好的时候。如果交易期间太短(低于5年),可能只是把表现比较好的一面呈现出来,不具整体代表性。
多大的风险代价?如果最大的连续亏损过大(占之前净值高点比例过大),这样的获利报酬的代价是不是可以被接受,如果无法接受,那这样的报酬是无法真正实现的。因为在持续亏损下,早就放弃执行这样的系统,或者,获利之后,又容易回吐殆尽。

2、报酬率:
报酬率期间长度(用多少时间来计算报酬率的分子:盈亏金额)。是年报酬率?还是月报酬率?时间长短不同,累积的报酬率自然不同。
取样的期间长度(总交易期间)。是单年的报酬率?还是多年的平均报酬率?与多久的交易期间观念相同。
报酬率的基准金额为何(报酬率分母)。起始账户资金为何?资金管理模式为何?有一种报酬率,称为最小账户资金报酬率(ROA)。是用过去最大连续亏损金额(MDD),加上原始保证金来当报酬率的分母。这是最大风险下的报酬率。
多大的风险代价?若以ROA代表报酬率,是必须承受将近百分百的账户亏损风险,才能得到这样的报酬率,并不切实际。每个人的风险承受能力不同,但100%的风险承受并不是正常合理的假设。单口系统不易表现出合理的风险报酬率,但可以约略从净值曲线与一些风险报酬进阶指标看出。适当的资金管理多口数系统,可以合理表现报酬率。
3、交易频率:
频率太低,交易次数少,不具代表性。取样期间内应该超过36笔交易。
频率太高,交易次数多,执行的精神成本过高。因人而异,每日不超过3笔交易为宜。
4、实际绩效与模拟绩效:
模拟绩效
一般系统绩效多是以历史数据来仿真的,必须了解系统仿真的原理与假设。因为K线资料只有4个统计值(开盘价 / 最高价 / 最低价 / 收盘价),所以,必须有所谓的K线假设(Bar Assumptions),来模拟行情在K线中的走势,当K线的时间架构越大(如日线,周线)时,误差就会越大。在TradeStation中,即使时间架构是日线,仍然可以用分线,甚至是实际每笔交易纪录,这种用更细微的时间单位(Resolution),来仿真过去交易与绩效,误差就大为减少了。当然,前提是历史的数据必须是存在与正确的。
有些仿真程序与TradeStation一样,都有所谓的收盘进场讯号,这本来在实际执行交易上,逻辑是行不通的。之前,最后一盘为5分钟集中撮合,可以在这5分钟内,以市价单来进出场,可以让收盘进场的讯号适用,现在期交所已经取消最后5分钟的集中撮合。另外,有些程序系统参考收盘价,来决定是否收盘进出场,这在仿真程序可以做到,但在实务上,却是无法执行的,也造成了模拟绩效的误谬。
实际绩效
有些人会把实际账户的交易绩效,以交易报告书公布出来。除非是长时间的详细交易纪录,否则,都无法证实是系统完全执行下的结果。
有的系统绩效时好时坏,若只能比对短时间,系统与实际账户的绩效,比较难证明系统与实际账户的一致性。
如果只是公布账户资金的变动,而没有实际的交易纪录,报酬率也可能是虚胖的。比如,股指多手数系统,可以设定10%的总资金风险,来控制交易手数。这时,只要把10%~20%的资金放在保证金账户就可以了,单以保证金账户来看,报酬率与实际总资金报酬率,多了5到10倍。
---「相关文章 」---
1:程序化交易的优点与缺点   http://xueqiu.com/5256769224/32429390
2:全球十大程序化交易系统 (源码) http://xueqiu.com/5256769224/32429269
3:详解程序化交易Dual Thrust策略 http://xueqiu.com/5256769224/32429363
4:金字塔Dual Thrust交易系统源码 http://xueqiu.com/5256769224/32429305

作者:量化投资Quant
链接:https://xueqiu.com/5256769224/32429363?from=timeline&isappinstalled=0
来源:雪球
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。





2
 楼主| 发表于 2019-3-17 16:54:36 | 只看该作者
Aberration trading system

Aberration 交易系统由Keith   Fitschen 于1986发明1993年Keith Fitschen 将该系统商业化发布自发布之日起该系统业绩一直名列前茅在1997 年2001 年2005 年已发布交易系统的业绩排名中该系统均排名前十

该交易系统的特点是同时交易在8 种不同的品种上包括物肉类金属能源外汇金融以及股指期货等Aberration交易系统的交易频率常常是每年交易某一品种3-4  次60%的时间都持有仓位平均每笔交易持仓60  天它通过长线交易捕捉趋势来获取巨额利润那它如何来弥补亏损呢因为它同时交易在多个不相关的市场当某一品种损失时另一品种可能获利在一年的时间里总是有某一种或者多种品种能获得巨额利润这些大的利润弥补了那些没趋势市场的小额亏损Aberration    交易系统对资金进行组合管理因此可以接受比较大的资金量

TB  开发平台和语言

//------------------------------------------------------------------------

// 简称: JYXT_Aberration

// 名称: Aberration

// 类别: 公式应用

// 类型: 用户应用

// 输出:Rookies

//------------------------------------------------------------------------

Params

Numeric Length(35);

Numeric StdDevUp(2.0);

Numeric StdDevDn(-2.0);

Numeric Lots(1);

Vars

NumericSeries UpperBand;

NumericSeries LowerBand;

NumericSeries AveMa;

Numeric StdValue;

Begin

AveMa=Average(Close[1],Length);

StdValue = StandardDev(Close[1],Length);

UpperBand=Avema+StdDevUp*StdValue;

LowerBand=Avema-StdDevUp*StdValue;

PlotNumeric("UpperBand&# 34;,UpperBand);

PlotNumeric("LowerBand&# 34;,LowerBand);

PlotNumeric("AveMa&# 34;,AveMa);

If(MarketPosition!=1 &&CrossOver(Close[1],UpperBand[1]))

{

         Buy(Lots,Open);

}

If(MarketPosition!=-1 &&CrossUnder(Close[1],LowerBand[1]))

{

         SellShort(Lots,Open);

}

If(MarketPosition==1 && Close[1]

{

         Sell(Lots,Open);

}

If(MarketPosition==-1 && Close[1]>AveMa[1])

{

        BuyToCover(Lots,Open);

}

End


作者:量化投资Quant
链接:https://xueqiu.com/5256769224/32429269
来源:雪球
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
回复 支持 反对

使用道具 举报

3
 楼主| 发表于 2019-3-17 16:59:23 | 只看该作者
本帖最后由 满盘红 于 2019-3-17 18:01 编辑

-

004523iz76e0rppy0rpv66.png (332.39 KB, 下载次数: 20)

004523iz76e0rppy0rpv66.png

004523qw10dkzpzpcwgx5y.png (136.24 KB, 下载次数: 17)

004523qw10dkzpzpcwgx5y.png
回复

使用道具 举报

4
 楼主| 发表于 2019-3-17 17:17:26 | 只看该作者

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册入住  

本版积分规则

易家网  ©2015-2023  郑州期米信息技术有限公司版权所有  豫公网安备 41010502005136号 豫ICP备16010300号