您现在的位置:程序化交易>> 程序化交易>> 系统交易>>正文内容

包宁杰强盗交易系统[系统交易]

引言:

文中提到此系统摘自「Building Winning Trading Systems with TradeStation」(Pruitt与Hill,2003)。包宁杰强盗(Bollinger Bandit)交易系统计算价格的标准差,基于均数复归的精神,「当价格突破上N个标准差(N为策略参数)反转时,作空」,反之,「当价格突破下N个标准差反转时,作多」。但Pruitt与Hill的实证中发现,反向操作反而更好,亦即採取「当价格突破上N个标准差(N为策略参数)时,作多」,反之,「当价格突破下N个标准差时,作空」,并将策略参数设计成可适应性调整的动态设定。发文者提供了系统编码与实证绩效结果,并自行作了改进。

 

正文:

今天要报告的是”Building Winning Trading Systems with TradeStation”这本书裡面的第二个交易系统。名字叫做包宁杰强盗Bollinger Bandit交易系统。

 

 

要先讲一下Bollinger Band这个系统,Bollinger Band这个通道的名词,最早是由John Bollinger在1960年代所提出的观念。计算方式就是先取一条简单移动平均线,然后在这条移动平均线上下个取一个标准差的距离,来分别当作上下通道。Bollinger认为在统计学的观念来说,在移动平均线上下各取一个标准差的距离,等于总共是有两个标准差的宽度的通道,应该会包含95%的价格波动。所以当价格位于到上通道的上面的时候,就很有可能会往下回归均线。这时候就可以在价格往下穿透上通道的时候做空,也就是把上通道当作压力区间来操作。(下通道则相反)

 

 

但是George Pruitt & John Hill做的很多测试发现。Bollinger Band的上通道通常并不是压力线,而通常会是可以成功做多的突破线。也就是说我们应该在价格突破上通道的时候做多才对。

 

 

所以作者就将Bollinger Band的讯号反过来操作。同时也加入了一些其他的设计,其中一个设计就是由King Keltner trading system的系统改进而来的。因为在King Keltner trading system当中,出场的机制是当价位回到移动平均线的时候就出场。但是有时候移动平均线的追踪速度太慢了,导致我们有时候真正出场的时候会回吐太多的获利出去。这种情形常常会让很多人吐血。所以他们设计的出场机制会随著进场时间的增加,而更紧密的追踪价位。作法就是随著进场之后的时间增加,把出场的移动平均线的计算长度,逐渐的减少。所以刚进场的时候的停损金额是会比较宽的,但是进场时间越长,计算出场的移动平均线的时间长度会越短,也就代表这条出场移动平均线会越紧密的追踪价位。所以当最后价格反转不利于我们的时候,我们比较不会回吐太多的获利出去。但是这个时间长度最少只有减到10而已,以防止移动秤均线太贴紧价位而很容易就打到停损出场。

 

 

最后作者加了一个简单的滤网来决定多空的方向。就是如果今天的收盘价比30天前的收盘价高的话就只做多,如果今天收盘价比30天之前的收盘价低的话就只做空。

 

 

下面就是书上的程式码:

 

 

{Bollinger Bandit by George Pruitt—program uses Bollinger Bands and Rate of

change to determine entry points. A trailing stop that is proportional with

the amount of time a trade is on is used as the exit technique.}

 

 

Inputs: bollingerLengths(50),liqLength(50),rocCalcLength(30);

 

 

Vars: upBand(0),dnBand(0),liqDays(50),rocCalc(0);

 

 

upBand = BollingerBand(Close,bollingerLengths,1.25);

dnBand = BollingerBand(Close,bollingerLengths,-1.25);

rocCalc = Close - Close[rocCalcLength-1]; {remember to subtract 1}

 

 

if(MarketPosition <> 1 and rocCalc > 0) then Buy("BanditBuy")tomorrow upBand stop;

if(MarketPosition <>-1 and rocCalc < 0) then SellShort("BanditSell") tomorrow dnBand stop;

if(MarketPosition = 0) then liqDays = liqLength;

 

 

if(MarketPosition <> 0) then begin

liqDays = liqDays - 1;

liqDays = MaxList(liqDays,10);

end;

 

 

if(MarketPosition = 1 and Average(Close,liqDays) < upBand) then Sell("Long Liq") tomorrow Average(Close,liqDays) stop;

if(MarketPosition = -1 and Average(Close,liqDays) > dnBand) then BuyToCover("Short Liq") tomorrow Average(Close,liqDays) stop;

 

 

 

 

而作者测试1982-2002年这20年的历史资料,所得出的来结果是这样的。

 

BB Performance.JPG
BB Performance.JPG (86.56 KiB) 被浏览 1223 次

 

 


Bollinger Bandit系统像King Keltner系统一样,同样的也是把上下通道的宽度固定住了,这裡是固定在标准差的1.25倍。所以我同样做了个小小的修改,让我们可以试试看不同的通道宽度,对于绩效的影响如何。修改后的程式码如下:(转自 http://www.cxh99.com/2016/04/08/35133.shtml )

 

 

 

{Bollinger Bandit by George Pruitt—program uses Bollinger Bands and Rate of

change to determine entry points. A trailing stop that is proportional with

the amount of time a trade is on is used as the exit technique.}

 

 

Inputs: bollingerLengths(50),liqLength(50),rocCalcLength(30),StdDevRatio(1);

 

 

Vars: upBand(0),dnBand(0),liqDays(50),rocCalc(0);

 

 

upBand = BollingerBand(Close,bollingerLengths,StdDevRatio);

dnBand = BollingerBand(Close,bollingerLengths,-StdDevRatio);// WWW.CXH99.COM

rocCalc = Close - Close[rocCalcLength-1]; {remember to subtract 1}

 

 

if(MarketPosition <> 1 and rocCalc > 0) then Buy("BanditBuy")tomorrow upBand stop;

if(MarketPosition <>-1 and rocCalc < 0) then SellShort("BanditSell") tomorrow dnBand stop;

if(MarketPosition = 0) then liqDays = liqLength;

 

 

if(MarketPosition <> 0) then begin

liqDays = liqDays - 1;

liqDays = MaxList(liqDays,10);

end;

 

 

if(MarketPosition = 1 and Average(Close,liqDays) < upBand) then Sell("Long Liq") tomorrow Average(Close,liqDays) stop;

if(MarketPosition = -1 and Average(Close,liqDays) > dnBand) then BuyToCover("Short Liq") tomorrow Average(Close,liqDays) stop;

 

 

 

如果有朋友有研究过上一个介绍的King Keltner系统的话,应该会发现Bollinger Bandit跟King Keltner的绩效差不多。这是因为这两个系统的原理基本上就是很类似的,都是属于上下通道突破的系统,只是出场跟滤网的设计不一样而已。所以如果有朋友想要做multi-system的portfolio的话,要注意这两个交易系统的相关性会是比较高的。而我们设计portfolio的原则,就是应该要採用相关性较低的系统才好。

 

有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友

可联系技术人员 QQ: 511411198   点击这里给我发消息进行 有偿 编写!不贵!点击查看价格!


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容