← 返回《进阶量化交易实战:迭代式的量化策略研发》
📑 查看全课大纲(第 4 / 59 节)
  1. 1.量化投资必备基础知识
  2. 2.趋势型策略及模型原理
  3. 3.均值回复型策略及模型原理
  4. 4.配对交易策略及模型原理
  5. 5.量化策略研发流程与基本技能
  6. 6.常用的量化平台概述及如何选择
  7. 7.如何量化一个主观策略思路
  8. 8.常用技术指标及指标计算过程
  9. 9.如何编写指标代码
  10. 10.指标的物理意义
  11. 11.技术指标的应用技巧
  12. 12.更多的交易决策
  13. 13.编写程序去量化一个趋势型技术指标
  14. 14.编写趋势型技术指标的性能评价
  15. 15.策略对交易成本和持仓周期的影响
  16. 16.股票池策略的原理及基本框架
  17. 17.基于多因子分析的股票池设计与实现
  18. 18.股票池的性能评估
  19. 19.使用定制化财务因子构建股票池
  20. 20.趋势型策略原理及股票池机制的设计
  21. 21.趋势型择时信号的设计方法与编程实现
  22. 22.趋势型策略的回测与性能评估
  23. 23.优化趋势型策略的思路及方法
  24. 24.量化体系中的风险控制思想
  25. 25.风险的度量-波动率
  26. 26.常用的风险控制方法
  27. 27.实现止盈止损模块以提高策略性能
  28. 28.策略性能的评估与优化
  29. 29.探讨波动率与风险的关系
  30. 30.量化策略中的经典资金管理模型
  31. 31.用python编程实现资金管理模块
  32. 32.构建一个完善的量化交易策略
  33. 33.趋势型量化策略必备的期货知识
  34. 34.期货量化工具介绍
  35. 35.商品期货趋势型策略原理
  36. 36.用TB编写商品期货趋势型策略(上)
  37. 37.用TB编写商品期货趋势型策略(下)
  38. 38.分析优化商品期货趋势型策略的方法思路
  39. 39.期货交易策略的注意事项
  40. 40.均值回复型策略的原理
  41. 41.A股市场有没有稳定的均值回复效应?
  42. 42.编写一个均值回复型股票量化策略
  43. 43.编写多空组合策略进行策略改进
  44. 44.在策略中实现头寸管理进行策略优化
  45. 45.套利策略原理及常见套利类型
  46. 46.用MC开发一个跨品种套利交易策略(上)
  47. 47.用MC开发一个跨品种套利交易策略(下)
  48. 48.统计套利之股票配对交易策略
  49. 49.实盘中的细节问题:加减仓
  50. 50.关于高频交易
  51. 51.如何评价实盘量化策略的性能
  52. 52.量化系统的工作过程及研发流程
  53. 53.运气or实力
  54. 54.量化实盘交易需要满足什么条件
  55. 55.未来函数的坑
  56. 56.实盘数据接口异常的自动报警
  57. 57.交易系统的压力测试
  58. 58.自动运行的交易策略,什么时候需要人工干预
  59. 59.预案准备和实盘心理建设

配对交易策略及模型原理

约 23 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

配对交易策略及模型原理

小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。

在量化投资的武库中,统计套利(Statistical Arbitrage)与配对交易(Pairs Trading)被称为”现代金融炼金术”。传统单边看多策略不可避免暴露在全市场系统性风险(Market Beta)之中,而配对交易通过在两只有强基本面联系的关联资产间建立多空对冲头寸,剥离大盘波动干扰,专注获取价差回归的纯净 Alpha 收益。本讲系统解析协整检验(Cointegration)、价差 Z-Score 建模与配对交易的全生命周期工程闭环。


💡 核心导读

  • 套利的三种境界与核心概念辨析
    • 无风险套利(Pure / Deterministic Arbitrage):如跨期现货一二级市场瞬间无风险差价,比拼纳秒级硬件网络速度,个人与中低频量化基本无参与空间;
    • 统计套利(Statistical Arbitrage):基于大样本历史统计规律,在价差出现异常偏离时建立反向头寸,博取高概率均值回归;
    • 配对交易(Pairs Trading):统计套利的最经典形式,同时做多被低估资产并做空被高估资产,实现组合的 Beta 中性(Market Neutral)。
  • 相关性(Correlation) vs 协整性(Cointegration)的本质区别
    • 醉汉牵狗理论(Drunkard and his Dog):两只资产价格可能看似同步上涨(高相关性),但如果两者之间的距离(价差)越来越大甚至发散,则不存在协整;
    • 协整的数学定义:两组非平稳时间序列 XtI(1)X_t \sim I(1)YtI(1)Y_t \sim I(1),若存在线性组合使得残差序列平稳: Spreadt=YtβXtαI(0)Spread_t = Y_t - \beta X_t - \alpha \sim I(0) 则称 XtX_tYtY_t 具备协整关系,价差 SpreadtSpread_t 必定具备长期均值回复特性。
  • 配对交易标准五步工程流水线
    1. 标的池筛选:同行业双寡头(如贵州茅台 vs 五粮液)、商品期货上下游(如螺纹钢 vs 热卷);
    2. 协整参数标定:采用 OLS 最小二乘法回归估算对冲比率 β\beta
    3. 价差标准化处理:计算滑动窗口下的均值 μ\mu 与方差 σ\sigma,转化为 Z-ScoreZ\text{-Score}
    4. 入场与出场判定Z>2.0|Z| > 2.0 开仓(多弱空强),Z<0.2|Z| < 0.2 平仓获利;
    5. 协整破裂硬止损Z>3.5|Z| > 3.5 判定基本面发生永久性突变,果断止损离场。
