第四章:协整检验——平稳性检验(ADF)、协整关系检验(Engle-Granger、Johansen)

各位同学,欢迎来到第四章。前面我们讲了价差序列的构建,但有个核心问题:你怎么知道这对品种的价差是「靠谱」的?会不会今天看着有规律,明天就彻底跑偏了?

嗯,这就是协整检验要干的事。说白了,就是用量化手段判断两个(或多个)时间序列之间,是否存在长期稳定的线性关系。如果存在,那价差套利就有了理论基础;如果不存在,那所谓的「价差回归」可能就是幻觉。

我个人习惯把协整检验分成两步走:先看单序列是否平稳,再看多序列是否协整。咱们一步步来。

4.1 平稳性检验(ADF检验)

先问个问题:为什么套利交易者这么在意「平稳性」?

因为不平稳的序列,均值会漂移。你想想看,如果价差的均值今天在0,明天跑到10,后天又跳到-5,那你用什么标准去判断「偏离」?没法判断。所以,我们首先要确认价差序列本身是平稳的——围绕一个固定均值波动,波动幅度也大致稳定。

ADF检验(Augmented Dickey-Fuller Test)是最常用的平稳性检验工具。它的原假设是:序列存在单位根(即不平稳)。如果p值小于0.05,我们就拒绝原假设,认为序列是平稳的。

核心要点:

  • ADF检验的p值 < 0.05 → 序列平稳
  • ADF检验的p值 ≥ 0.05 → 序列不平稳,需要差分
  • 对于价差套利,我们通常希望价差本身是平稳的

我在项目中遇到过这样的情况:两个品种的价差看起来挺漂亮,回测收益也很高,但ADF检验的p值高达0.3。我当时心存侥幸,觉得「差不多就行」,结果实盘跑了两个月,价差均值直接漂移了3个标准差,亏得我头皮发麻。从那以后,我再也不敢跳过ADF检验了。

下面是一个Python实现的ADF检验示例:

import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import adfuller

# 假设我们有两个价格序列
price_a = pd.Series([...])  # 品种A的价格
price_b = pd.Series([...])  # 品种B的价格

# 计算价差
spread = price_a - 1.5 * price_b

# 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检验。价格序列几乎都是不平稳的,这很正常。我们要检验的是「价差」或「残差」的平稳性,不是价格本身。记住,协整关系是价格之间的线性组合,不是价格本身。

4.2 协整关系检验(Engle-Granger两步法)

好,现在我们知道单个序列要平稳。但套利交易涉及两个品种,我们需要检验它们之间是否存在协整关系。

Engle-Granger两步法是最直观的方法。它的思路很简单:

  1. 第一步:用OLS回归估计协整系数(也就是对冲比率)
  2. 第二步:对回归残差做ADF检验,看残差是否平稳

如果残差是平稳的,就说明两个序列之间存在协整关系。就这么简单。

你想想看,这背后的逻辑是什么?如果两个价格序列的线性组合(残差)是平稳的,那就意味着它们之间存在一个长期均衡关系。短期可能会偏离,但长期一定会回归。这就是套利的基础。

import statsmodels.api as sm

# 第一步:OLS回归估计协整系数
X = sm.add_constant(price_b)
model = sm.OLS(price_a, X).fit()
hedge_ratio = model.params[1]  # 对冲比率
intercept = model.params[0]    # 截距项

print(f'对冲比率: {hedge_ratio:.4f}')
print(f'截距项: {intercept:.4f}')

# 计算残差
residuals = price_a - intercept - hedge_ratio * price_b

# 第二步:对残差做ADF检验
result_resid = adfuller(residuals, autolag='AIC')
print(f'残差ADF p值: {result_resid[1]:.4f}')

if result_resid[1] < 0.05:
    print('✅ 存在协整关系,可以进行配对交易')
else:
    print('❌ 不存在协整关系,换个品种组合试试')

⚠️ 注意:Engle-Granger方法有个缺陷——它假设协整关系是单向的(A对B的回归)。如果你反过来做回归(B对A),可能会得到不同的对冲比率。我个人习惯两种方向都试一下,选残差更平稳的那个。

