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}')
我的小技巧:做ADF检验时,我一般会同时看统计量和临界值。如果统计量比1%的临界值还小,那基本可以放心了。另外,autolag参数建议用'AIC',让模型自动选择最优滞后阶数。

4.2 Engle-Granger两步法

这是最经典的协整检验方法,由Engle和Granger在1987年提出。步骤很简单,就两步。

第一步:用OLS回归估计协整关系。比如我们有两个序列Y和X,先做回归:Y = α + βX + ε。得到残差序列ε。

第二步:对残差序列ε做ADF检验。如果残差是平稳的,就说明Y和X存在协整关系。

我曾经用这个方法做沪深300和上证50的配对交易。当时发现残差序列的ADF检验p值只有0.003,心里就有底了。后来实盘跑了三个月,年化收益15%左右,回撤控制在3%以内。

避坑指南:我曾经犯过一个错误——直接用原始价格做回归,忽略了可能存在的时间趋势。结果残差看起来平稳,但实际上是因为趋势项被误认为协整关系。后来我养成了习惯:做EG两步法之前,先检查序列是否包含确定性趋势,必要时加入时间趋势项。
# 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} 个协整关系')
关于滞后阶数的选择:Johansen检验对滞后阶数非常敏感。我一般用AIC或BIC准则来选择最优滞后阶数。如果数据是日频,滞后阶数通常在1-5之间。选多了会损失自由度,选少了可能遗漏自相关。

4.4 协整关系的经济含义

协整关系不仅仅是数学上的概念,它有很强的经济含义。说白了,协整反映的是市场中的「均衡关系」。

举个例子:假设我们做多A股、做空H股的同股同权标的。理论上,同一家公司的A股和H股应该同涨同跌,因为它们对应的是同一份资产。但现实中,由于市场情绪、流动性等因素,两者会出现价差。这个价差就是偏离均衡的部分。

协整关系告诉我们:这个价差不会无限扩大,最终会回归到均值附近。这就是统计套利的理论基础。

协整关系的经济含义总结:
  • 长期均衡:两个或多个经济变量之间存在稳定的比例关系
  • 短期偏离:市场摩擦导致短期偏离,但不会持久
  • 均值回归:偏离会以某种速度回归均衡
  • 套利机会:利用偏离-回归的过程获取收益

我记得有一次做能源板块的配对交易,发现中石油和中石化的价差在2014-2015年期间出现了长达半年的偏离。很多人以为协整关系失效了,但实际上是因为油价暴跌导致了两者的基本面分化。嗯,这里要提醒大家:协整关系不是永恒的,它可能因为结构性变化而断裂。

重要提醒:协整关系是统计意义上的,不是因果意义上的。两个序列协整,不代表它们有因果关系。比如冰淇淋销量和溺水人数可能协整,但这是因为它们都受温度影响。做统计套利时,一定要理解背后的经济逻辑,不要盲目相信统计结果。

最后说一句:协整检验是统计套利的「入场券」。没有协整关系,后面的所有策略都是空中楼阁。我建议大家在实盘之前,至少用滚动窗口的方式检验协整关系的稳定性。如果协整关系时有时无,那这个策略就不值得投入真金白银。