史上最赚钱的策略之一?Dual Thrust策略的原理、回测、优化与指标

发布于: 雪球转发:0回复:0喜欢:0

最近写了太多技术指标相关的内容,也该回归一下量化交易策略的研究了。在接下来的几篇文章中,我们会挑选几个著名的量化交易策略,先介绍一下它们的原理,然后会基于 BackTrader 进行回测,并根据回测结果进行一些初步的优化。

最后,作为本公众号的一个特色,考虑到大多数人并没有技术背景,并不能直接上手量化交易,因此我们还会根据策略原理,将其改写为技术指标,以方便大家使用。

那么,在这篇文章中,我们就先来看下大名鼎鼎的 Dual Thrust 策略。

策略原理

在上篇文章中,我们曾经提到趋势跟随策略。市场有它的惯性,趋势一旦形成,就会持续较长的时间。因此,这是一种非常常用的交易策略。

而 Dual Thrust 策略就是这样一种趋势跟随的交易策略,适用于日内交易。它由 Michael Chalek 在 1980 年代开发,曾被《Future Truth》杂志评为最赚钱的策略之一。该策略因其简单易用、适用范围广而受到欢迎,并已被证明可以为投资者带来长期稳定的收益。

从图中我们可以看到,这个策略有点像布林轨道,它的核心思想也是利用价格波动区间进行交易,但布林线的上下轨一般视为阻力支撑,而这里是通过突破上下轨时入场交易来获取盈利。

具体来说,该策略首先计算前 N 天最高的最高价、最高的收盘价、最低的收盘价、最低的最低价,然后计算最高的最高价与最低的收盘价的差值,以及最高的收盘价与最低的最低价的差值,然后取这两个差值的最大值作为区间值,再乘以不同的系数 K 得到上下轨的触发值。在开盘后,当价格超过上轨(开盘价 + 触发值)时买入,或者当价格低于下轨(开盘价 - 触发值)时卖出。

另外这个策略并没有止损,如果发出买入信号时持有一手空单,则平仓一手空单并买入一手多单,相当于买入两手多单;如果发出卖出信号时持有一手多单,则平仓一手多单并卖出一手空单,相当于卖出两手空单。

量化回测

因为在优化策略的过程中要经过多次调试和回测,没有足够的积分在类似聚宽这种平台上是消耗不起的。所以,我们的回测一律基于开源框架 BackTrader 在本地进行回测。

在之前的文章中已经对 BackTrader 做过了介绍,这里不再赘述。我们直接来看下代码的实现。

这个策略的一个关键点是要根据前 N 天的交易数据计算得到上下轨,因此我们可以使用 BackTrader 的自定义指标功能,实现一个 DT 指标,自动计算得到上下轨数据。这样在分钟级别的K线进行回测时直接基于 resampledata 得到日K线数据,然后获取到 DT 指标数据,即可以此进行交易策略的编写。

当然,作为一个量化交易框架,为了减少代码冗余,BackTrader 的源码大量使用了元编程技术,因此使其代码看上去晦涩难懂。Python 的元编程是另外一个话题,在这里没有必要展开,如果对以上自定义指标的代码觉得难以理解,其实我们还可以有更简单更容易理解的实现方式。

想像一下人工交易的过程:每日开盘后,利用前 N 天的数据计算得到上下轨,然后开始监测当前股价是否取得突破。因此,如果没有自定义指标,我们只需要在每天开盘后重新计算得到最新的上下轨即可。

最后再来看一下交易逻辑的实现。突破上轨时,如果没有持仓则直接买入,如果有空单则先平再买;突破下轨时,如果没有持仓则直接卖出,如果有多单则先平再卖。

有了以上两个核心逻辑的实现,再设置一下策略的三个参数 N、K1、K2,比如 5、0.5、0.5,就可以开始回测了。

在A股市场我们知道,波动最大且支持衍生品的是中证1000,那么这里我们就以中证1000为例,初始资金100万,每次都全仓买入卖出,使用2023年5月到2024年4月这一年时间的5分钟级别K线数据做一下简单的回测。

