5、统计套利基础:均值回归假设检验、平稳性检验(ADF)、协整关系检验(Engle-Granger)
做基差交易的朋友,一定听过「统计套利」这个词。说白了,统计套利就是找两个品种之间的「不正常关系」,赌它们会回归正常。但这里有个核心问题——你怎么知道它们的关系是「不正常」的?又怎么判断它们一定会回归?
嗯,这就引出了我们今天要聊的三个核心工具:均值回归假设检验、平稳性检验(ADF)、协整关系检验(Engle-Granger)。我个人习惯把这套流程叫做「统计套利的三板斧」,少了哪一斧,策略都可能翻车。
核心逻辑一句话:只有通过了平稳性检验,你才能谈均值回归;只有通过了协整检验,你才能做配对交易。顺序不能乱,一步错步步错。
5.1 均值回归假设检验——先别急着上模型
很多人一上来就搞ADF、搞协整,其实第一步应该先问自己一个问题:这个价差序列,看起来像不像会回归的样子?
我刚开始做基差交易时,犯过一个低级错误。当时看到螺纹钢和热卷的价差波动很大,觉得肯定有机会。结果跑完ADF发现是平稳的,但实盘一做就亏。为什么?因为那个价差虽然平稳,但回归速度极慢,半年才回一次均值,资金成本早就把利润吃光了。
所以,均值回归假设检验,说白了就是「肉眼+统计」双重验证。我个人习惯先画图,看看价差是不是围绕某个水平线上下波动。如果看起来像随机游走,那基本没戏。
常用的统计方法包括:
- 自相关函数(ACF)图:如果ACF快速衰减到0,说明有均值回归倾向;如果衰减很慢,可能是随机游走。
- 游程检验(Runs Test):检验序列是否随机。如果拒绝随机性假设,说明存在某种趋势或回归模式。
- 方差比检验:比较不同时间尺度下的方差变化,判断是否存在均值回归。
我的小技巧:先画价差图,用肉眼扫一遍。如果价差在大部分时间都围绕0轴波动,偶尔偏离但很快回来,那大概率有均值回归特征。如果价差像喝醉了酒一样到处乱飘,那后面的检验基本不用做了。
5.2 平稳性检验(ADF)——别被「伪回归」骗了
平稳性检验,是统计套利的「守门员」。为什么这么说?因为如果你用非平稳序列做回归,结果全是假的——这就是著名的「伪回归」问题。
我记得有一次帮朋友看一个策略,他用两个股票的价格直接做回归,R²高达0.95,开心得不行。我问他:「你做过平稳性检验吗?」他愣住了。结果一测,两个序列都是非平稳的,那个0.95的R²纯粹是巧合。你想想看,这种策略实盘能赚钱才怪。
ADF检验(Augmented Dickey-Fuller Test)是最常用的平稳性检验方法。它的核心思想很简单:
- 原假设H₀:序列存在单位根(非平稳)
- 备择假设H₁:序列不存在单位根(平稳)
如果ADF统计量小于临界值(通常取1%、5%或10%显著性水平),就拒绝原假设,认为序列是平稳的。
具体操作时,我一般这样处理:
- 先对原始价差序列做ADF检验
- 如果p值大于0.05,说明非平稳,需要差分
- 对一阶差分后的序列再做ADF检验
- 如果一阶差分后平稳,说明序列是I(1)过程
# Python代码示例:ADF检验
from statsmodels.tsa.stattools import adfuller
# 假设spread是价差序列
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检验对滞后阶数的选择很敏感。我建议用AIC或BIC自动选择滞后阶数,不要手动指定。另外,如果序列有趋势项,记得在检验时加上「常数项+趋势项」选项,否则结果可能不准。
5.3 协整关系检验(Engle-Granger)——配对交易的核心
好,现在我们已经确认了价差是平稳的。但问题来了:如果我只做一个品种,价差平稳可以直接交易。但如果是两个品种的配对交易呢?比如螺纹钢和热卷,它们各自的绝对价格可能都是非平稳的,但它们的线性组合可能是平稳的——这就是协整。
协整关系检验,说白了就是回答一个问题:这两个品种之间,是否存在长期均衡关系?
Engle-Granger两步法是经典方法,步骤很简单:
- 第一步:用OLS回归估计两个序列的长期关系,得到残差序列
- 第二步:对残差序列做ADF检验,判断残差是否平稳
如果残差是平稳的,说明两个序列存在协整关系。这时候,你就可以放心地做配对交易了——当价差偏离均值时,做多被低估的、做空被高估的,等待价差回归。
# Python代码示例:Engle-Granger协整检验
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller
# 假设price1和price2是两个品种的价格序列
# 第一步:OLS回归
X = sm.add_constant(price2)
model = sm.OLS(price1, X).fit()
residuals = model.resid
# 第二步:对残差做ADF检验
result = adfuller(residuals, autolag='AIC')
print(f'残差ADF统计量: {result[0]:.4f}')
print(f'残差p值: {result[1]:.4f}')
if result[1] < 0.05:
print('结论:残差平稳,存在协整关系')
else:
print('结论:残差不平稳,不存在协整关系')
实战经验:我在做黑色系基差交易时,发现螺纹钢和热卷的协整关系非常稳定,但铁矿石和螺纹钢的协整关系就弱很多。为什么?因为铁矿石是原料,螺纹钢是成品,中间还有焦炭、电费等成本变量。所以,选配对品种时,尽量选产业链上位置相近的品种。
5.4 三个检验的实战顺序
很多新手会问:这三个检验到底先做哪个?我直接给答案:
| 步骤 | 检验内容 | 目的 | 如果失败怎么办 |
|---|---|---|---|
| 1 | 均值回归假设检验 | 初步判断价差是否有回归倾向 | 换品种或放弃该策略 |
| 2 | ADF平稳性检验 | 确认序列是否平稳,避免伪回归 | 差分处理或换时间频率 |
| 3 | Engle-Granger协整检验 | 确认配对品种的长期均衡关系 | 换配对组合或调整参数 |
我个人习惯的顺序是:先画图看均值回归,再跑ADF,最后做协整。每一步都像筛子,筛掉不合格的品种,留下的才是真正值得交易的。
避坑指南:我曾经在协整检验上吃过亏——用日线数据检验通过了,但换成小时线就不行。后来发现,协整关系在不同时间频率下可能不同。所以,建议你在目标交易频率下做检验。做日线交易就用日线数据检验,做小时线交易就用小时线数据检验。
好了,关于统计套利的基础检验,今天就聊到这里。记住一句话:检验做扎实了,策略才站得住脚。别嫌麻烦,这些步骤省了,亏的钱可不会省。