协整理论:从定义到实战检验
协整,这个词听起来挺唬人的。说白了,它就是用来描述两个或多个非平稳时间序列之间,是否存在一种长期稳定的均衡关系。
我刚开始接触量化时,对协整的理解也很模糊。直到有一次,我在做股指期货的跨期套利,发现近月和远月合约的价格走势虽然各自飘忽不定,但它们的价差却总能在某个范围内来回摆动。嗯,这就是协整的典型表现。
协整的定义
先给个严谨的说法:如果两个或多个时间序列本身是非平稳的(比如随机游走),但它们的某个线性组合却是平稳的,那我们就说这些序列之间存在协整关系。
举个例子。你想想看,两只同行业的股票,比如茅台和五粮液。单看任何一只,价格都是随机游走的,今天涨明天跌,没法预测。但它们的价差呢?往往会在一个均值附近波动。价差大了,就会回归;价差小了,也会回归。这个价差,就是那个平稳的线性组合。
核心要点:
- 单个序列非平稳(有单位根)
- 线性组合平稳(无单位根)
- 存在长期均衡关系
我个人习惯把协整理解为「绑在一起的橡皮筋」。两个价格虽然各自乱跑,但中间有根橡皮筋拉着,跑远了就会被拽回来。这就是套利机会的来源。
Engle-Granger两步法
这是最经典的协整检验方法,也是我最早学会的方法。步骤很简单,就两步。
第一步:估计长期均衡关系
假设我们有两支股票,X和Y。先做回归:
Y = α + β * X + ε
这里的β就是所谓的「对冲比率」。我建议你用OLS(普通最小二乘法)来估计这个方程。得到残差序列ε,它代表的就是价差。
我的经验:在实际项目中,我通常会先做一下相关性分析。如果相关性太低(比如低于0.7),那协整的可能性就不大。别浪费时间。
第二步:检验残差的平稳性
对残差序列ε做单位根检验,最常用的是ADF检验(Augmented Dickey-Fuller test)。
from statsmodels.tsa.stattools import adfuller
import numpy as np
# 假设我们已经有了残差序列 residuals
result = adfuller(residuals)
p_value = result[1]
if p_value < 0.05:
print("残差平稳,存在协整关系")
else:
print("残差不平稳,不存在协整关系")
这里要注意,ADF检验的临界值需要调整。因为残差是从回归中估计出来的,不是原始数据。statsmodels库会自动处理这个问题,但如果你自己手写代码,记得查一下Engle-Granger专用的临界值表。
避坑指南:我曾经犯过一个低级错误——直接用原始数据的ADF临界值来判断残差。结果发现很多明明有协整关系的配对,检验却通不过。后来查资料才知道,残差的ADF检验要用更严格的临界值。嗯,这个坑我替你们踩过了。
Johansen检验
Engle-Granger两步法有个明显的局限:它只能处理两个变量之间的协整关系。如果你有三只、四只甚至更多股票,那就得用Johansen检验了。
Johansen检验的核心思想,是基于向量自回归模型(VAR)。它通过检验特征根的个数,来判断存在多少个协整向量。
检验统计量
Johansen检验提供两种统计量:
| 统计量 | 用途 | 判断方式 |
|---|---|---|
| 迹统计量(Trace) | 检验协整向量的个数 | 迹统计量 > 临界值 → 拒绝原假设 |
| 最大特征值统计量(Max-Eigen) | 检验第r+1个协整向量是否存在 | 最大特征值 > 临界值 → 拒绝原假设 |
我个人习惯先看迹统计量。如果迹统计量显示有2个协整向量,那最大特征值统计量通常会给出同样的结论。两者不一致的情况很少见,但如果遇到了,我倾向于相信迹统计量。
Python实现
from statsmodels.tsa.vector_ar.vecm import coint_johansen
import pandas as pd
# 假设我们有3只股票的数据,存在data DataFrame中
# 列名:'stock_A', 'stock_B', 'stock_C'
data = pd.DataFrame({
'stock_A': [...],
'stock_B': [...],
'stock_C': [...]
})
# 进行Johansen检验
# det_order=1 表示包含常数项,k_ar_diff=1 表示滞后阶数
result = coint_johansen(data, det_order=1, k_ar_diff=1)
# 输出迹统计量
print("迹统计量:", result.lr1)
print("临界值(95%):", result.cvt[:, 1])
# 输出最大特征值统计量
print("最大特征值统计量:", result.lr2)
print("临界值(95%):", result.cvm[:, 1])
一个小技巧:Johansen检验对滞后阶数很敏感。我一般会用AIC或BIC准则来选择最优滞后阶数。别用默认值,那通常不是最优的。
两种方法的对比
| 对比维度 | Engle-Granger两步法 | Johansen检验 |
|---|---|---|
| 变量数量 | 仅限两个变量 | 两个及以上变量 |
| 实现难度 | 简单,两步搞定 | 较复杂,需要理解VAR |
| 检验能力 | 只能检验是否存在协整 | 能检验协整向量的个数 |
| 小样本表现 | 较好 | 偏差较大 |
| 适用场景 | 配对交易 | 多资产组合、篮子套利 |
你想想看,如果你只做两只股票的配对交易,Engle-Granger完全够用。但如果你要做一篮子股票的统计套利,那就必须上Johansen了。
知识体系结构图
下面这张图,是我自己总结的协整理论知识体系。你可以把它当作一个快速索引。
这张图把协整理论的三个核心模块串起来了。从定义出发,左边是Engle-Granger两步法,适合两变量场景;右边是Johansen检验,适合多变量场景。底部是它们共同的目标——找到那个平稳的线性组合。
总结一下:
- 协整 ≠ 相关。相关高不一定协整,协整也不一定相关高。
- Engle-Granger简单实用,适合入门和快速验证。
- Johansen更强大,但需要你对VAR模型有一定了解。
- 实际项目中,我建议两种方法都跑一下,互相验证。
好了,协整理论的核心内容就这些。记住,理论是死的,市场是活的。再完美的协整检验,也抵不过一次黑天鹅事件。所以,永远别忘了加止损。