详解程序化交易Dual Thrust策略

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:程序化交易的优点与缺点   网页链接
2:全球十大程序化交易系统 (源码) 网页链接
3:详解程序化交易Dual Thrust策略 网页链接
4:金字塔Dual Thrust交易系统源码 网页链接

雪球转发:57回复:40喜欢:376

精彩评论

高斯蒙2015-12-12 20:08

网页链接 有个用户用代码实现了一下~

全部评论

桔红牛顿2019-04-07 17:02

网页链接

Molly_Sunny2017-11-23 10:20

测试一下看效果

summerXXX2017-11-07 11:51

网页链接   DT 是个 经典策略, 测试发现 K线周期 不能小, 感觉只能 日K线 ,  K线周期 设置小了  ,可能会有  反复的 假突破,导致 回撤增大。做成多品种 的不知道效果怎么样,回头可以试下。

callme_Fantasy2017-06-24 10:25

博主,我是个代码盲,想借用一下代码做分析,但不是很会用。。我想用Matlab但是有些变量不知道该怎么定义?比如If MarketPosition = -1怎么表示,经常提示error。。没学过代码表示要崩溃了QAQ