4、协整性检验:单位根检验(ADF检验)、Engle-Granger两步法、Johansen检验、协整关系的经济含义
协整性检验,说白了就是判断两个或多个时间序列之间是否存在长期稳定的关系。在统计套利里,这是最核心的一步。你想想看,如果我们找到的两只股票只是短期走势相似,但长期来看各走各的,那做配对交易就是找死。
我个人习惯把协整检验比作「婚姻关系检验」。两个序列如果协整,就像一对夫妻,虽然平时会吵架(短期偏离),但最终还是会和好(回归均值)。如果不协整,那就是路人,擦肩而过就再也不见了。
4.1 单位根检验(ADF检验)
ADF检验,全称Augmented Dickey-Fuller检验。它是协整检验的基石。为什么?因为协整的前提是:每个序列本身都是非平稳的(有单位根),但它们的线性组合是平稳的。
我在项目中遇到过不少新手,上来就对两个平稳序列做协整检验,结果发现根本做不了。嗯,这里要注意:如果两个序列都是平稳的,那它们本身就是均值回归的,不需要协整。如果一个是平稳的,另一个是非平稳的,那它们也不可能协整。
ADF检验的原假设是「序列存在单位根」(即非平稳)。p值小于0.05,就拒绝原假设,认为序列平稳。
- ADF检验用于判断单个序列是否平稳
- 协整检验要求所有序列都是同阶单整(比如都是I(1))
- p值 < 0.05 → 拒绝单位根假设 → 序列平稳
# Python中的ADF检验示例
from statsmodels.tsa.stattools import adfuller
# 对股票价格序列做ADF检验
result = adfuller(stock_price, autolag='AIC')
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')
print(f'临界值: {result[4]}')
# 如果p值 > 0.05,说明序列非平稳,需要做差分
if result[1] > 0.05:
print('序列非平稳,需要差分')
diff_price = stock_price.diff().dropna()
result_diff = adfuller(diff_price)
print(f'一阶差分后p值: {result_diff[1]:.4f}')
4.2 Engle-Granger两步法
这是最经典的协整检验方法,由Engle和Granger在1987年提出。步骤很简单,就两步。
第一步:用OLS回归估计协整关系。比如我们有两个序列Y和X,先做回归:Y = α + βX + ε。得到残差序列ε。
第二步:对残差序列ε做ADF检验。如果残差是平稳的,就说明Y和X存在协整关系。
我曾经用这个方法做沪深300和上证50的配对交易。当时发现残差序列的ADF检验p值只有0.003,心里就有底了。后来实盘跑了三个月,年化收益15%左右,回撤控制在3%以内。
# Engle-Granger两步法实现
import statsmodels.api as sm
# 第一步:OLS回归
X = sm.add_constant(price_x) # 添加常数项
model = sm.OLS(price_y, X).fit()
residuals = model.resid
# 第二步:对残差做ADF检验
result = adfuller(residuals, autolag='AIC')
print(f'残差ADF检验p值: {result[1]:.4f}')
if result[1] < 0.05:
print('存在协整关系!可以构建配对交易策略')
else:
print('不存在协整关系,换个标的试试')
4.3 Johansen检验
EG两步法有个明显的局限:它只能处理两个序列之间的协整关系。如果你有三个、四个甚至更多序列,EG两步法就力不从心了。这时候就需要Johansen检验。
Johansen检验基于向量自回归模型(VAR),可以同时检验多个序列之间是否存在多个协整关系。它给出两个统计量:迹统计量和最大特征值统计量。
我个人习惯用迹统计量来判断协整关系的个数。比如迹统计量显示「r ≤ 1」的p值大于0.05,那就说明最多存在1个协整关系。
| 检验方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| EG两步法 | 两个序列 | 简单直观,计算快 | 只能处理一对序列 |
| Johansen检验 | 多个序列(≥2) | 可检验多个协整关系 | 计算复杂,对滞后阶数敏感 |
# Johansen检验示例
from statsmodels.tsa.vector_ar.vecm import coint_johansen
# 假设我们有三个价格序列:price1, price2, price3
data = pd.concat([price1, price2, price3], axis=1)
# 进行Johansen检验
johansen_result = coint_johansen(data, det_order=0, k_ar_diff=1)
# 输出迹统计量结果
print('迹统计量:', johansen_result.lr1)
print('临界值(90%, 95%, 99%):', johansen_result.cvt)
print('最大特征值统计量:', johansen_result.lr2)
print('临界值(90%, 95%, 99%):', johansen_result.cvm)
# 判断协整关系个数
trace_stat = johansen_result.lr1
crit_vals = johansen_result.cvt[:, 1] # 95%临界值
r = sum(trace_stat > crit_vals)
print(f'存在 {r} 个协整关系')
4.4 协整关系的经济含义
协整关系不仅仅是数学上的概念,它有很强的经济含义。说白了,协整反映的是市场中的「均衡关系」。
举个例子:假设我们做多A股、做空H股的同股同权标的。理论上,同一家公司的A股和H股应该同涨同跌,因为它们对应的是同一份资产。但现实中,由于市场情绪、流动性等因素,两者会出现价差。这个价差就是偏离均衡的部分。
协整关系告诉我们:这个价差不会无限扩大,最终会回归到均值附近。这就是统计套利的理论基础。
- 长期均衡:两个或多个经济变量之间存在稳定的比例关系
- 短期偏离:市场摩擦导致短期偏离,但不会持久
- 均值回归:偏离会以某种速度回归均衡
- 套利机会:利用偏离-回归的过程获取收益
我记得有一次做能源板块的配对交易,发现中石油和中石化的价差在2014-2015年期间出现了长达半年的偏离。很多人以为协整关系失效了,但实际上是因为油价暴跌导致了两者的基本面分化。嗯,这里要提醒大家:协整关系不是永恒的,它可能因为结构性变化而断裂。
最后说一句:协整检验是统计套利的「入场券」。没有协整关系,后面的所有策略都是空中楼阁。我建议大家在实盘之前,至少用滚动窗口的方式检验协整关系的稳定性。如果协整关系时有时无,那这个策略就不值得投入真金白银。