📑 查看全课大纲(第 46 / 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.预案准备和实盘心理建设
用MC开发一个跨品种套利交易策略(上)
约 35 分钟
📺 正在播放小象官方高清录播(支持倍速与清晰度调节)
用MC开发一个跨品种套利交易策略(上)
小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。
MultiCharts(MC)支持多图表(Multi-Data)联动,是跨品种套利开发的利器。本节深入剖析 MC 多数据流同步机制,并用 Python 3.12 给出双品种价差跟踪与协整回归的等价实现。本讲义原课以 TB/MC 演示,此处为 Python 等价实现。
💡 核心导读
- MultiCharts 多数据流(Data1 & Data2)核心机制:
- 时钟时间对齐(Timestamp Synchronization):确保 Data1 与 Data2 在同一物理时间戳 Bar 上严密对齐;
- 动态协整系数估计(Rolling OLS Beta):实时估计对冲比率 ,动态消除品种间市值敞口;
- 价差偏离度触发器:当价差脱离均值 时,Data1 与 Data2 同时反向发出交易委托。
┌─────────────────────────────────────────────────────────────┐
│ MultiCharts 双数据流对齐与套利拓扑 │
└──────────────────────────────┬──────────────────────────────┘
│
┌─────────────────────────────┴─────────────────────────────┐
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│ Data1 (标的 A 行情流) │ │ Data2 (标的 B 行情流) │
├─────────────────────────┤ ├─────────────────────────┤
│ • 螺纹钢 10月主力合约 │ │ • 螺纹钢 01月远月合约 │
│ • 价格序列 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>P</mi><mi>A</mi></msub></mrow><annotation encoding="application/x-tex">P_A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</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> │ │ • 价格序列 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>P</mi><mi>B</mi></msub></mrow><annotation encoding="application/x-tex">P_B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0502em;">B</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> │
└─────────────────────────┘ └─────────────────────────┘
│
▼
┌─────────────────────────────┐
│ 统一时间轴对齐 & 价差生成 │
├─────────────────────────────┤
│ Spread = Price_A - Price_B │
│ Z = (Spread - MA) / Std │
└─────────────────────────────┘一、双数据流时间戳对齐与滚动协整对冲比率
声明:原课以 TB/MC 演示,此处为 Python 等价实现。
在配对交易中,对冲比率 通过滚动 OLS 最小二乘法估计:
import pandas as pd
import numpy as np
def calculate_rolling_beta(series_a: pd.Series, series_b: pd.Series, window: int = 60) -> pd.Series:
"""
计算两资产滚动 OLS 协整对冲比率 Beta(Python 等价实现)
"""
cov = series_a.rolling(window).cov(series_b)
var = series_b.rolling(window).var()
beta = cov / (var + 1e-8)
return beta二、MC 套利开平仓信号与状态机 Python 实现
双品种套利状态机必须严格保证两腿(Legs)指令的原子性,开仓时 Data1 与 Data2 必须同步反向操作。
def generate_pairs_trading_signals(df_merged: pd.DataFrame, entry_threshold: float = 2.0, exit_threshold: float = 0.5) -> pd.DataFrame:
"""
MC 跨品种套利策略信号机(Python 等价实现)
"""
res = df_merged.copy()
res['spread'] = res['price_a'] - res['beta'] * res['price_b']
res['spread_ma'] = res['spread'].rolling(30).mean()
res['spread_std'] = res['spread'].rolling(30).std()
res['zscore'] = (res['spread'] - res['spread_ma']) / (res['spread_std'] + 1e-8)
res['pos_a'] = 0
res['pos_b'] = 0
# 状态机:做多价差 (买 A 卖 B) 或 做空价差 (卖 A 买 B)
res.loc[res['zscore'] > entry_threshold, 'pos_a'] = -1
res.loc[res['zscore'] > entry_threshold, 'pos_b'] = 1
res.loc[res['zscore'] < -entry_threshold, 'pos_a'] = 1
res.loc[res['zscore'] < -entry_threshold, 'pos_b'] = -1
return res📝 动手练一练
编写 Python 测试脚本,模拟 Data1 与 Data2 双数据流对齐并生成跨品种套利交易信号:
import pandas as pd
import numpy as np
def run_mc_arbitrage_part1_test():
np.random.seed(42)
# 模拟高度相关的两个品种价格
base = 100.0 + np.cumsum(np.random.normal(0.05, 1.0, 100))
p_a = base + np.sin(np.linspace(0, 4*np.pi, 100)) * 3.0
p_b = base * 0.95 + np.random.normal(0, 0.5, 100)
df = pd.DataFrame({'price_a': p_a, 'price_b': p_b})
df['beta'] = calculate_rolling_beta(df['price_a'], df['price_b'], window=30)
res = generate_pairs_trading_signals(df)
long_spread_signals = (res['pos_a'] == 1).sum()
short_spread_signals = (res['pos_a'] == -1).sum()
print("================ MC 套利策略 Python 等价实现(上)================")
print(f"数据总长度: {len(df)} 根 K 线")
print(f"最新协整对冲比率 Beta: {df['beta'].iloc[-1]:.4f}")
print(f"做多价差触发次数 (买A卖B): {long_spread_signals} 次")
print(f"做空价差触发次数 (卖A买B): {short_spread_signals} 次")
assert not np.isnan(df['beta'].iloc[-1]), "Beta 计算异常!"
print("✅ MC 套利双数据流与协整信号测试 PASS")
print("================================================================")
if __name__ == '__main__':
run_mc_arbitrage_part1_test()运行结果输出:
================ MC 套利策略 Python 等价实现(上)================
数据总长度: 100 根 K 线
最新协整对冲比率 Beta: 1.0126
做多价差触发次数 (买A卖B): 0 次
做空价差触发次数 (卖A买B): 1 次
✅ MC 套利双数据流与协整信号测试 PASS
================================================================本章小结
- 掌握多数据流同步技术:以统一时间轴严密对齐 Data1 与 Data2,杜绝异步数据错位。
- 滚动估计动态对冲比率:利用滚动 OLS 提取动态 ,确保多空双腿头寸的市值中性。
- 基于 Z-Score 的量化触发:通过统计偏离度标准化门限控制入场出场,提高套利胜率。
📋 行动清单 (Action Checklist)
- 运行 MC 套利测试代码,测试改变 OLS 滚动窗口对 平滑度的影响;
- 为套利信号增加半衰期(Half-Life)均值回归速度检验;
- 预习下一节,掌握用 MultiCharts/Python 编写套利出场与止损控制。
— 小象教研组
配套学习资源与课件
- 第9章课件:套利策略的设计与开发(PDF · 2.3MB)下载
🎁 免费学习资源
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加课程顾问,免费获取网盘下载链接
微信扫码添加顾问