第一个CTA策略——Dual Thrust 多品种组合策略
由xuxiaoyin创建,最终由xuxiaoyin 被浏览 6 用户
1. 引言:为什么讲 Dual Thrust?
Dual Thrust 是一个经典的趋势跟踪策略,由 Michael Chalek 在 1980 年代提出。它曾被《Futures Truth》杂志评为最赚钱的交易系统之一。三十多年过去了,在机器学习、深度学习大行其道的今天,为什么我们还在讲它?
因为它代表了量化策略最基本、最核心的思想——用规则捕捉趋势,用仓位控制风险。理解 Dual Thrust,就理解了 CTA 策略的 DNA。
本文选择在 BigTrader 上实现该策略,还有两层考量:
- 多品种期货组合:不是单品种回测,而是镍 + 螺纹钢 + 焦煤三品种并行,验证平台的多合约管理能力
- 完整风控体系:固定分数法配仓 + 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
\