原文参考合作:http://www.bituzi.com/2013/01/blog-post_18.html
刚开始进入程式交易世界时,很多人会用最佳化参数的方式来挑选参数使用,但是随着环境的不同,就会开始自己一直去调整参数。当然,也不是所有参数都需要一直去做调整,但是,如果可以让自己的程式中的参数,随着环境改变而自动去调整变化,这样也许可以让程式变得更有弹性。
先介绍一个简单的交易策略当作范例,那就是N天的区间突破策略,其实也可以看成N根K棒的突破策略。
一般这种顺势突破策略在什么市场最容易赚大钱呢?
那当然是在趋势明显走一段的大多头或大空头市场,
但是如果遇到盘整格局的走势时,可能会有多空讯号反覆的问题。
不过盘整盘是所有顺势策略的死穴,不单单是这策略的问题。
N天的区间突破策略的问题在于N
那这个N会有什么问题呢?你想想,当你设定N为5时,
如果现在趋势明显,很好,进场会进的很快,
可是当趋势混沌不明,忽上忽下时,这时候不就惨了,
一下作多一下作空,每天都被杀好玩的。
所以,如果在趋势明显的时候,可以让N小一点,
在盘整的时候,可以让N变得大一点,这样多有弹性阿!
重点来了,你要怎么让N去自动变化呢?
首先,想要决定N的大小,关键在于趋势是否明显。
如果趋势明显,也表示指数的波动会比较大。
如果趋势是盘整,就表示指数会一直在某个区间整理,
这样的波动会比较小,所以大家想到了吗?
换句话来说,关键在于波动的大小。
假设我们一开始所设定的N是20,
因此也可以算出20根K棒的标准差,叫V20好了。
但是我们想用短一点的时间来衡量标准差,10根K棒好了,
所以也可以得到10根K棒的标准差,就叫做V10吧! 。
那如何藉由波动率的变化来改变N?
请看以下策略源码体会体会
N天的区间突破策略原理: 当今天的价格的高点突破过去N天的最高点时买入,当今天的低点跌破过去的N天的最低点时卖出。 此策略适合趋势比较明显的商品,尤其是单边商品。
测试商品股指IF,使用两图表,子图1周期为1 hour,子图2周期为1 day。源码如下:
inputs: x(20),y(10) ; //定义波动率参数 Vars: V20(10),V10(10),N2(10),N1(10),N(10); //定义变量
V20=Volatility(x)of data2; V10=Volatility(y)of data2; //定义波动率取日线数据,取子图2的日线线数。这个Volatility函数是分别取20日跟10日ATR的移动平均数值 if V10<>0 and N2<>0 then begin N1=(N*V20)/V10; //定义N1的值,前提让分母不为0时执行, //这N1=(N*V20)/V10是此参数自动化的核心, 代表你将原本固定N天的参考值改成会/根据V20和V10而变动的N1值, V20是较长期的,而V10是近期,大家看到这个公式应该可以发现,当你近期的波动率变大时,表示趋势出现,你的N1就会变小,而近期的波动率变得越小时,表示在盘整,N1就会变大,这样新的N变化似乎比较合理一点。
N2=IntPortion(N1); //给N1取整赋值给N2 end;
value1=Average(high of data2,N2)of data2; value2=Average(low of data2,N2)of data2; //定义前N2天的高点跟低点的值给value1和value2
if close crosses above value1 then begin buy next bar at market; end; //当价格上穿高点时买入或者反向
if close crosses below value2 then begin sellshort next bar at market; end; //当价格下穿低点时开空或者反向 |