3. 价差套利策略设计:统计套利原理、协整与平稳性、均值回归策略、配对交易策略

好,咱们直接进入正题。价差套利,说白了就是利用两个相关资产之间的价格偏离来赚钱。很多人一听到「套利」就觉得是捡钱,其实没那么简单。我做了这么多年高频,见过太多人死在价差回归的路上。

这一章,我会把统计套利的底层逻辑、数学工具、实战策略全盘托出。你跟着我的思路走,保证能搭建出一套能跑的策略框架。

3.1 统计套利的底层逻辑

传统套利是「无风险」的,比如同一只股票在两个交易所的价格差。但统计套利不一样——它赌的是价格关系会回归历史均值。说白了,这是一种概率游戏。

我个人习惯把统计套利分成三步:

  1. 找关系:找到两个长期保持稳定关系的品种
  2. 算价差:计算它们的价差,并判断是否偏离正常范围
  3. 赌回归:在偏离时开仓,等回归时平仓

你想想看,如果两个品种的价差像橡皮筋一样,拉远了总会弹回来,那我们就赚这个弹回来的钱。但问题是——橡皮筋可能拉断。这就是风险。

核心要点:统计套利不是无风险套利,它是「高概率回归」的博弈。你需要用数学工具来量化这个概率。

3.2 协整与平稳性:价差关系的数学基础

很多新手一上来就做相关性分析,觉得相关系数高就能套利。错!大错特错!

我在项目中遇到过这样一个案例:两个股票相关系数高达0.95,但价差却越走越远,最后爆仓了。为什么?因为它们虽然相关,但不协整。

协整才是价差套利的真正基础。它描述的是:两个非平稳的时间序列,它们的线性组合是平稳的。用大白话说——两个乱跑的变量,它们的差值却是有规律的。

3.2.1 平稳性检验

做协整之前,先要确认单个序列是非平稳的。常用的方法是ADF检验(Augmented Dickey-Fuller test)。

# Python示例:ADF检验
from statsmodels.tsa.stattools import adfuller

# 假设price_a和price_b是两个价格序列
result_a = adfuller(price_a)
result_b = adfuller(price_b)

print(f"序列A的p值: {result_a[1]:.4f}")
print(f"序列B的p值: {result_b[1]:.4f}")

# p值大于0.05,说明序列非平稳
# 这是做协整的前提条件

嗯,这里要注意:ADF检验的p值大于0.05,说明序列非平稳。如果p值很小,说明序列已经是平稳的,那就不需要做协整了。

3.2.2 协整检验

确认两个序列都非平稳后,我们做Engle-Granger两步法:

  1. 用OLS回归估计协整系数:price_a = β * price_b + ε
  2. 对残差ε做ADF检验,看是否平稳
# Python示例:协整检验
import statsmodels.api as sm

# 第一步:OLS回归
X = sm.add_constant(price_b)
model = sm.OLS(price_a, X).fit()
residuals = model.resid

# 第二步:对残差做ADF检验
result_resid = adfuller(residuals)
print(f"残差的p值: {result_resid[1]:.4f}")

# p值小于0.05,说明残差平稳,即两个序列协整

实战技巧:我建议你同时做Johansen检验,它能处理多个品种的协整关系。对于配对交易,Engle-Granger就够用了。

3.3 均值回归策略:赚「回归」的钱

一旦确认了协整关系,我们就可以构建价差序列:

spread = price_a - β * price_b - α

这个价差序列是平稳的,意味着它会围绕均值上下波动。我们的策略就是:

  • 价差偏离均值超过阈值 → 开仓
  • 价差回归到均值附近 → 平仓

阈值怎么定?我一般用标准差。比如:

  • 价差 > 均值 + 2σ → 做空价差(卖A买B)
  • 价差 < 均值 - 2σ → 做多价差(买A卖B)
  • 价差回到均值 ± 0.5σ → 平仓

避坑指南:我曾经用1.5倍标准差做阈值,结果频繁开仓,手续费吃掉了一半利润。后来改成2.5倍,虽然交易次数少了,但每笔盈利更稳。阈值要根据品种的波动特性动态调整。

3.4 配对交易策略:从理论到实战

配对交易是均值回归策略的具体实现。我把它拆成四个步骤:

3.4.1 品种选择

不是随便两个品种都能配对。我筛选的标准:

标准 说明 我的经验值
行业相关性 同行业、同板块 比如茅台和五粮液
流动性 日均成交额 > 1亿 高频交易必须高流动性
协整性 残差ADF p值 < 0.05 p值越小越好
半衰期 价差回归均值的时间 我偏好30-60分钟

3.4.2 参数优化

参数优化是个坑。我见过有人用过去一年的数据优化参数,结果实盘一个月就失效了。为什么?因为市场结构变了。

我的做法:

  • 用滚动窗口(比如60天)重新估计协整系数
  • 阈值用自适应方法(比如布林带)
  • 每笔交易设置止损(价差继续扩大2倍阈值时止损)

3.4.3 执行细节

高频执行时,细节决定成败:

# 伪代码:配对交易执行逻辑
def pair_trading(symbol_a, symbol_b, spread_mean, spread_std):
    current_spread = get_current_spread(symbol_a, symbol_b)
    
    # 开仓条件
    if current_spread > spread_mean + 2 * spread_std:
        # 做空价差:卖A,买B
        sell(symbol_a, quantity)
        buy(symbol_b, quantity * hedge_ratio)
        
    elif current_spread < spread_mean - 2 * spread_std:
        # 做多价差:买A,卖B
        buy(symbol_a, quantity)
        sell(symbol_b, quantity * hedge_ratio)
    
    # 平仓条件
    if abs(current_spread - spread_mean) < 0.5 * spread_std:
        close_all_positions()

关键点:对冲比率(hedge_ratio)就是OLS回归的β系数。它决定了你买卖两个品种的数量比例,确保价差敞口中性。

3.5 知识体系总览

下面这张图,是我梳理的价差套利策略知识体系。你把它存下来,做策略时对照着看:

价差套利策略知识体系 统计套利原理 数学基础:协整与平稳性 检验方法 ADF检验 | Johansen检验 Engle-Granger两步法 策略实现 均值回归 | 配对交易 阈值设定 | 对冲比率 实战要素:品种选择 | 参数优化 | 执行细节 风险控制:止损 | 动态调整 | 资金管理

这张图把整个知识体系串起来了。从统计套利的原理出发,到协整检验的数学工具,再到均值回归和配对交易的具体实现,最后落到实战和风控。你每次做策略时,都可以拿这张图来对照,看看自己卡在哪一步。

3.6 我的实战心得

最后,分享几个我踩过的坑:

  • 协整关系会漂移:两个品种可能过去3年协整,但未来3个月就不协整了。我建议每周重新检验一次协整关系。
  • 交易成本是隐形杀手:高频配对交易,买卖双边的手续费和滑点,可能吃掉你一半利润。一定要在回测中计入真实成本。
  • 不要迷信历史回测:我见过太多漂亮的回测曲线,实盘一跑就崩。为什么?因为回测时你看到了未来信息。用walk-forward分析,别用全部数据回测。

一句话总结:统计套利不是印钞机,它是用数学工具捕捉市场短期失效的机会。协整是基础,均值回归是策略,风控是生命线。

好了,这一章的内容就到这里。你把这些原理吃透了,下一章我们讲如何用C++实现低延迟的价差计算引擎——那才是高频套利的硬核部分。

专注资料整理