【策略思想】 在之前发布的ETF轮动策略基础上进行修改,以等权重方式持有符合买入条件的基金(最高同时持有3只基金),没有基金符合要求时空仓。
【策略理论依据】 轮动策略的理论基础是动量效应,也就是处于上涨状态的基金会在一定时间内保持上涨趋势。
【基金组合】 创业板、沪深300、中证500、红利ETF、深红利、上证180和上证50。使用指数或者基金价格计算交易信号,买卖指数跟踪的ETF。也可以调整为直接以基金价格计算交易信号。
【买入条件】(两个条件全部满足才买入)
1、近13个交易日涨幅排名前三(设置涨幅阈值为0.1%),选择最强势的基金;
2、当前价大于13日均线,主要用于过滤假突破信号。
【卖出条件】(两个条件满足一个就卖出)
1、近13个交易日涨幅排名未入前三(先剔除不符合买入条件的基金再排序);
2、近13个交易日涨幅不足0.1%;
3、当前价小于近13个交易日均线。
回测时间:2014.1.1~2019.9.6
针对基金组合为创业板、沪深300、中证500、红利ETF、深红利、上证180和上证50,原版轮动策略的回测结果如下。
下图是同时持有多只基金的回测结果
我们能够看到的最明显变化就是最大回撤有了明显的降低,阿尔法和夏普比率都有明显提升。现在,我们把两个策略的收益曲线放在一起对比一下会更直观。其实主要的区别就体现在灰色区域,因为改进后的轮动策略收益回撤幅度更小(每一小格对应20%的收益点差),所以总体收益的差距也基本与之相符。
这个现象说明了一个问题,就是因为持仓更加分散,趋势跟踪失灵导致的收益回撤风险也因此分散。假设满仓持有单只基金,造成了30个百分点的回撤,那么在持有三只基金的情况下,如果另外两只基金没有出现跟踪失灵,那么这只基金导致的实际回撤就只有10个百分点。当然,凡事皆有两面性,也有可能某一天持有单只基金没有发生回撤,同时持有三只基金发生回撤的情况。大家回头可以*我的代码自行验证。
回测时间:2016.3.4~2019.1.4
这是趋势跟踪最困难的一段行情,震荡行情让趋势跟踪策略频繁失灵,长期落后沪深300指数的基准收益,而且有很长的时间处于负收益状态,这对人性是极大的考验,很容易导致策略执行半途而废。
虽然从收益看,三标的轮动策略也没有高多少,但是心理舒适度高了不少,虽然也是长期跑输指数基准收益,但是负收益的幅度和持续时间都明显减少。
关于策略的一些说明
1、因为这个代码是在之前发布的轮动策略基础版本上演变而来,所以关于代码的一些基本情况,我不再进行解释
2、因为最高可同时持有3只基金,那么我们的基金池就必须进行扩容,扩容的思路对策略的效果影响也是非常大的,大家可以根据自己的投资风格灵活选择,并通过回测进行验证。这里有一点需要说明,因为我们同时持仓的基金最大为3只,策略逻辑发生了很大的变化,各个基金之间的低相关性要求就可以放宽,例如基金池中同时有创业板和创业板50两只基金,这也是没有问题的,这种操作可以理解为刻意让创业板相关指数具有更高的权重。
3、交易信号的计算依据,原版策略是以基金跟踪的指数行情作为依据,这个可以灵活调整为直接以基金价格作为计算依据。后面这种处理方式会带来一个非常便捷的好处,就是可以不用考虑基金的成立时间。假设我们回测的时间是2014.1.1到2019.9.6,但是我们的基金池中有一只2017年才成立的基金,回测过程中无法取得基金价格,那么程序会把这只基金的涨幅和均线偏差都设置为-100,也就是不会执行买入操作。但是回测到基金成立之后的时间,就可以正常计算交易信号了。
代码的第117行: security = row[1] # row[0]以指数计算交易信号,row[1]以基金计算交易信号
3、同时持有标的变多了,那么调仓的逻辑也变得非常复杂。例如之前持仓的基金是1或者2只,现在要变成2只或者3只,那么就需要卖出一定份额,然后买入新增加的基金。如果之前持仓的基金是2只或者3只,现在交易信号要求我们只保留一只,那么卖掉两只基金收回的资金是不是要全部分配给当前持有的基金呢?这是一个值得考虑的问题,经过初步测试之后我决定采用只减仓不增仓的处理方式。因为回测结果表明这样更加有利,我猜测这种情况下,仅剩的持仓基金有很大概率处于趋势末端,从1/3加到全仓,风险大于收益。
4、这个策略能否用于股票?理论上没有问题,参考第3条说明,场内ETF基金和股票都可以通过代码来进行计算和交易,所以策略可以通用。
5、这个策略目前不包含任何硬止损措施,大家可以自行添加。