源码文件:vnpy_ctastrategy.strategies.dual_thrust_strategy

1. 策略概述

DualThrustStrategy 是 Michael Chalek 在 20 世纪 80 年代开发的著名策略,曾被 Future Truth 杂志评为最赚钱的策略之一。 它是一个典型的 日内突破策略。核心逻辑是利用前 N 日(这里简化为前 1 日)的最高价、最低价、收盘价计算出一个“波动区间 (Range)”,然后以今日开盘价为锚点,加上/减去这个区间的倍数,形成上轨和下轨。

  • 基类CtaTemplate
  • 核心逻辑:Range Breakout (区间突破)
  • 交易时段:日内交易,收盘前强制平仓

2. 核心参数

参数名默认值含义
k10.4上轨系数 (用于做多)
k20.6下轨系数 (用于做空)
fixed_size1每次下单手数

注意k1k2 可以不对称。如果 k1 < k2,说明做多更容易触发,适合多头市场;反之适合空头市场。

3. 策略逻辑详解

3.1 计算 Range (波动区间)

策略在每天开盘时(检测到日期变化),利用前一日的数据计算 Range。

1
2
3
4
5
6
7
if last_bar.datetime.date() != bar.datetime.date():
    if self.day_high:
        self.day_range = self.day_high - self.day_low  # 前一日振幅
        
        # 计算今日突破轨
        self.long_entry = bar.open_price + self.k1 * self.day_range
        self.short_entry = bar.open_price - self.k2 * self.day_range
  • 上轨 (Long Entry) = 今日开盘价 + K1 * 昨日振幅
  • 下轨 (Short Entry) = 今日开盘价 - K2 * 昨日振幅

3.2 盘中突破交易

在收盘时间 (exit_time, 14:55) 之前,策略持续监控价格是否突破上下轨。

  • 做多:价格突破上轨,且未开过多单。
  • 做空:价格跌破下轨,且未开过空单。
  • 反手:如果持有多单时跌破下轨,则平多并反手做空;反之亦然。
1
2
3
4
5
if self.pos == 0:
    if bar.close_price > self.day_open:
        self.buy(self.long_entry, self.fixed_size, stop=True)
    else:
        self.short(self.short_entry, self.fixed_size, stop=True)

这里使用了 stop=True 挂停止单,确保只有价格真的触及轨道才成交。

3.3 收盘强平 (EOD Exit)

作为日内策略,必须在收盘前平掉所有仓位,规避隔夜风险。

1
2
3
4
5
6
7
8
if bar.datetime.time() < self.exit_time:
    # ... 正常交易逻辑 ...
else:
    # 收盘前 5 分钟 (14:55 后)
    if self.pos > 0:
        self.sell(bar.close_price * 0.99, abs(self.pos)) # 市价平多
    elif self.pos < 0:
        self.cover(bar.close_price * 1.01, abs(self.pos)) # 市价平空

4. 总结

Dual Thrust 的精髓在于不对称性日内波幅适应

  • 它不需要复杂的指标,只看价格本身。
  • 它自动适应市场波动率:昨日波动大,今日轨道就宽;昨日波动小,今日轨道就窄。
  • 它是日内 CTA 策略的必修课。