转自:https://blog.csdn.net/xmuecor/article/details/78542320
本文将向大家介绍四种常见的CTA策略(Dual Thrust、R-Breaker、菲阿里四价、空中花园),实现各策略并以Dual Thrust为例进行参数优化及止盈止损分析对比。
Dual Thrust策略是一种趋势跟踪系统,属于日内交易策略。该策略由Michael Chalek 在20世纪80年代开发,曾被Future Thruth杂志评为最赚钱的策略之一。Dual Thrust系统具有简单易用和适用度广的特点,其思路简单且参数少,配合不同的参数、止盈止损和仓位管理可以为投资者带来长期稳定的收益。而且该策略适用品种较多,被投资者广泛应用于股票、货币、贵金属、债券、能源及股指期货市场等。在Dual Thrust交易系统中,对于震荡区间的定义非常关键,这也是该交易系统的核心。
Dual Thrust在Range的设置上,引入前N日的四个价位,Range = Max(HH-LC,HC-LL)来描述震荡区间的大小。
其中HH 是N日High的最高价,LC是N日Close的最低价,HC是N日Close的最高价,LL是N日Low的最低价。这种方法使得一定时期内的Range相对稳定,可以适用于日间的趋势跟踪。Dual Thrust对于多头和空头的触发条件,考虑了非对称的幅度,做多和做空参考的Range可以选择不同的周期数,也可以通过参数K1和K2来确定。具体分为两步来实现:
第一步:计算相关参数,得到上轨Buyline 和下轨Sellline:
N日High的最高价HH, N日Close的最低价LC
N日Close的最高价HC,N日Low的最低价LL
Range = Max(HH-LC,HC-LL)
BuyLine = Open + K1*Range
SellLine = Open - K2*Range
第二步:交易逻辑:
当价格向上突破上轨时,如果当时持有空仓,则先平仓,再开多仓;如果没有仓位,则直接开多仓;
当价格向下突破下轨时,如果当时持有多仓,则先平仓,再开空仓;如果没有仓位,则直接开空仓;
当K1时,多头相对容易被触发,当K1>K2时,空头相对容易被触发。因此,投资者在使用该策略时,一方面可以参考历史数据测试的最优参数,另一方面,则可以根据自己对后势的判断,或从其他大周期的技术指标入手,阶段性地动态调整K1和K2的值。
R-Breaker 是一种短线日内交易策略,它结合了趋势和反转两种交易方式。该策略也长期被Future Thruth 杂志评为最赚钱的策略之一,尤其在标普500股指期货上效果最佳。该策略的主要特点如下:
第一、根据前一个交易日的收盘价、最高价和最低价数据通过一定方式计算出六个价位,从大到小依次为突破买入价、观察卖出价、反转卖出价、反转买入价、观察买入价和突破卖出价,以此来形成当前交易日盘中交易的触发条件。通过对计算方式的调整,可以调节六个价格间的距离,进一步改变触发条件。
第二、根据盘中价格走势,实时判断触发条件,具体条件如下:
1) 当日内最高价超过观察卖出价后,盘中价格出现回落,且进一步跌破反转卖出价构成的支撑线时,采取反转策略,即在该点位(反手、开仓)做空;
2) 当日内最低价低于观察买入价后,盘中价格出现反弹,且进一步超过反转买入价构成的阻力线时,采取反转策略,即在该点位(反手、开仓)做多;
3) 在空仓的情况下,如果盘中价格超过突破买入价,则采取趋势策略,即在该点位开仓做多;
4) 在空仓的情况下,如果盘中价格跌破突破卖出价,则采取趋势策略,即在该点位开仓做空。
第三、设定止损以及止盈条件;
第四、设定过滤条件;
第五、在每日收盘前,对所持合约进行平仓。
具体来看,这六个价位形成的阻力和支撑位计算过程如下:
观察卖出价 = High + 0.35 * (Close Low)
观察买入价 = Low 0.35 * (High Close)
反转卖出价 = 1.07 / 2 * (High + Low) 0.07 * Low
反转买入价 = 1.07 / 2 * (High + Low) 0.07 * High
突破买入价 = 观察卖出价 + 0.25 * (观察卖出价 观察买入价)
突破卖出价 = 观察买入价 0.25 * (观察卖出价 观察买入价)
其中,High、Close、Low 分别为昨日最高价、昨日收盘价和昨日最低价。这六个价位从大到小一次是,突破买入价、观察卖出价、反转卖出价、反转买入价、观察买入价和突破卖出价。
菲阿里四价策略是一种比较简单的趋势型日内交易策略。昨天高点、昨天低点、昨日收盘价、今天开盘价,可并称为菲阿里四价。它由日本期货冠军菲阿里实盘采用的主要突破交易参照系。菲阿里四价是日内突破策略,所以每日收盘之前都需要进行平仓。该策略的上下轨以及用法如下所示:
上轨=昨日高点;
下轨=昨日低点;
昨日高点和昨日低点可以视为近期的一个波动范围,该范围的存在一定程度是一种压力线,只有足够的价格上涨或者下跌才会突破前期的高点或者低点。因此突破位臵是一个比较好的入场信号,如果突破该波动范围,则证明动能较大,后续走势强度维持较强的概率比较高,因此该策略采用以下开仓方式:
当价格突破上轨,买入开仓;
当价格跌穿下轨,卖出开仓。
策略在开仓之后可能面临假突破的问题,因为该价位存在很大的阻力,可能是暂时性的突破,随机回落,因此具体策略使用之中可以设臵一些过滤条件来剔除假突破的情况。这样使得策略的胜率变大。开仓之后的止损止盈根据具体环境具体确定。
空中花园属于日内突破策略。与之前的策略有所不同,空中花园比较看重开盘突破。开盘时的高开或者低开均说明有大的利好或者利空使得开盘大幅远离昨天的收盘价。开盘突破,是最快的一种入场方式。当然出错的概率也最高。因此为了提高策略的胜率,空中花园策略加了额外的条件,也就是开盘要大幅高开或者低开,形成一个空窗,因此顾名思义称为空中花园,然后再根据是否突破上下轨来进行开仓判断。这样一来,策略的胜率将大大提高,不过由于对高开或者低开的幅度要求过高,一般是超过1%,因此使得策略的交易次数可能相对其它策略而言要偏低一些。开盘第一根K线是收阳还是收阴,是判断日内趋势可能运动方向的标准。在当天开盘高开或低开时更有效。空中花园策略主要特点:
日内交易策略,当日收盘平仓;空中花园在当天高开或低开时使用,即当开盘价>=昨天收盘价*1.01 或开盘价<=昨天收盘价*0.99 时:
上轨=第一根K线的最高价;
下轨=第一根K线的最低价;
当价格突破上轨,买入开仓;
当价格跌穿下轨,卖出开仓。
我们可以通过优矿DataAPI获得上期所、大商所、郑商所从2003 年以来所有上市的商品期货的不同月份合约的1 分钟行情数据,包含了open、high、low、close、volume、oi(开盘价、最高价、最低价、收盘价、成交量、持仓量)共6 种价格信息。但对于不同的期货品种来说,受市场关注度高、交易活跃的合约往往只有一个或者两个,因此在进行CTA 回测之前我们便需要对所有品种所有的月份合约都选择出来,筛选出属于不同品种的主力合约来进行CTA 日内交易策略的回测。
一般情况下,主力合约的受关注度、成交量或持仓量较高,受交易品种的生产周期特性、交易者的交易习惯等几个方面所决定。本文回测所使用的主力合约是系统按照持仓量来进行计算的,一般只需在universe中进行设置即可。
本文这里直接均采用优矿期货回测平台,使用方法可以参考期货策略API文档。
我们在前文当中已经对Dual Thrust 策略进行了简单的介绍。在Dual Thrust 系统中有两个主要参数k1、k2,是昨日波动幅度的倍数,分别决定了上轨线和下轨线与当日开盘价的差距,显然地,如果k1、k2增大时,上下轨线的距离也会变大,直至很难再有触发生成信号的条件。而这种策略实际抓取的是上轨和下轨之外的趋势部分的收益,所以反之如果上轨和下轨之间的距离非常小,就会降低潜在的趋势性收益反而提高了交易次数和交易成本。因为每一次的平仓反转做多或做空实际就意味着该笔交易的收益为负,所以尤其对于震荡型行情来说,就会使得整体的收益表现变差。
正因为k1和k2的不同大小而使得上下轨线的位置也产生变化,触发产生信号的时间和价格也因此不同,而不同的期货品种所适合的参数也表现不一。为了体现出Dual Thrust 策略的历史表现,我们以全样本数据集进行样本内测试。
年化收益:
最大回撤:
夏普:
热力图:
前文提到了如果市场处于平稳的震荡整理行情时或者Dual Thrust的两个参数值都较小的时候,就会容易多次触发产生开平仓的信号,反而获取不到轨线之外的趋势收益部分,这时Dual Thrust的表现就变得很差。所以,我们就应该在每日回测时先对近期市场行情波动进行一次考察,如果市场波动过小,表明市场近期没有较明显的行情,而是处于震荡整理的态势,那么我们就越过当天不再进行任何操作;如果市场近期波动较大,而实证研究告诉我们金融市场具有波动率簇集的程式化事实特征,即表明大波动行情后面常常也会跟随较大的波动,所以这时我们应选择抓住这样由波动性带来的风险收益。
如何量化近期市场波动呢?ATR(平均真实波动幅度)便是这样一种可以衡量市场波动情况的指标。需要注意的是,ATR并不能反映行情的趋势程度或者趋势持续状态,而只能对市场行情的波动性有所反映,不管是上涨区间还是下跌区间。如果我们采用ATR指标来对回测时的交易行为进行过滤的话,那么该指标是否真实有效呢?
这里把ATR的触发条件设为5,当过去20期ATR值超过5时,才能进行下一步的操作。
回测结果如下:
从结果来看没有太多变化。
至此,我们都暂未考虑止盈止损对策略回测结果的影响。尽管在某些参数组合中,最大回撤率被控制得很好,但仍然无法避免在某些时期连续的大幅度回撤。所以,考虑加入止盈止损方法对该策略进一步优化。
在未进行止盈止损优化之前,原始的日内交易策略所采用的其实是持有至收盘(收盘前10-15分钟平仓)的方式,但这种出市的方式的弊端就是不能锁住潜在的高收益,也使得亏损的机会增加。而良好的主动出市策略,不仅能锁住利益,而且也能及时有效地减少损失,即真正地做到赢大亏小。与研报不同,我设置的止盈方法是固定比例的止盈,即当当前的价格超过开仓价格一定比例后进行相应的止盈止损。仍以螺纹钢为例,在之前所得的“最优”参数组合的条件下,在进行止盈止损的条件下进行回测,这次我把回测时间延长至2015年6月1日。
把未止盈止损与ATR+止盈止损优化的策略进行对比分析
未优化:年化收益: 0.2403 ; 最大回撤: 0.0628 ; 夏普比率: 1.8462
优化后: 年化收益: 0.2317 ; 最大回撤: 0.0402 ; 夏普比率: 1.9403
可以看到,进行ATR+止盈止损优化后,虽然年化收益有轻微的减少,但是却降低了回撤,提高了夏普比率,所以整体来看还是具有一定的有效性。
沪铜
未优化:年化收益: 0.5752 ; 最大回撤: 0.0997 ; 夏普比率: 3.0238
优化后: 年化收益: 0.4971 ; 最大回撤: 0.0766 ; 夏普比率: 2.3992
焦炭
未优化:年化收益: 0.0886 ; 最大回撤: 0.1915 ; 夏普比率: 0.2584
优化后: 年化收益: 0.0888 ; 最大回撤: 0.0914 ; 夏普比率: 0.3639
焦炭今年行情这么好,Dual Thrust居然赚不到钱,也有可能是代码不对!但从结果看来这个策略并不是对所有品种都有效,难道是螺纹钢的最优参数却不是其他品种最优的参数,有品种差异?
思想就是用前一期最优的参数来代入当前期的策略中,不断的向前推进,日后有时间在实现。
R-Breaker策略与Dual Thrust最大的不同在于它除了趋势交易外,还有反转操作。这种策略根据前一个交易日的最高价、最低价和收盘价通过一定的计算方式得到6个不同的价位,模拟出了价格运动的支撑位、阻力位。R-Breaker策略明确给出了在趋势建立的时候的开仓条件,以及当趋势恶化、行情不利的时候的反转操作的条件。
表现如下:
在塑料主力上表现很差。
菲阿里四价策略本身也是一个趋势突破型的策略,但是策略的突破买入卖出条件更加简单。该策略以昨日行情最高价为今日日内交易的上轨,昨日行情最低价为下轨。如果价格突破上轨,便买入开仓,如果突破下轨,便卖出开仓。显然,这种判断趋势是否存在的条件过于简单,在市场波动剧烈的情况下不是十分有效,回测结果也表明了这点。本文简单的测试了螺纹,糊涂,塑料,橡胶这四个主力期货合约,回测时间从2010年1月1日开始。
表现如下:
沪铜主力在三个策略上表现都还不错。
空中花园本身就已经包含了一定的过滤条件,它只考虑当天开盘的位置是否大幅度的跳空,即高开或低开昨日收盘的1%,所以该策略十分注重在非交易时间段内消息的累积对今天走势的影响。但是,可能正如研报所说的,往往很多情况下市场对消息的反馈会产生相反的效果,从而使得策略表现不好。
回测结果如下:
组合测试
之前曾写过一个单策略多品种的,这次改成多策略多品种的,我也没比较两个序列的相关性而是直接组合,权当提供一种思路。
回测结果如下:
文章来源:微信公众号优矿量化实验室