详解程序化交易Dual Thrust策略
详解程序化交易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
来源:雪球
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
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,Length);
StdValue = StandardDev(Close,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,UpperBand))
{
Buy(Lots,Open);
}
If(MarketPosition!=-1 &&CrossUnder(Close,LowerBand))
{
SellShort(Lots,Open);
}
If(MarketPosition==1 && Close
{
Sell(Lots,Open);
}
If(MarketPosition==-1 && Close>AveMa)
{
BuyToCover(Lots,Open);
}
End
作者:量化投资Quant
链接:https://xueqiu.com/5256769224/32429269
来源:雪球
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
本帖最后由 满盘红 于 2019-3-17 18:01 编辑
-
页:
[1]