第四节:统计套利入门——均值回归假设、平稳性检验(ADF)、协整关系检验
各位同学,欢迎来到统计套利的第一课。
说实话,我刚入行那会儿,听到「统计套利」这四个字,第一反应是——这玩意儿是不是得数学博士才能搞?后来做多了才发现,核心思想其实特别朴素:两个东西价格差,不会永远偏离,迟早会回来。这就是我们今天要聊的「均值回归假设」。
4.1 均值回归假设:套利的底层信仰
什么叫均值回归?说白了就是:涨多了会跌,跌多了会涨。在价差交易里,我们赌的不是单边方向,而是「价差会回到历史均值附近」。
举个例子。我盯过螺纹钢和热卷这对兄弟。螺纹钢是建筑用的,热卷是工业用的。正常情况下,他俩价差在200块左右。有一年螺纹钢突然暴涨,价差拉到500多。我当时心里就咯噔一下——这不对劲。果然,两周后价差就缩回了250。这就是均值回归在起作用。
核心要点:
- 均值回归不是100%成立,而是一个统计概率
- 回归的时间窗口不确定,可能几天,也可能几个月
- 价差偏离越大,回归的概率越高,但风险也越大
你可能会问:怎么判断一个价差序列「会回归」?这就引出了我们的第一个检验工具——平稳性检验。
4.2 平稳性检验(ADF):判断序列是否「靠谱」
平稳性,听起来高大上,其实就一个意思:这个序列的统计性质(均值、方差)不随时间变化。如果价差序列是平稳的,那均值回归就有戏。如果非平稳,那价差可能越跑越远,套利就变成了接飞刀。
我个人习惯用ADF检验(Augmented Dickey-Fuller Test)。这是最常用的单位根检验方法。它的原假设是:序列存在单位根(即非平稳)。如果p值小于0.05,我们就拒绝原假设,认为序列是平稳的。
嗯,这里要注意:ADF检验对滞后阶数比较敏感。我刚开始用的时候,直接默认参数跑,结果p值忽大忽小,搞得我一头雾水。后来学乖了,用AIC或BIC自动选滞后阶数,结果稳定多了。
来看代码实现:
import pandas as pd
import numpy as np
from statsmodels.tsa.stattools import adfuller
import matplotlib.pyplot as plt
# 模拟一个价差序列(均值回归)
np.random.seed(42)
n = 500
epsilon = np.random.normal(0, 1, n)
spread = np.zeros(n)
spread[0] = 0
theta = 0.1 # 回归速度
for t in range(1, n):
spread[t] = spread[t-1] - theta * spread[t-1] + epsilon[t]
# ADF检验
result = adfuller(spread, autolag='AIC')
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')
print(f'临界值:')
for key, value in result[4].items():
print(f' {key}: {value:.4f}')
if result[1] < 0.05:
print('结论:序列平稳,均值回归假设成立')
else:
print('结论:序列非平稳,不适合直接套利')
输出结果:
ADF统计量: -6.2341
p值: 0.0000
临界值:
1%: -3.4435
5%: -2.8673
10%: -2.5699
结论:序列平稳,均值回归假设成立
避坑指南:
我曾经在实盘里犯过一个低级错误——用收盘价直接做ADF检验。收盘价通常是非平稳的(有趋势),结果p值很大,我以为是套利机会不好。后来才发现,应该用价差,而不是单个品种的价格。价差天然去掉了趋势,更容易平稳。
4.3 协整关系检验:两个品种的「长期默契」
好,现在我们知道单个价差序列要平稳。但问题是:两个品种的价格本身可能都不平稳,但它们的线性组合却可能是平稳的。这就是协整关系。
协整,说白了就是:两个变量虽然各自乱跑,但步调一致,不会走散。比如我常做的豆粕和菜粕,他俩价格走势高度相关,价差长期稳定在某个区间。这就是协整。
检验协整最常用的方法是Engle-Granger两步法:
- 第一步:用OLS回归,估计协整系数
- 第二步:对残差做ADF检验,看是否平稳
代码实现:
import statsmodels.api as sm
# 模拟两个协整序列
np.random.seed(123)
n = 500
z = np.cumsum(np.random.normal(0, 1, n)) # 共同趋势
x = z + np.random.normal(0, 0.5, n) # 品种A
y = z + np.random.normal(0, 0.5, n) # 品种B
# 第一步:OLS回归
X = sm.add_constant(x)
model = sm.OLS(y, X).fit()
residuals = model.resid
# 第二步:对残差做ADF检验
result_resid = adfuller(residuals, autolag='AIC')
print(f'残差ADF p值: {result_resid[1]:.4f}')
if result_resid[1] < 0.05:
print('结论:存在协整关系,可以构建价差组合')
hedge_ratio = model.params[1]
print(f'对冲比率: {hedge_ratio:.4f}')
else:
print('结论:不存在协整关系,放弃这对品种')
输出结果:
残差ADF p值: 0.0000
结论:存在协整关系,可以构建价差组合
对冲比率: 0.9876
重要提醒:
协整关系不是一成不变的。我见过太多人,去年检验出协整,今年直接拿来用,结果亏得底朝天。经济环境变了,品种的基本面变了,协整关系可能就断了。我建议每季度重新检验一次,或者用滚动窗口动态更新。
4.4 知识体系总览
来,我画了一张图,把今天的内容串起来。你一看就明白整个逻辑链条了。
这张图把今天的逻辑讲得很清楚了。你从「均值回归假设」出发,然后选择检验路径——要么直接检验价差平稳性,要么检验两个品种的协整关系。通过了,就构建组合;没通过,就换品种或者放弃。
4.5 实战中的几点体会
最后,分享几个我在实战中踩过的坑,希望对你有帮助:
- 样本量要够:ADF检验对样本量敏感,少于100个数据点,结果基本不可信。我一般用500个以上的日线数据。
- 小心结构突变:2015年股灾、2020年疫情,这些事件会打破原有的协整关系。遇到这种时期,我建议把数据分段检验。
- 不要过度优化:有些人为了得到漂亮的p值,反复调整参数。这是典型的过拟合。记住,检验是为了排除坏品种,不是为了证明某个品种好。
- 实盘前先模拟:我每次发现一对协整品种,都会先跑3个月的模拟交易。模拟能暴露很多检验阶段看不到的问题,比如滑点、流动性不足等。
本章小结:
统计套利的起点是均值回归假设。我们用ADF检验判断价差是否平稳,用协整检验判断两个品种是否有长期均衡关系。这两个工具,是量化套利者的基本功。熟练了,你就能从一堆品种里,快速筛选出真正能赚钱的配对。
公众号:蓝海资料掘金营,微信deep3321