从图中可以看到,一年时间,只获得了3个点的收益,史上最赚钱的策略之一?看上去有点惨不忍睹。。。。。。

那么接下来,我们就要分析一下,到底是这个策略名不副实,还是有什么地方出了问题。

优化改进

仔细看一下上图,虽然最终只有3个点的收益,但最大回撤达到了18个点,也就是说,最大收益可能曾经达到过21个点。那么我们可以把整个回测周期的收益与回撤画出来,看看到底是哪儿出了问题。

很明显,在2月份收益率快速达到峰值后又快速回落。那么,2月份发生了啥呢?显然,2月份雪球爆仓,之后国家队救市,这种极致的反转将趋势跟随策略的缺点-滞后性,展现的淋漓尽致。

所以,接下来我们就尝试针对它的缺点进行优化和改进。

收盘清仓

首先,最简单的一种止损方式:日内收盘前直接清仓。

我们对比一下添加这个交易逻辑后对整体收益的影响。

得得得,之前还有3个点的收益,添加上日内收盘清仓后,反而亏损了9个点。。。。。。

跟踪止损

看来,想省事是不可能了,还是按照标准流程来吧,我们给它添加一个跟踪止损的处理逻辑。

跟踪止损的一个可行方案是根据 ATR 进行止损。我们仿照这个策略的处理逻辑,为做多和做空设置不同的止损系数 X1、X2,即做多时从最高价下跌了 X1 倍的 ATR 或做空时从最低价反弹 X2 倍的 ATR 时进行止损。

看上去这个止损策略设置的很合理吧,我们来看下实际的效果。考虑到中证1000的波动比较大,就先设成 3 倍的 ATR 止损好了。

哇哦!见鬼!还是亏损!

虽然相比日内清盘的方式,亏损减少了三个点,但是要知道,啥止损都没加的时候到最后可是还有三个点的收益呢。

参数调优

没办法了,只能借助 BackTrader 提供的参数组合方式进行回测了,看一下到底有没有最佳的止损参数。

我们设置 X1、X2 分别从 2 到 9 进行组合测试,对这 64 个组合的收益率进行排序,看看最好的结果是怎样一个组合。

完犊子!即使是最佳组合仍然是亏损!

这个时候我们再回顾一下这个策略的原理。

另外这个策略并没有止损,如果发出买入信号时持有一手空单,则平仓一手空单并买入一手多单,相当于买入两手多单;如果发出卖出信号时持有一手多单,则平仓一手多单并卖出一手空单,相当于卖出两手空单。

由此可见,这个策略确实可以先不用考虑止损的问题。忙活了半天,得到了一个这样的结论。

但是,“排除一切不可能的,剩下的即使再不可能,那也是真相”。既然通过止损不可能提高收益率,那么剩下的就只是策略自身的三个参数了。

如图所示,我们设置 N、K1、K2 分别从 2 到 9、0.1 到 0.9 共 648 种参数组合进行回测,然后对收益率进行排序,看看这次的效果如何。

Bingo!!!

排名前十的参数组合收益全都超过了 60 万 !而且排名第一的参数组合创造了 86 万 的收益!这不

是过拟合了吧?

我们来看下这个参数组合的收益与回撤的走势图。

最大回撤仅有 6 个点,而且在 2 月份行情大逆转后,回撤并没有扩大,收益率还继续攀升!Perfect!

效果展示

在使用上面的优化改进之后,我们再来看一下最终的策略评估报告。

技术指标

最后,根据 Dual Thrust 策略的原理,我们还实现了兼容富途、老虎、通达信、同花顺的技术指标。

未完待续

考虑到文章的篇幅,在下一篇中我们将会继续分析剩下的几个问题。

目前取得最佳收益率的参数组合,如果换成其它的股票,还能保持这样的收益率和回撤吗?

如果不能,为什么在中证1000上是 N=2、K1=0.3、K2=0.1 这样一个参数组合能取得最佳收益?

能不能找到一个参数组合,使其在所有股票上都能取得不错的收益和回撤?

能不能基于这个策略来指导衍生品的交易,以获取更大的收益?

敬请期待!