┌─────────────────────────────────────────────────────────────┐
│                    配对交易市场中性价差套利拓扑图               │
└──────────────────────────────┬──────────────────────────────┘

 价差 Z-Score                  ▲
 ─── +2.0σ 开仓线 ─────────────┼───────────▲ [做空 A / 做多 B (多弱空强)] ──
                               │          / \
 ─── 0 均值回归线 ─────────────┼─────────/───\─────────────▲ (价差归零平仓) ─
                               │        /     \           /
 ─── -2.0σ 开仓线 ─────────────┼───────/───────▼ [做多 A / 做空 B] ──────────
                               │      /
 ─── -3.5σ 协整破裂止损线 ─────┴─────/────────────────────────► (时间 t)

一、协整关系检验与对冲比例 β\beta 计算

在量化回测中,使用两步法(Engle-Granger Two-Step Method)检验资产协整性:

import pandas as pd
import numpy as np

def calculate_cointegration_hedge_ratio(series_a, series_b):
    """
    通过 OLS 线性回归计算配对资产对冲比率 beta 与价差序列
    Price_A = beta * Price_B + alpha + e
    """
    # 计算回归系数 beta
    cov_ab = np.cov(series_a, series_b)[0][1]
    var_b = np.var(series_b)
    beta = cov_ab / (var_b + 1e-8)
    alpha = np.mean(series_a) - beta * np.mean(series_b)
    
    # 构造价差残差序列
    spread = series_a - beta * series_b - alpha
    return beta, alpha, spread

二、价差 Z-Score 动态跟踪与交易信号生成

通过对价差序列进行滑动窗口标准化,消除绝对价格尺度的影响,实现跨品种的统一度量:

def generate_pairs_trading_signals(spread_series, window=20, enter_threshold=2.0, exit_threshold=0.2):
    """
    计算动态 Z-Score 并输出多空配对开平仓信号
    """
    rolling_mean = spread_series.rolling(window=window).mean()
    rolling_std = spread_series.rolling(window=window).std()
    z_score = (spread_series - rolling_mean) / (rolling_std + 1e-6)
    
    signals = pd.Series(0, index=spread_series.index)
    # Z > 2.0: A 相对高估, B 相对低估 -> 做空 A / 做多 B (信号记为 -1)
    signals[z_score > enter_threshold] = -1
    # Z < -2.0: A 相对低估, B 相对高估 -> 做多 A / 做空 B (信号记为 1)
    signals[z_score < -enter_threshold] = 1
    # 价差收敛平仓
    signals[z_score.abs() < exit_threshold] = 0
    
    return z_score, signals

📝 动手练一练

下面我们用 Python 编写一段 股票配对交易多空对冲回测引擎,验证两只关联标的在大盘震荡背景下如何通过中性化对冲锁定价差回归收益:

import pandas as pd
import numpy as np

def run_pairs_trading_simulation():
    """
    经典统计套利之股票配对交易 (Pairs Trading) 引擎
    - 验证协整价差 (Cointegrated Spread) 与市场中性 (Market Neutral)
    - 多弱空强: 当价差 Z > 2.0 时 做空A/做多B; Z < -2.0 时 做多A/做空B
    """
    np.random.seed(42)
    dates = pd.date_range("2023-01-01", periods=120, freq="B")
    
    # 模拟两只具备协整关系的关联股票走势
    market_trend = np.cumsum(np.random.normal(0.0005, 0.015, 120))
    spread = np.zeros(120)
    for t in range(1, 120):
        spread[t] = 0.8 * spread[t-1] + np.random.normal(0, 0.8)  # 平稳 AR(1) 价差
        
    p_b = 50.0 * np.exp(market_trend)
    p_a = 1.2 * p_b + spread + 5.0
    
    df = pd.DataFrame({'price_a': p_a, 'price_b': p_b}, index=dates)
    
    # 通过 OLS 回归估计对冲比率 beta (不硬编码, 从数据读取)
    beta = np.cov(df['price_a'], df['price_b'])[0][1] / (np.var(df['price_b']) + 1e-8)
    df['spread'] = df['price_a'] - beta * df['price_b']
    df['spread_mean'] = df['spread'].rolling(20).mean()
    df['spread_std'] = df['spread'].rolling(20).std()
    df['z_score'] = (df['spread'] - df['spread_mean']) / (df['spread_std'] + 1e-6)
    
    # 信号-持仓分离: signal 列 NaN 表示维持原持仓, 显式值触发开平仓动作
    df['signal_a'] = np.nan
    # Z > 2.0: A 相对高估 -> 做空 A / 做多 B
    df.loc[df['z_score'] > 2.0, 'signal_a'] = -1.0
    # Z < -2.0: A 相对低估 -> 做多 A / 做空 B
    df.loc[df['z_score'] < -2.0, 'signal_a'] = 1.0
    # 价差回归中轴: 显式平仓
    df.loc[df['z_score'].abs() < 0.2, 'signal_a'] = 0.0
    
    # 持仓 = 信号前向填充 (无信号日维持原仓位), 期初为空仓; B 腿按 beta 对冲
    df['pos_a'] = df['signal_a'].ffill().fillna(0.0)
    df['pos_b'] = -beta * df['pos_a']
    
    # 组合日收益率 (市场中性)
    # 教学简化: A 腿按 1 股计, B 腿收益按价格比 price_b/price_a 折算到同一金额尺度;
    # 严格工程实现应以两腿名义金额加权 (pos_a * dP_a + pos_b * dP_b) / 占用资金
    ret_a = df['price_a'].pct_change()
    ret_b = df['price_b'].pct_change()
    df['pair_ret'] = df['pos_a'].shift(1) * ret_a + df['pos_b'].shift(1) * ret_b * (df['price_b'] / df['price_a'])
    cum_ret = (1 + df['pair_ret'].fillna(0)).cumprod()
    
    res = {
        "Total_Bars": len(df),
        "Cointegration_Beta": f"{beta:.2f}",
        "Spread_Mean": f"{df['spread'].mean():.2f}",
        "Spread_Std": f"{df['spread'].std():.2f}",
        "Pairs_Return": f"{(cum_ret.iloc[-1] - 1)*100:.2f}%",
        "Market_A_Return": f"{(df['price_a'].iloc[-1]/df['price_a'].iloc[0] - 1)*100:.2f}%",
        "Market_B_Return": f"{(df['price_b'].iloc[-1]/df['price_b'].iloc[0] - 1)*100:.2f}%"
    }
    return res

def test_pairs_run():
    res = run_pairs_trading_simulation()
    print("================ 统计套利配对交易 (Pairs Trading) 模拟 ================")
    for k, v in res.items():
        print(f"  - {k:<22}: {v}")
    print("----------------------------------------------------------------------")
    print("量化精髓: 配对交易通过多空对冲剥离大盘 Beta,锁定价差回归的纯 Alpha!")
    print("======================================================================")

if __name__ == "__main__":
    test_pairs_run()

运行结果输出:

================ 统计套利配对交易 (Pairs Trading) 模拟 ================
  - Total_Bars            : 120
  - Cointegration_Beta    : 1.11
  - Spread_Mean           : 9.58
  - Spread_Std            : 1.17
  - Pairs_Return          : 12.96%
  - Market_A_Return       : -9.15%
  - Market_B_Return       : -8.65%
----------------------------------------------------------------------
量化精髓: 配对交易通过多空对冲剥离大盘 Beta,锁定价差回归的纯 Alpha!
======================================================================

📖 结果解读:① OLS 回归估计的对冲比率 β=1.11\beta = 1.11,接近合成数据的真实值 1.2——对冲比率必须从数据回归得到,不能拍脑袋硬编码;② 全周期 A、B 两只标的双双下跌(-9.15% / -8.65%),而多空对冲的配对组合逆势盈利 +12.96%,这就是”剥离大盘 Beta、只赚价差回归 Alpha”的市场中性效果;③ 工程红线:持仓信号必须”信号-持仓分离”(NaN 维持、显式值触发),若写成 position.replace(0, np.nan).ffill(),显式平仓的 0 会被前一持仓回填覆盖,导致永远无法平仓——这是配对交易回测中最隐蔽的 bug 之一。


本章小结

  1. 认清套利本质:通过多空对冲抵消标的的系统性风险(Beta),仅赚取相对强弱价差回归的 Alpha。
  2. 严防相关性伪套利:必须基于协整检验(Cointegration)而非简单相关性筛选配对标的。
  3. 设置协整破裂止损:当企业基本面发生不可逆变故导致价差无限发散时,必须通过 Z>3.5|Z| > 3.5 强制平仓截断亏损。

📋 行动清单 (Action Checklist)

  • 运行本讲配对交易代码,观察在市场不同行情走势下中性化组合净值的平稳性;
  • 尝试下载螺纹钢与热轧卷板的真实日线数据,利用 OLS 计算两者的历史协整比例 β\beta
  • 预习下一节,梳理专业量化策略全流程研发环节与必备的工程软硬件技能。

— 小象教研组

配套学习资源与课件
  • 第1章课件:实战量化投资必备基础知识(PDF · 4.5MB)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加课程顾问,免费获取网盘下载链接
微信二维码:扫码添加课程顾问微信扫码添加顾问