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

CTA策略之威廉W%R交易策略

Author: 扫地僧, Date: 2021-10-26 14:15:26
Tags: 商品期货趋势My语言

一、摘要

威廉W%R是一种古老的技术指标,在1973年由Larry Williams首创,简称威廉指标或W%R,全称为威廉超买超卖指标。在其发表的《我如何赚得一百万》一书中进行了详细的阐述,这是一个振荡指标,主要是依据价格的摆动点,来判断市场是否处于超买或超卖现象。本篇文章我们就以威廉W%R为蓝本,在优宽量化交易平台(youquant.com)开发一个商品期货量化交易策略。

二、威廉W%R原理

威廉指标在公式设计上与随机指标原理类似,它们都是从研究价格波动幅度为出发点,通过分析一段时间之内的最高价、最低价、收盘价的相互关系,以此判断市场市场买卖双方力量的强弱(超买超卖情况),从而预测价格中短期走势。如下图子图为威廉W%R指数:

img

其主要原理是利用震荡点,来反映市场的超买超卖行为,分析多空双方力量对比,提取出有效的信号,来判断市场中短期价格走势,与其他技术指标一样,威廉指标可以广泛应用于多个周期的行情,包括:日线、周线、月线、小时线、分钟线等各种数据周期。

三、威廉W%R计算

在计算威廉指标之前,首先要确定数据周期,虽然威廉指标可以用于各种数据周期,但每个周期的值都有所区别,比如:在日线中威廉指标的值代表了当天收盘价,在过去一段时间内最高价减去当日收市价,再将其差价除以这段日子的全部价格范围,最后计算出当日的威廉指标。计算公式如下:

W%R = (Hn — C) ÷ (Hn — Ln) × 100

其中:

  • C:当根K线收盘价
  • Hn:N日内最高价,默认参数为14
  • Ln:N日内最低价,默认参数为14

四、威廉W%R使用

威廉指标的计算方法与随机指标类似,其计算后得出的数值是在0——100之间,相反的是威廉指标的值越小,就越反映市场的买量越大;威廉指标的值越大,就越反映市场的卖量越大。通常情况下,威廉值在20——80之间上下波动。

1、当价格跌破80时,表明市场处于超卖状态,价格随时可能见底,如果威廉值长期处于80以下,当上穿80时,表明价格脱离底部区域,进入上升期。

2、当价格升破20时,表明市场处于超买状态,价格随时可能见顶,如果威廉值长期处于20以上,当下穿20时,表明价格脱离顶部区域,进入下降期。

五、策略实现

第1步:设置回测配置

(*backtest
start: 2015-02-22 00:00:00
end: 2021-05-19 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
args: [["ContractType","jm000",126961]]
*)

第2步:计算威廉指标

HC := HHV(HIGH, 14) - CLOSE;
HL := HHV(HIGH, 14) - LLV(LOW, 14);
WR := -100 * HC / HL;

第3步:计算20日均线

MA20 : EMA2(C, 14);

第4步:计算多空条件

C1 := WR < -60 && C > MA20;
C2 := WR > -15 && C < MA20;

第5步:下单交易

C1, BPK;
C2, SPK;

六、策略回测

  • 回测开始日期:2015-02-22
  • 回测结束日期:2021-05-19
  • 数据品种:焦煤指数
  • 数据周期:日线
  • 滑点:开平仓各2跳

回测配置 img 回测绩效 img 资金曲线 img


(*backtest
start: 2015-02-22 00:00:00
end: 2021-05-19 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
args: [["ContractType","jm000",126961]]
*)

HC := HHV(HIGH, 14) - CLOSE;
HL := HHV(HIGH, 14) - LLV(LOW, 14);
WR := -100 * HC / HL;
MA20 : EMA2(C, 14);
C1 := WR < -60 && C > MA20;
C2 := WR > -15 && C < MA20;
C1, BPK;
C2, SPK;
template: strategy.tpl:40:21: executing "strategy.tpl" at <.api.GetStrategyListByName>: wrong number of args for GetStrategyListByName: want 7 got 6