MACD是常用的技术指标。广泛应用于股票期货等投资品类中。本文抱着实验的心态,通过MACD被使用最普遍的的方法对该指标在中国商品期货市场的择时效果进行验证。
我们还加入了波动率过滤,和追踪止损模块,希望以此验证指标的有效性,同时在验证过程中对传统方法进行调整,以期获得更好的绩效。
一、MACD简介:
MACD分为三根线,分别是快速线DIF,慢速线DEA,信号线MACD。
计算方法为:
DIF=EMA(〖Price〗_i) - EMA(〖Price〗_j)
DEA= EMA(〖DIF〗_n)
MACD = 2 * (DIF - DEA)
Price:资产价格
i:短周期参数
j:长周期参数
n:DEA周期参数
EMA:指数平均
二、策略使用方法:
使用的是最普遍,也是最简单的MACD方法。即金叉买入,死叉卖出。
对于金叉和死叉的判定,也是众说纷纭。
1、最传统保守的论点是:
金叉,快速线DIF,慢速线DEA同时大于0,且DIF上穿DEA,MACD由负数变为正数;死叉:快速线DIF,慢速线DEA同时小于0,且DIF下穿DEA,MACD由正数变为负数。
2、而另一种观点认为:
并不需要限制DIF和DEA的符号,只需要DIF上下穿DEA就可以判定金叉和死叉
3、还有一种观点,是我最终放出来的这个代码,就是DIF和DEA都大于0时候做多,反之都小于0做空
在我们的模型中,我们最初使用了传统观点,因为无论是实际测试还是从逻辑出发推测,传统观点的严格性都能更好的界定价格突破的真实性。
之后发现,使用改进方法也确实取得了更好的绩效表现。但是做参数变化时,我发现,其实更加有效的模块,是追踪止损。
三、模型参数:
一个好的策略首先就是要保证尽可能维持数据的鲁棒性。因此我们在对策略进行优化的过程,只对MACD中快速线周期,慢速线周期和信号线周期三个参数进行调整,其他条件都保持默认,因此来防止策略得过度拟合。
1、模型多参数下绩效表现:
我们可以看到,经过多组参数的测试。每个参数组都取得了正收益,说明该模型的确具有一定的择时能力。而事实上,表现最差的一组模型我们使用的是13,26,9的MACD原始默认参数。而其他参数组使用的参数周期均更短。因此我们判断,MACD模型对于短期价格突破的预测能力更敏感。
2、模型多参数下最佳组绩效表现:
当参数fastperior=3,slowperiod=7,signalperiod=7时,模型取得了最好的绩效和Sharpe Radio。绩效曲线如下:
四、模型调整
出于进一步探究的目的,我们对策略进行了一些调整,希望能取得更好的效果,各调整方法与有效性分析如下
使用80-20周期波动率过滤方法:
80-20方法即,计算80日到当前每一日的20日波动率,求平均,然后用当前20日波动率和这个平均值做对比,如果当前20日波动率更大,就认为该品种目前波动率过大趋势不明,该品种就不参与交易。
代码表达如下(实测效果并不好):
使用截面波动率过滤方法:
截面波动率过滤方法即,计算全市场所有品种波动率Z分位数的均值,然后用当前品种波动率的Z分位数和这个平均值做对比,如果波动率更大,就认为该品种目前波动率过大趋势不明,该品种就不参与交易。
代码表达如下:
更新后模型的绩效得到了一些提升,上图不是很直观,我们直接使用数据进行绩效比
可以看到绩效在几个参数下都有所所提升。说明截面波动率过滤方法达到了我们希望达到的效果。
下图为截面过滤后MACD策略四种指标柱状图:
鉴于过滤前数据缺失,而且过滤后柱状图并未显示具体数值,观察起来比较困难,我们直接出示绩效对比结论。过滤对于夏普比率的提升,最大回撤的减少并没有显著帮助,但是过滤后的策略绩效得到了提升。说明过滤过滤掉了不容易跟踪趋势的品种,存在一些效果
模型截面波动率过滤后多参数下最佳参数组绩效表现:
最终,当我们想公开这些测试结论的时候,我发现回测中有3个问题:
1、手续费设置较低,所以我们改为万分之1单边手续费 万分之1滑点(在很多品种上,差不多就是1跳),然后重新测试了性能,结果绩效差异不大。
2、某些时刻,截面持仓数量会达到20个品种,此时,对每个品种在ATR头寸部分,分配0.05的资金量,会造成其他品种不够用。
所以,我调整为0.01,要知道海龟交易系统才0.01。所以调整后,收益和回撤,都发生了下降,但是收益风险比、夏普比率这些值,没有变化,因为期货是保证金交易,我们只是用了更少资金,收益和回撤,都会等比例下降。
3、某些波动率太低的品种,常年无法择时获得正收益的品种,没必要去交易,为什么不剔除这些品种呢?就像股票模型的黑名单一样,这里不存在什么幸存者偏差,这些品种从基本面、交割制度、市场博弈层面就是存在问题的,完全可以剔除。
说的就是这几个:
'ZN','SN','BU','A','CF','OI','AP','JM','FG'
看看结果吧: