心血来潮也想尝试在我们自己的平台上动手写写中国股市的动量择时的量化策略,因为实际上有不少时候价值投资者是用基础数据先选出心仪的股票,然后再用量化策略的思路确定入场和离场的时机。
动量择时和择股的基本思路很接近,股票在表现强劲的时候有很大可能会持续上涨,表现差劲的接下来有很大可能继续低迷。
比@Liu Cao同学幸运的是所有从2005年开始所有A股日数据都已经在平台上了,并且经过了Split Adjusted清洗处理,并且会考虑进去仓位情况是否可以拿到对应的时间段的分红。(具体可以访问:
RiceQuant - Beta)只需要一行简单java程序搞定。
我先挑了一只平安证券,先写一个最简单的双均线量化策略:如果短期均线从下方突破长期均线,近期走强,为买入信号,全仓买入,短期均线从上方跌破长期均线则为卖出信号,空仓。
选择的长期均线 = 26天,短期均线 = 12天,基准为沪深300
回测开始日期20120512
回测结束日期20150112
程序无敌简单,只需要调用Talib中的SMA功能计算两段两条均线值。10(ru)分(guo)钟(ni)搞(shu)定(xi API):
经过了5秒的运算等待...
那么结果出来了,在趋势明显的情况下简单动量类量化策略的收益还是不错的。橙色是我们的量化策略,蓝色是基准(沪深300)。0.99的Sharpe也还是不错的,22%的max drawdown稍微有点高...
PS: 关于风险计算的说明可以访问: RiceQuant - Beta
除了收益以外,用自定义时间序列画图功能画出了长短均线和每日收盘价格:
以上的图形只用了类似的几行代码 (RiceQuant - Beta):
informer.plot("MACD",MACDOut[MACDLength.value-1]);从图上可以清晰地看到由两条均线组成的金叉(golden cross)和死叉(death cross),对应的可以在下单历史里查看下单情况(交叉点的日期)
双均线(simple moving average)量化策略虽然简单易懂,但是最大的问题是均线本身计算方法所带来的信号滞后性。等到出现金叉买入点的时候价格已经上涨很多。碰到震荡市就会赔的很惨。比如我们在plot中放大一段双均线的信号图
--------------更好的量化策略的分割线-----------------
有没有什么优化的方法呢?我尝试了下把SMA(simple moving average)换成EMA(exponential moving average)。
那么EMA的双均线表现如何呢?
在同样的设定中进行回测,因为EMA中更多的权重给了最近的数值,所以捕捉动量要比SMA更加灵敏。在股价上涨的时候会更早出现买入信号:
EMA双均线其实有个我们更熟悉的名字叫MACD,只是MACD增加多了一条signal line。
MACD line = 12 天 EMA - 26 天 EMA
MACD signal = 9 天 MACD的EMA
这样就又形成了两条线和新的金叉量化策略,当MACD从底部突破signal时候的走强,为买入信号,反之则是卖出信号。
直接在IDE里调用Talib的MACD功能计算MACD和MACDsignal,可见在趋势性为主,震荡较少的情况下表现不如SMA和EMA双均线。
plot MACD和MACD的signal两条自自定义线
另外一种比较简单的使用MACD的方法,就是不用MACD Signal,直接把MACD和Zero零线做比较。
从回测结果来看,在震荡较少,趋势比较明显的情况下,MACD的零线量化策略要比金叉量化策略更好:
现在我们取得了1.024的Sharpe(vs 0.99)
如果继续往下做,我会考虑在程序中对MACD进行一些优化,比如不是等待金叉出现,而是根据趋势来预测金叉的出现,在出现前就下单,等等。
个人感觉量化策略作为一个price based strategy还是有一定的辅助作用,也有可以挖掘的地方。可以结合市场的波动率(risk on risk off)和趋势可以选择在一定时间内对技术指标采取动量或者反转的量化策略来捕捉交易信号。
最后我比较好奇07-08股灾的时候这个小量化策略是否能扛得住呢,选择的仍旧是平安银行。我从07年1月运行到了15年1月,略微调整了一点参数,结果如下:
hmm... Not bad. 橙色是我们的量化策略,蓝色是基准(沪深300)。基本上避开了那次谷底的大跌,最后的收益是700%多,但是max drawdown嘛。。。50%有点惨烈,比股灾是好一些还需要继续优化参数等。
MACD的量化策略代码可以在这里找到:RiceQuant - Beta, 复制黏贴进去你的代码编辑器即可运行。(注册一下很快的嘛...)
---------------------Slippage 和 Commission ------------------------
交易费已经考虑进去,其中包含落单对市场的冲击 - Slippage,券商收取的commission,ZF收取的印花税三部分。
Slippage -
- 关于整个回测中的落单对市场的冲击模拟,我们使用了上海交易所的paper 中的effective bid ask spread : 0.246% - http://www.sse.com.cn/researchpublications/workstation/c/station20040901.pdf
- 我们的具体计算方法 - RiceQuant - Beta试试自己的量化策略,他是完全免费的,也在朝实盘交易努力中:
Software is like sex; it's better when it's free. - Linus
最后的最后~~~喜欢量化策略的可以加我的群跟大家多分享一下喔qq群:429907369