4.3 协整关系检验(Johansen检验)

Engle-Granger方法只能处理两个品种,而且只能找出一组协整关系。但实际交易中,我们可能同时监控3个、4个甚至更多品种。这时候就需要Johansen检验了。

Johansen检验基于向量自回归(VAR)模型,可以同时检验多个时间序列之间是否存在协整关系,还能告诉你存在几组协整关系。它的输出包括两个统计量:迹统计量和最大特征值统计量。

我记得第一次用Johansen检验时,看到输出结果有点懵——什么「r=0」「r≤1」「r≤2」,一堆假设检验。后来我总结了一个简单的判断方法:从r=0开始看,如果p值小于0.05,就说明至少存在一组协整关系;然后看r≤1,如果p值也小于0.05,就说明至少存在两组,以此类推。

from statsmodels.tsa.vector_ar.vecm import coint_johansen

# 准备数据矩阵(多列)
data_matrix = pd.DataFrame({
    'asset_a': price_a,
    'asset_b': price_b,
    'asset_c': price_c  # 可以加入第三个品种
})

# Johansen检验
# det_order: 0表示没有确定性趋势,1表示有截距项
# k_ar_diff: 差分阶数,通常选1或2
johansen_result = coint_johansen(data_matrix, det_order=0, k_ar_diff=1)

print('=== Johansen检验结果 ===')
print(f'迹统计量: {johansen_result.lr1}')
print(f'迹统计量临界值(95%): {johansen_result.cvt[:, 1]}')
print(f'最大特征值统计量: {johansen_result.lr2}')
print(f'最大特征值临界值(95%): {johansen_result.cvm[:, 1]}')

# 判断协整关系个数
trace_significant = johansen_result.lr1 > johansen_result.cvt[:, 1]
print(f'显著协整关系个数: {sum(trace_significant)}')

实用建议:

  • 两个品种的配对交易:用Engle-Granger就够了,简单直观
  • 三个及以上品种的篮子交易:用Johansen检验,它能告诉你完整的协整结构
  • 如果Johansen检验显示存在多组协整关系,选残差方差最小的那组作为交易信号

4.4 本章知识体系图

下面我用一张SVG图来总结本章的核心逻辑,方便你理解整个协整检验的流程:

协整检验核心流程 第一步:数据准备 获取两个或多个品种价格序列 第二步:ADF检验 检验单个序列是否平稳 第三步:协整检验 EG或Johansen方法 两个品种? 选择检验方法 Engle-Granger两步法 OLS回归 → 残差ADF检验 Johansen检验 VAR模型 → 迹/特征值检验 结果判断 p值 < 0.05 → 存在协整关系 → 可套利

4.5 实战中的注意事项

讲完了理论和方法,我再分享几个实战中容易踩的坑:

经验分享:

  • 数据频率要匹配:我曾经用日线数据做协整检验,然后跑到5分钟级别去做交易,结果发现协整关系根本不成立。不同频率的数据,协整关系可能完全不同。建议检验和交易用同一频率的数据。
  • 滚动窗口检验:协整关系不是一成不变的。我习惯用滚动窗口(比如60个交易日)定期重新检验,一旦发现协整关系消失,立即停止交易。
  • 不要过度优化:有些同学为了得到「好看」的检验结果,反复调整参数。这种做法很危险。协整检验应该是客观的,p值是多少就是多少,不要为了交易而强行凑出协整关系。

⚠️ 重要提醒:协整检验通过,不代表一定能赚钱。它只是告诉你两个品种之间存在长期均衡关系,但短期偏离的幅度、回归的速度、交易成本等因素都会影响实际收益。检验是必要条件,不是充分条件。

好了,第四章的内容就到这里。协整检验是套利交易的基石,花时间把这块搞扎实了,后面的策略构建才能站得住脚。记住我那句老话:检验不过关,实盘两行泪。


公众号:蓝海资料掘金营,微信deep3321