资源加载中... loading...

RangeBreak策略与波动率相结合的实战应用

Author: 扫地僧, Date: 2021-10-26 17:20:40
Tags: 商品期货趋势My语言突破

RangeBreak策略简介

RangeBreak策略最初来源于期货和外汇交易,属于日内突破策略的一种。在《Futures Truth Magazine》(美国权威交易系统评选杂志)中曾经连续多年排名前十。无论是专业的投资机构还是个人交易者都在广泛使用。

但是,如果一个交易策略被大众广为所知,那么这个交易策略在实战中的应用就会大打折扣。所以,这篇文章的目的,不是介绍RangeBreak策略让大家生搬硬套,而是通过对RangeBreak策略的学习,让大家从一个盈利的交易系统中融会贯通,提高交易的能力。

RangeBreak策略的计算方法

最初的RangeBreak策略是当日的开盘价和昨日的价格波动幅度,来决定今日的多空方向。当日的开盘价加上昨日的价格波动幅度形成上轨,当日开盘价减去昨日的价格波动幅度形成下轨。如果价格升破上轨就进场做多,如果价格跌破下轨就进场做空。没有止盈止损,临近收盘平仓。具体计算公式:

  • 上轨 = 当日开盘价 + ( 昨日最高价 - 昨日最低价 ) x N
  • 下轨 = 当日开盘价 - ( 昨日最高价 - 昨日最低价 ) x N
  • 价格升破上轨,多头开仓
  • 价格跌破下轨,空头开仓
  • 临近收盘,全部平仓

细心的朋友可能会发现,在计算上轨和下轨时加入了一个变量N,可能会有人问为什么要在昨日价格波动幅度乘以N呢,这个N到底代表什么含义。其实这里的变量N并没有特别的含义,之所以在这个地方加入一个变量N,只不是交易者可以根据具体的交易品种或者个人的主观经验来灵活调整上轨和下轨的距离,变量N的参数范围可以是0.1~1.5。

RangeBreak策略源码

依次打开:youquant.com > 登录 > 控制中心 > 策略库 > 新建策略,在策略编辑界面的左上角,点击下拉框选择编程语言为:My语言,开始编写策略。注意看下面代码中的注释。

Q:=BARSLAST(DATE<>REF(DATE,1))+1;  // 判断是不是新一天的K线
DIFF:=REF(HHV(HIGH,Q),Q)-REF(LLV(LOW,Q),Q);  // 昨日最高价与最低价的价格差
OO:VALUEWHEN(Q=1,OPEN);  // 当天开盘价
UP:OO+DIFF*N;  // 上轨
DOWN:OO-DIFF*N;  // 下轨
TIME>=0905&&TIME<1455&&CLOSE>UP,BK;  // 多头开仓
TIME>=0905&&TIME<1455&&CLOSE<DOWN,SK;  // 空头开仓
TIME>=1455,CLOSEOUT;  // 收盘平仓
AUTOFILTER;  // 信号过滤

RangeBreak策略回测

为了更接近真实的交易环境,我们在回测时采用开平仓各2跳以及2倍的手续费来压力测试,测试环境如下:

  • 行情品种:动力煤指数
  • 交易品种:动力煤主力
  • 时间:2015年06月01日~2019年06月28日
  • 周期:日线
  • 滑点:开平仓各2跳
  • 手续费:交易所2倍

资金曲线 img

从上面的回测结果看,策略在市场行情走势流畅的时候表现很好,无论是在上涨或下跌中,阿隆指标可以完整的跟踪到行情。资金曲线也整体走势向上,并没有出现较大幅度的回撤。但是在震荡行情中,特别是连续的震荡行情中,出现了局部回撤。

RangeBreak策略的改进

如上图所示,原版RangeBreak策略即便在市场趋势明显的时候,效果也不尽人意,特别是在市场处于震荡状态时,资金曲线波动较大,当市场处于长期震荡时,出现了较大回撤。我们知道RangeBreak属于趋势型策略,同样也有趋势策略的软肋。

需要特别注意的是,原版策略在计算昨日的波动幅度时,只是用简单的昨日的最高价减去昨日的最低价。但是在计算价格波动幅度的时候,可以利用ATR指标,因为ATR代表的是价格的平均真实波动率,比如在海龟交易法则中就用到了ATR。

另外,国内商品期货的价格走势往往上涨的时候比较缓慢,下跌的时候跌得比较急,所以我们可以在计算上轨和下轨的时候,可以分别用N1和N2,这样可以使策略更加灵活的应对不同的市场环境。

总结

正如RangeBreak策略的设计理念一样,从来不去预测市场终究是上涨下跌还是震荡,只要当天的价格突破上下轨,就预示着当天市场价格走势的方向,交易者只需要跟随信号顺势而为即可。当然你还可以根据自己的交易习惯或者市场特性加以改进,升级迭代这个交易策略。


(*backtest
start: 2015-02-22 00:00:00
end: 2019-07-13 00:00:00
period: 5m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
args: [["RunMode",1,126961],["SlideTick",0,126961],["ContractType","ZC888",126961]]
*)

Q:=BARSLAST(DATE<>REF(DATE,1))+1;  // 判断是不是新一天的K线
DIFF:=REF(HHV(HIGH,Q),Q)-REF(LLV(LOW,Q),Q);  // 昨日最高价与最低价的价格差
OO:=VALUEWHEN(Q=1,OPEN);  // 当天开盘价
UP^^OO+DIFF*N;  // 上轨
DOWN^^OO-DIFF*N;  // 下轨
TIME>=0905&&TIME<1455&&CLOSE>UP,BK;  // 多头开仓
TIME>=0905&&TIME<1455&&CLOSE<DOWN,SK;  // 空头开仓
TIME>=1455,CLOSEOUT;  // 收盘平仓
AUTOFILTER;  // 信号过滤
template: strategy.tpl:40:21: executing "strategy.tpl" at <.api.GetStrategyListByName>: wrong number of args for GetStrategyListByName: want 7 got 6