从策略到指标,以双均线为例
从策略到指标,以双均线为例
本文将详细介绍双均线策略在沪深300指数上的应用和优化过程。从简单的双均线策略开始,逐步加入ATR止损,并最终优化为使用动态止损的策略。通过BackTrader进行参数优化,最终得到一个在沪深300指数上表现优异的交易策略。
在前面的文章中我们已经基于指标实现了量化回测的效果,在主图中会显示买卖点的提示,以及每次多空转换时的收益;在副图中会显示自指定的时间点开始,该策略的收益、回撤。
那么,这种显示效果适用于其它策略吗?当然!
只要能够给出明确的多空规则,什么时候买、什么时候卖、什么时候止盈止损,只要是能给出明确的量化策略,就都可以转换成这种显示效果的指标,从而成为指导你交易的利器。
在这篇文章中,我们将会再次演示策略、指标、交易系统的迭代开发过程。
双均线策略
交易基本上可以分为两大类,趋势交易与波动交易。
趋势交易是一种基于市场趋势方向进行交易的策略,即在市场出现明显的上升或下降趋势时进行交易,讲究的是顺势而为。波动交易则正好相反,在市场没有明显的趋势时,在一定的价格区间内进行交易,讲究的是阻力支撑。
作为趋势交易中最常见的策略,我们就以双均线为例来进行演示。
均线可以被视为一段时间内的平均价格水平,因此,当股价在均线上方时可以被视为上升趋势,否则被视为下降趋势。
进而,如果有两个不同时间周期的均线,则当时间周期较短的均线(快线)上穿时间周期较长的均线(慢线)时,则被视为买入信号,否则被视为卖出信号。
因此,我们就有了最基本的双均线策略:设置快线时间周期为N,设置慢线时间周期为M,当快线上穿慢线时,做多;当快线下穿慢线时,做空。
历史回测
这里我们选取沪深300近十年的日线数据进行回测,快线、慢线的时间周期选择最为常见的20、60。
同时,并不能简单的设置金叉死叉为买入卖出条件,因为对于程序来说,它不能像人眼一样直接识别到之前已经有过金叉,所以当前也可以买入。必须详细分析自己在执行买入时的量化规则,然后转换为程序,它才能够按你的意图去执行。
所以,我们这里初始条件设置为:快线(EMA20)在慢线(EMA60)之上,且快线连续两天上升则做多;快线在慢线之下,且快线连续两天下降则做空。
根据这个规则,对沪深300自2014年1月2号至2024年7月31号期间的交易数据进行回测,就得到了下面的统计结果。
十年间取得了翻倍的效果,但回撤巨大。因此需要结合回撤的时间点与标的走势进行对比分析。
迭代优化
首先我们来看一下沪深300近十年来日线的走势。
可以看到,现有策略出现较大回撤的时间点都与K线中的高点相对应,那么很明显,根据现有的策略条件,要等到死叉之后才会转为做空,自然就会出现较大的回撤。
因此,我们要针对双均线策略明显的滞后性,在原有条件中添加止盈止损。即当相对极值点波动幅度超过N倍的ATR时进行止盈止损。而这个N则需要借助BackTrader的组合回测功能进行查找。
通过回测,找到快慢线分别为20、60时的最佳止损参数为N为4.5。因此修改原来的交易规则为:
快线(EMA20)在慢线(EMA60)之上,且快线连续两天上升则做多;快线在慢线之下,且快线连续两天下降则做空。
做多时,如果当前股价相比高点已经回撤了4.5倍的ATR则平仓。
做空时,如果当前股价相比低点已经反弹了4.5倍的ATR则平仓。
可以看到,在 2015 ~ 2017 期间的回撤已经减小,但在2020年的回撤依然比较突兀。所以我们把这段时间的交易日志打印出来观察一下。
可以看到,总资产从2019年5月的近230万降到了2020年4月的170万,七次交易亏了60万!
所以,非常有必要结合K线看一下目前的策略是否还有改进空间。
将上面的策略条件修改为指标代码后来观察一下2019年5月到2020年4月的几次交易。
可以看到,在这个时间段两条均线反复交叉,而且几次暴涨暴跌,是产生亏损的主要原因。尤其是2019年8月27号在3800点做多,之后高点达到了4200点,但因为始终采用4.5倍的ATR止损,正好赶上了2020年初那个众所周知的事件,导致了巨大的回撤。
所以,可以想到的两个改进点:修改快线慢线的时间周期、调整止盈止损的阈值。但应该如何修改呢,还得继续借助BackTrader来寻找更好的参数。
从收益前20名可以看到,不论如何调整参数,收益基本稳定在一个区间范围了。但对于这些参数,有的可能是过拟合的结果,因此还是需要做一下甄别。
一个最简单的方法,就是看在是否出现了聚集现象,因为如果是过拟合,仅仅是对参数进行微调,都会对收益造成重大影响。
显而易见,长期均线的参数110出现的次数最多,因此我们再做一下筛选。
这里面短期均线的参数30出现的次数最多,ATR的阈值又集中在3左右,因此我们使用快线-EMA30、慢线-EMA110、止损-3倍ATR。
累积收益增加了10个点,最大回撤减小了5个点,年化收益率、夏普比率、索提诺比率都有提升,效果非常明显!
技术指标
假设我们对目前取得的效果还算比较满意,那么就可以根据上面的策略来开发对应的技术指标了。
对比上面通过回测程序跑出来的收益、回撤曲线,以及通过指标实现的收益、回撤曲线,可以看到,两者几乎完全一致。只不过在BackTrader中会考虑尽量模拟真实的交易,而技术指标更偏重于在关键时间节点上提示交易信号,所以两者略有差异。
再接再厉
从上面的图形中我们还是留有遗憾,对于2020年年初的巨大波动还是无能为力。可以想到的一种方案是采用动态的ATR止损,以及添加另外一条均线作为趋势过滤器。但是显然这样就把策略搞的有点复杂了,也不利于技术指标的改造。
那么,有什么简单的办法吗?
通过观察沪深300近10年的K线走势,可以看到一个显著的特点:下跌的时候特别迅速。因此,如果使用N倍的ATR止损,就会导致在短时间内利润大幅回吐,甚至会将很长一段时间积累的利润全部吞噬。
因此,我们考虑将基于ATR止损修改为基于最高价、最低价的均线来进行止损。没错,也就是梯子哥在主图上使用的NX指标。因此,我们将交易规则修改为:
快线在慢线之上,且快线连续两天上升则做多;快线在慢线之下,且快线连续两天下降则做空。
做多时,如果当前股价跌破了最低价的均线(MA(L, N))则平仓。
做空时,如果当前股价升破了最高价的均线(MA(H, N))则平仓。
我们仍然使用上面迭代改进过程中使用的方法,基于BackTrader来寻找快线、慢线、极值均线这三条线的最佳参数组合。
对回测结果按收益排序后,仍然按照是否出现聚集现象来避免过拟合,最终选择的参数组合为快线-EMA30、慢线-EMA110、极值均线-EMA28。
可以看到,快慢线的时间周期与原来相同,仅仅是把原来的3倍ATR止损换成了按照极值的EMA28止损。
累积收益一下增加了50个点!最大回撤减小了10个点!年化收益率突破了10%!夏普比率、索提诺比率继续提升,Perfect!
最后,我们再把技术指标的规则也做同样的修改。
如此,就可以使用此指标作为在$沪深300(SH000300)$上使用双均线交易策略的一个参考。