📑 查看全课大纲(第 36 / 59 节)
- 1.量化投资必备基础知识
- 2.趋势型策略及模型原理
- 3.均值回复型策略及模型原理
- 4.配对交易策略及模型原理
- 5.量化策略研发流程与基本技能
- 6.常用的量化平台概述及如何选择
- 7.如何量化一个主观策略思路
- 8.常用技术指标及指标计算过程
- 9.如何编写指标代码
- 10.指标的物理意义
- 11.技术指标的应用技巧
- 12.更多的交易决策
- 13.编写程序去量化一个趋势型技术指标
- 14.编写趋势型技术指标的性能评价
- 15.策略对交易成本和持仓周期的影响
- 16.股票池策略的原理及基本框架
- 17.基于多因子分析的股票池设计与实现
- 18.股票池的性能评估
- 19.使用定制化财务因子构建股票池
- 20.趋势型策略原理及股票池机制的设计
- 21.趋势型择时信号的设计方法与编程实现
- 22.趋势型策略的回测与性能评估
- 23.优化趋势型策略的思路及方法
- 24.量化体系中的风险控制思想
- 25.风险的度量-波动率
- 26.常用的风险控制方法
- 27.实现止盈止损模块以提高策略性能
- 28.策略性能的评估与优化
- 29.探讨波动率与风险的关系
- 30.量化策略中的经典资金管理模型
- 31.用python编程实现资金管理模块
- 32.构建一个完善的量化交易策略
- 33.趋势型量化策略必备的期货知识
- 34.期货量化工具介绍
- 35.商品期货趋势型策略原理
- 36.用TB编写商品期货趋势型策略(上)
- 37.用TB编写商品期货趋势型策略(下)
- 38.分析优化商品期货趋势型策略的方法思路
- 39.期货交易策略的注意事项
- 40.均值回复型策略的原理
- 41.A股市场有没有稳定的均值回复效应?
- 42.编写一个均值回复型股票量化策略
- 43.编写多空组合策略进行策略改进
- 44.在策略中实现头寸管理进行策略优化
- 45.套利策略原理及常见套利类型
- 46.用MC开发一个跨品种套利交易策略(上)
- 47.用MC开发一个跨品种套利交易策略(下)
- 48.统计套利之股票配对交易策略
- 49.实盘中的细节问题:加减仓
- 50.关于高频交易
- 51.如何评价实盘量化策略的性能
- 52.量化系统的工作过程及研发流程
- 53.运气or实力
- 54.量化实盘交易需要满足什么条件
- 55.未来函数的坑
- 56.实盘数据接口异常的自动报警
- 57.交易系统的压力测试
- 58.自动运行的交易策略,什么时候需要人工干预
- 59.预案准备和实盘心理建设
用TB编写商品期货趋势型策略(上)
约 28 分钟
用TB编写商品期货趋势型策略(上)
小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。
TradeBlazer(TB)是国内商品期货量化交易的经典平台。本节深入剖析 TB 经典突破策略(Dual Thrust / 海龟通道)的核心逻辑框架,并用现代化 Python 3.12 给出完全等价、无未来函数的工业级实现。本讲义原课以 TB/MC 演示,此处为 Python 等价实现。
💡 核心导读
- TB 经典突破策略 Dual Thrust 核心数学逻辑:
- 波幅范围(Range):,综合过去 日高低价与收盘价极差;
- 动态触发线(Upper / Lower Triggers):
- 非对称系数设计:通过设定 调节多空偏好,适应不同品种多空不对称性。
┌─────────────────────────────────────────────────────────────┐
│ TB 经典 Dual Thrust 策略逻辑拓扑图 │
└──────────────────────────────┬──────────────────────────────┘
│
┌─────────────────────────────┼─────────────────────────────┐
▼ ▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐ ┌─────────────────────────┐
│ 当日开盘价基准 (Open) │ │ 计算前 N 日波幅 (Range) │ │ 突破触发与开平仓 │
├─────────────────────────┤ ├─────────────────────────┤ ├─────────────────────────┤
│ • 以当日 Open 为中轴 │ │ • Range = Max(HH-LC, ..)│ │ • 突破 Upper: 开多/平空 │
│ • 消除隔夜跳空影响 │ │ • <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>K</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">K_1, K_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 参数调节 │ │ • 跌破 Lower: 开空/平多 │
└─────────────────────────┘ └─────────────────────────┘ └─────────────────────────┘一、TB 原始代码解析与 Python 等价算法实现
声明:原课以 TB/MC 演示,此处为 Python 等价实现。
TB 源码使用 Open + K1 * Range 生成日内突破信号。在 Python 向量化中,我们必须将过去 日的极差严格进行 shift(1),避免引入当日价格:
import pandas as pd
import numpy as np
def calculate_dual_thrust_signals(df: pd.DataFrame, n_days: int = 5, k1: float = 0.5, k2: float = 0.5) -> pd.DataFrame:
"""
TB Dual Thrust 策略 Python 工业级等价实现(无未来函数)
"""
res = df.copy()
hh = res['high'].rolling(n_days).max().shift(1)
hc = res['close'].rolling(n_days).max().shift(1)
ll = res['low'].rolling(n_days).min().shift(1)
lc = res['close'].rolling(n_days).min().shift(1)
range_val = np.maximum(hh - lc, hc - ll)
res['upper_bound'] = res['open'] + k1 * range_val
res['lower_bound'] = res['open'] - k2 * range_val
res['signal'] = 0
res.loc[res['close'] > res['upper_bound'], 'signal'] = 1
res.loc[res['close'] < res['lower_bound'], 'signal'] = -1
return res二、开平仓状态机与反手交易执行
Dual Thrust 属于典型的连续反手策略(Always-in-the-market)。当持有多头时触碰下轨,立即执行“平多并开空”操作。
def execute_dual_thrust_backtest(df_signals: pd.DataFrame) -> pd.Series:
"""
执行反手交易回测
"""
df = df_signals.copy()
df['pos'] = df['signal'].replace(0, np.nan).ffill().shift(1).fillna(0)
df['ret'] = df['close'].pct_change().fillna(0)
df['strat_ret'] = df['pos'] * df['ret']
return (1.0 + df['strat_ret']).cumprod()📝 动手练一练
编写 Python 仿真测试,在模拟商品期货 K 线上运行 Dual Thrust 策略并验证信号。
⚠️ 失败案例警示(本节反面教材):本节仿真最初的参数组合为「日波动 + 」,5 日 Range 中位数约 57 点,触发线被推到开盘价 点之外,而收盘价相对开盘价的偏离被限制在 点以内——通道过宽导致 100 根 K 线全程 0 信号、净值恒为 1.0000。更危险的是,旧断言只校验
equity > 0,这种「零交易回测」照样打印 PASS,属于典型的静默失效(Silent Failure):回测什么也没验证,却给了人策略可行的错觉。修正方案:收窄模拟波动()、放宽开盘跳空幅度()并调低 值(0.3 / 0.4),让触发线进入收盘价可达区间;同时新增信号数断言,从机制上防止回归:
import pandas as pd
import numpy as np
def run_dual_thrust_test():
np.random.seed(42)
# 模拟 100 根期货日 K 线(开盘价含跳空缺口,用 max/min 保证 OHLC 包络一致性)
prices = 4000.0 + np.cumsum(np.random.normal(1.5, 8.0, 100))
opens = prices + np.random.uniform(-12, 12, 100)
df = pd.DataFrame({
'open': opens,
'high': np.maximum(opens, prices) + np.random.uniform(2, 8, 100),
'low': np.minimum(opens, prices) - np.random.uniform(2, 8, 100),
'close': prices
})
# 收窄 K 值使触发线进入收盘价可达区间,避免通道过宽导致零信号
res = calculate_dual_thrust_signals(df, n_days=5, k1=0.3, k2=0.4)
equity = execute_dual_thrust_backtest(res)
print("================ TB Dual Thrust 策略 Python 等价实现 ================")
print(f"有效回测 Bar 数 : {len(df)}")
print(f"上轨触发买入次数 : {(res['signal'] == 1).sum()} 次")
print(f"下轨触发卖出次数 : {(res['signal'] == -1).sum()} 次")
print(f"策略最终累计净值 : {equity.iloc[-1]:.4f}")
assert (res['signal'] != 0).sum() > 0, "通道过宽导致全程无信号,回测静默失效!"
assert equity.iloc[-1] > 0, "回测净值计算异常!"
print("✅ TB Dual Thrust 等价复现与回测验证 PASS")
print("====================================================================")
if __name__ == '__main__':
run_dual_thrust_test()运行结果输出:
================ TB Dual Thrust 策略 Python 等价实现 ================
有效回测 Bar 数 : 100
上轨触发买入次数 : 21 次
下轨触发卖出次数 : 19 次
策略最终累计净值 : 1.1845
✅ TB Dual Thrust 等价复现与回测验证 PASS
====================================================================本章小结
- TB 经典策略完美映射:采用 Python 向量化严格对齐 Dual Thrust 算法,消除对商业封闭平台的依赖。
- 非对称多空参数设计:通过 与 调节多空灵敏度,适应期货各品种独特的波动结构。
- 开盘价锚定规避跳空:以当日 Open 叠加历史 Range 为上下轨,有效降低隔夜跳空造成的滑点冲击。
- 警惕零交易的静默失效:触发通道相对价格可达区间过宽时,回测会全程无信号、净值恒为 1.0,而只检查净值的断言照样 PASS;必须先断言信号次数大于 0,回测结论才有意义。
📋 行动清单 (Action Checklist)
- 运行 Dual Thrust 测试脚本,测试修改 对策略胜率与交易频次的影响;
- 为 Dual Thrust 增加 ATR 波动率止损出场条件;
- 预习下一节,掌握用 TB/Python 编写带金字塔加仓的高阶趋势策略。
— 小象教研组
- 第7章课件:期货趋势型策略开发(PDF · 2.4MB)下载
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加课程顾问,免费获取网盘下载链接
微信扫码添加顾问