第一个CTA策略——Dual Thrust 多品种组合策略

由xuxiaoyin创建,最终由xuxiaoyin 被浏览 10 用户

1. 引言:为什么讲 Dual Thrust?

Dual Thrust 是一个经典的趋势跟踪策略,由 Michael Chalek 在 1980 年代提出。它曾被《Futures Truth》杂志评为最赚钱的交易系统之一。三十多年过去了,在机器学习、深度学习大行其道的今天,为什么我们还在讲它?

因为它代表了量化策略最基本、最核心的思想——用规则捕捉趋势,用仓位控制风险。理解 Dual Thrust,就理解了 CTA 策略的 DNA。

本文选择在 BigTrader 上实现该策略,还有两层考量:

  1. 多品种期货组合:不是单品种回测,而是镍 + 螺纹钢 + 焦煤三品种并行,验证平台的多合约管理能力
  2. 完整风控体系:固定分数法配仓 + 4% 止损 + 移仓换月自动化,体现生产级策略的工程标准

2. 期货交易基础科普

如果你对期货已经熟悉,可以直接跳到第三节。这里为刚接触期货的朋友准备了一个速览。

2.1 什么是期货?

期货是一份标准化合约——约定在未来某个时间,以某个价格买卖一定数量的商品(比如铜、螺纹钢、焦煤)。它既可以是实物商品,也可以是股指、国债等金融资产。

2.2 多空双向交易

期货最大的特点之一就是可以做空

  • 做多:买入开仓 → 价格上涨 → 卖出平仓 → 赚钱
  • 做空:卖出开仓 → 价格下跌 → 买入平仓 → 赚钱

无论涨跌,都有赚钱机会——但在方向判断错误时也同样会亏损。

2.3 合约乘数

每手期货合约对应一定数量的标的物,这个数量关系就是合约乘数

品种 合约乘数 含义
镍(ni) 1 吨/手 价格涨 1 元,每手盈亏 1 元
螺纹钢(rb) 10 吨/手 价格涨 1 元,每手盈亏 10 元
焦煤(jm) 60 吨/手 价格涨 1 元,每手盈亏 60 元

乘数越大,价格波动对账户的影响就越剧烈——这也是为什么配仓时一定要考虑乘数。

2.4 主力合约与换月

同一品种同时存在多个不同到期月份的合约在交易。成交量最大、流动性最好的那个合约称为"主力合约"。随着时间推移,主力合约会从近月切换到远月,这个过程叫换月

在回测中,我们用"主连合约"(通常是 8888 后缀)来计算信号,用真实主力合约来下单。BigTrader 的 cn_future_dominant 表会自动告诉你每天哪个合约是主力。

2.5 保证金交易

期货采用保证金制度——你不需要支付合约的全部价值,只需要缴纳一定比例(通常 5%-20%)的保证金即可开仓。这意味着杠杆效应

  • 10% 的保证金 = 10 倍杠杆
  • 价格上涨 1%,你的盈亏是 10%(相对于保证金)

杠杆放大了收益,也放大了风险。策略设计中的"固定止损"和"仓位控制",本质上就是在管理这种杠杆风险。

3. Dual Thrust 策略原理

3.1 核心思想

Dual Thrust 属于通道突破策略。它的核心假设是:

价格在突破过去 N 天的波动区间后,会沿突破方向继续运动一段距离。

换言之——突破即趋势的开始

3.2 Range:衡量昨日波动

策略首先计算一个叫 Range 的量,用来衡量前一个交易日的波动幅度:

Range=max⁡(HH−LC, HC−LL)Range=max(HH−LC, HC−LL)

其中:

符号 含义
HH 过去 N 天的最高价
HC 过去 N 天的最高收盘价
LL 过去 N 天的最低价
LC 过去 N 天的最低收盘价

当 Mday = Nday = 1(只用昨日一天数据)时,公式简化为:

Range=max⁡(昨高−昨收, 昨收−昨低)Range=max(昨高−昨收, 昨收−昨低)

这个公式的直觉是:Range 取的是昨日价格在"高-收"和"收-低"两个方向上的较大波动。如果昨日收在高位,那么 "收-低" 更大;收在低位,则 "高-收" 更大。Range 始终保持正向。

3.3 上下轨计算

有了 Range,上下轨就非常简单:

上轨=今开+K1×Range下轨=今开−K2×Range

上轨=今开+K1​×Range下轨=今开−K2​×Range

其中 K1=K2=0.5K1​=K2​=0.5(对称设置,防止过拟合)。

以今开为基准,向外延伸半个 Range,形成了一条今日价格可能波动的预期通道。

3.4 交易规则

信号条件 未触发任何信号 动作
盘中 high ≥ 上轨 无多头持仓 做多开仓
盘中 high ≥ 上轨 持有空头 先平空 → 后做多
盘中 low ≤ 下轨 无空头持仓 做空开仓
盘中 low ≤ 下轨 持有多头 先平多 → 后做空
未触发任何信号 已持仓 隔夜持有

几个关键设计:

  • 隔夜持有:当天开仓后不主动平仓,持有到次日根据新的上下轨重新判断
  • 反手机制:如果持有多头但价格跌破下轨,直接平多反手做空——顺势而为,不扛单
  • 每日一次:每天最多开仓一次,避免同一日内反复进出

3.5 为什么选择对称参数?

经典 Dual Thrust 的 K1K1​ 和 K2K2​ 可以不相同(非对称)。但本策略强制 K1=K2=0.5K1​=K2​=0.5

原因:防过拟合。如果允许上下轨参数不同,可以在回测中"精调"出极其漂亮的曲线——但那是拟合了历史噪音,实战大概率失效。对称设置减少了自由度,提高了策略的稳健性。

附录

https://bigquant.com/codesharev3/00a45e06-2321-4b40-8517-5630eec98ded

\

{link}