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

恒温器 Thermostat 择时策略研究

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

潮汐指数

趋势行情不会永远持续下去,事实上市场大部分时间都处于震荡行情,所以才会有人希望能得到一种交易策略,既可以用在趋势行情,也可以用在震荡行情。恒温器 Thermostat 交易策略,就是这种设计理念,在趋势行情中采用趋势策略,在震荡行情中采用震荡策略。这有点像汽车换挡,而决定换挡时机的因素,则是以潮汐指数(Choppy Market Index,简称CMI)为评判标准。

CMI 计算公式

收盘价减去29日前的收盘价的绝对值,然后,除以30日内的最高价减去30日内的最低价。

CMI:=ABS(C-REF(C,29))/(HHV(H,30)-LLV(L,30))*100;

一般来说 CMI 的值在0~100区间,值越大,趋势越强。当 CMI 的值小于20时,策略认为市场处于震荡模式;当 CMI 的值大于等于20时,策略认为市场处于趋势模式。整个策略架构,可以简化的写成下面这样:

  • 如果 CMI < 20,执行震荡策略;
  • 如果 CMI ≥ 20,执行趋势策略;

架构就是这么简单,剩下的就是把震荡策略的内容和趋势策略的内容,填充到这个框架里面。

震荡策略内容

img

在震荡市场中,通常存在一种现象:如果今天价格上涨的话,那么明天的价格下跌的概率更大。而今天价格如果下跌的话,那么明天的价格上涨的概率更大,而这也正是震荡市场的特性。

// 关键价格:

KOD:=(H+L+C)/3;

所以这里首先定义一个关键价格(最高价+最低价+收盘价的平均值)。如果当前价格大于关键价格,那么明天应该震荡看空。相反的,如果当前价格小于关键价格,那么明天应该震荡看多。

BE:=IFELSE(C>KOD,1,0);
SE:=IFELSE(C<=KOD,1,0);

在震荡行情中看多,只代表价格上涨的概率更大一些,并不是指价格一定就会上涨。所以把做多的阈值设置的比较低一点,把做空的阈值设置的比较高一点。

震荡看多进场:

  • 做多:最新价>max(开盘价+0.5*10日ATR,3日平均低价)
  • 做空:最新价≤min(开盘价-0.75*10日ATR,3日平均高价)

在震荡行情中看空,只代表价格下跌的概率更大一些,并不是指价格一定就会下跌。所以把做空的阈值设置的比较低一点,把做多的阈值设置的比较高一点。

震荡看空进场:

  • 做多:最新价>max(开盘价+0.75*10日ATR,3日最低价)
  • 做空:最新价≤min(开盘价-0.5*10日ATR,3日最高价)
// 定义10日ATR指标
TR:=MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
ATR10:=MA(TR,10);

另外为了防止假突破,导致策略来回止损,因此加入了一个最高价与最低价3日均线滤网来避免这种情形。

// 定义最高价与最低价3日均线
AVG3HI:=MA(H,3);
AVG3LO:=MA(L,3);

最后计算出震荡市的进场价格:

LEP:=IFELSE(C>KOD,O+ATR10*0.5,O+ATR10*0.75);
SEP:=IFELSE(C>KOD,O-ATR10*0.75,O-ATR10*0.5);
LEP1:=MAX(LEP,AVG3LO);
SEP1:=MIN(SEP,AVG3HI);

震荡行情平仓条件:

  • 当最新价大于最高价的3日均线时,平多;
  • 当最新价小于最低价的3日均线时,平空;

趋势策略内容

img

当 CMI 值大于等于20,即市场处于趋势模式,该策略系统在趋势模式下运用布林通道策略。首先定义布林通道:

  • 布林中轨为50日收盘价均线
  • 上轨是中轨+2倍的50日收盘价标准差
  • 下轨是中轨-2倍的 50日收盘价标准差
MA50:=MA(C,50);
UPBAND:=MA(C,50)+STD(C,50)*2;
DNBAND:=MA(C,50)-STD(C,50)*2;

趋势策略中的开仓逻辑:

  • 做多:最新价突破布林上轨
  • 做空:最新价跌破布林下轨

需要注意的是,因为震荡模式的出场是以3日高低均价为准。但是把这个标准放在趋势模式下就不合时宜了。因此,此时的平仓方式是以当前价格与布林中轨的位置关系来判断。

趋势行情平仓条件:

  • 平多:当最新价小于布林中轨
  • 平空:当最新价大于布林中轨

策略回测

为了将回测结果尽量接近实盘交易,这里把手续费设置为交易所的2倍,开仓和平仓各加2跳的滑点,回测的数据品种为螺纹钢指数,交易品种为螺纹钢主力连续。固定1手开仓。以下是在1小时级别的初步回测绩效报告。

img

img

img

从资金曲线和数据来看,该策略表现良好,在螺纹钢品种回测中,除了2017年下半年有较大回撤外,整体资金曲线是稳步向上的。综上,恒温器策略的自动调节交易方式,为大家应对震荡行情提供了一定的思路。感兴趣的读者,可以根据自己的理解适当修改,做进一步的深入研究。


// 回测配置 
(*backtest
start: 2011-01-01 09:00:00
end: 2019-01-01 15:00:00
period: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES","minfee":0,"fee":[0,0]}]
args: [["SlideTick",0,126961],["ContractType","rb000",126961]]
*)

// 计算CMI指标用以区分震荡市与趋势市
CMI:=ABS(C-REF(C,29))/(HHV(H,30)-LLV(L,30))*100;

// 定义关键价格
KOD:=(H+L+C)/3;

// 震荡市中收盘价大于关键价格为宜卖市,否则为宜买市
BE:=IFELSE(C>KOD,1,0);
SE:=IFELSE(C<=KOD,1,0);

// 定义10日 ATR 指标
TR:=MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
ATR10:=MA(TR,10);

// 定义最高价与最低价3日均线
AVG3HI:=MA(H,3);
AVG3LO:=MA(L,3);

// 计算震荡市的进场价格
LEP:=IFELSE(C>KOD,O+ATR10*0.5,O+ATR10*0.75);
SEP:=IFELSE(C>KOD,O-ATR10*0.75,O-ATR10*0.5);
LEP1:=MAX(LEP,AVG3HI);
SEP1:=MIN(SEP,AVG3LO);

// 计算趋势市的进场价格
UPBAND:=MA(C,50)+STD(C,50)*2;
DNBAND:=MA(C,50)-STD(C,50)*2;

// 计算趋势市的出场价格
MA50:=MA(C,50);

// 震荡策略逻辑
CMI<20&&C>=LEP1,BK;
CMI<20&&C<=SEP1,SK;
CMI<20&&C>=AVG3HI,SP;
CMI<20&&C<=AVG3LO,BP;

// 趋势策略逻辑
CMI>=20&&C>=UPBAND,BK;
CMI>=20&&C<=DNBAND,SK;
CMI>=20&&C<=MA50,SP;
CMI>=20&&C>=MA50,BP;
AUTOFILTER;
template: strategy.tpl:40:21: executing "strategy.tpl" at <.api.GetStrategyListByName>: wrong number of args for GetStrategyListByName: want 7 got 6