3. 价差套利策略设计:统计套利原理、协整与平稳性、均值回归策略、配对交易策略
好,咱们直接进入正题。价差套利,说白了就是利用两个相关资产之间的价格偏离来赚钱。很多人一听到「套利」就觉得是捡钱,其实没那么简单。我做了这么多年高频,见过太多人死在价差回归的路上。
这一章,我会把统计套利的底层逻辑、数学工具、实战策略全盘托出。你跟着我的思路走,保证能搭建出一套能跑的策略框架。
3.1 统计套利的底层逻辑
传统套利是「无风险」的,比如同一只股票在两个交易所的价格差。但统计套利不一样——它赌的是价格关系会回归历史均值。说白了,这是一种概率游戏。
我个人习惯把统计套利分成三步:
- 找关系:找到两个长期保持稳定关系的品种
- 算价差:计算它们的价差,并判断是否偏离正常范围
- 赌回归:在偏离时开仓,等回归时平仓
你想想看,如果两个品种的价差像橡皮筋一样,拉远了总会弹回来,那我们就赚这个弹回来的钱。但问题是——橡皮筋可能拉断。这就是风险。
核心要点:统计套利不是无风险套利,它是「高概率回归」的博弈。你需要用数学工具来量化这个概率。
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两步法:
- 用OLS回归估计协整系数:price_a = β * price_b + ε
- 对残差ε做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 知识体系总览
下面这张图,是我梳理的价差套利策略知识体系。你把它存下来,做策略时对照着看:
这张图把整个知识体系串起来了。从统计套利的原理出发,到协整检验的数学工具,再到均值回归和配对交易的具体实现,最后落到实战和风控。你每次做策略时,都可以拿这张图来对照,看看自己卡在哪一步。
3.6 我的实战心得
最后,分享几个我踩过的坑:
- 协整关系会漂移:两个品种可能过去3年协整,但未来3个月就不协整了。我建议每周重新检验一次协整关系。
- 交易成本是隐形杀手:高频配对交易,买卖双边的手续费和滑点,可能吃掉你一半利润。一定要在回测中计入真实成本。
- 不要迷信历史回测:我见过太多漂亮的回测曲线,实盘一跑就崩。为什么?因为回测时你看到了未来信息。用walk-forward分析,别用全部数据回测。
一句话总结:统计套利不是印钞机,它是用数学工具捕捉市场短期失效的机会。协整是基础,均值回归是策略,风控是生命线。
好了,这一章的内容就到这里。你把这些原理吃透了,下一章我们讲如何用C++实现低延迟的价差计算引擎——那才是高频套利的硬核部分。