第4章 协整理论入门:从相关到因果的跨越

说实话,我刚入行做配对交易那会儿,踩过最大的坑就是——把「相关」当「协整」。

那时候我看到两只股票走势图长得一模一样,兴奋得不行,直接开仓。结果呢?价差越走越远,亏得我怀疑人生。后来我才明白,相关不等于协整,这个坑,我希望你别再踩一次。

4.1 什么是协整?

协整(Cointegration),说白了就是:两个或多个非平稳的时间序列,它们的线性组合是平稳的

听起来有点绕?我换个说法。

你想想看,一个醉汉牵着一条狗走路。醉汉走得东倒西歪(非平稳),狗也跑得忽左忽右(非平稳)。但狗绳的长度是固定的——所以狗和醉汉之间的距离,始终在一个范围内波动(平稳)。

这个「距离」就是协整关系。

在金融里,两只股票的价格可能各自随机游走(非平稳),但它们之间的价差可能是平稳的。这就是我们做配对交易的基础。

核心定义: 如果两个时间序列 X_t 和 Y_t 都是 I(1)(一阶单整),且存在某个系数 β 使得 Z_t = Y_t - βX_t 是 I(0)(平稳),则称 X_t 和 Y_t 具有协整关系。

4.2 协整与相关的区别

这个区别太重要了,我专门做个表格给你看。

维度 相关性 协整性
关注点 短期同步性 长期均衡关系
数据要求 平稳序列即可 必须是非平稳序列
数学本质 线性相关程度 线性组合的平稳性
典型例子 两只股票同涨同跌 价差围绕均值回归
陷阱 伪相关(如冰淇淋销量与溺水人数) 伪回归(两个无关的随机游走)

我记得有一次,一个学员拿了两只银行股给我看,相关系数0.95,问我能不能做配对。我让他先做协整检验,结果发现根本不协整。为什么?因为两只股票虽然走势像,但价差一直在发散,没有回归的「拉力」。

相关是「看起来像」,协整是「本质上绑在一起」。 这个区别,值十万块钱。

4.3 Engle-Granger两步法

这是最经典的协整检验方法,也是我最早学会的方法。步骤很简单,就两步。

第一步:估计协整回归

假设我们要检验 X 和 Y 是否协整。先做回归:

Y_t = α + βX_t + ε_t

得到残差序列 ε_t。这个残差,就是「价差」的估计值。

第二步:检验残差的平稳性

对残差 ε_t 做 ADF 检验(单位根检验)。如果残差是平稳的,就说明 X 和 Y 协整。

import statsmodels.api as sm
import numpy as np

# 假设 X 和 Y 是价格序列
X = np.random.randn(100).cumsum()  # 模拟随机游走
Y = 2 * X + np.random.randn(100)   # 协整关系

# 第一步:回归
X_const = sm.add_constant(X)
model = sm.OLS(Y, X_const).fit()
residuals = model.resid

# 第二步:ADF检验
adf_result = sm.tsa.stattools.adfuller(residuals)
print(f'ADF统计量: {adf_result[0]:.4f}')
print(f'p值: {adf_result[1]:.4f}')

if adf_result[1] < 0.05:
    print('残差平稳,存在协整关系')
else:
    print('残差不平稳,不存在协整关系')
我的经验: 做EG两步法时,记得用「不带常数项」的ADF检验试试。有时候带常数项不通过,去掉反而通过了。我在实盘里遇到过这种情况,多试几种设定没坏处。

4.4 Johansen检验简介

EG两步法有个局限——它只能检验两个序列之间是否存在协整关系。如果你手里有三只、四只股票呢?这时候就要用Johansen检验了。

Johansen检验的核心思想是:基于向量自回归(VAR)模型,通过特征根检验来判断协整关系的个数

说白了,EG是「一对一」,Johansen是「一对多」。

from statsmodels.tsa.vector_ar.vecm import coint_johansen

# 假设 data 是包含多只股票价格的DataFrame
# data = pd.DataFrame({'A': ..., 'B': ..., 'C': ...})

# Johansen检验
result = coint_johansen(data, det_order=0, k_ar_diff=1)

print('特征值:', result.eig)
print('迹统计量:', result.lr1)
print('5%临界值:', result.cvt)

# 判断协整关系个数
for i in range(len(result.lr1)):
    if result.lr1[i] > result.cvt[i, 1]:  # 5%显著性水平
        print(f'拒绝H{i}: 至少有{i+1}个协整关系')
    else:
        print(f'不能拒绝H{i}: 最多有{i}个协整关系')
        break
注意: Johansen检验对滞后阶数很敏感。我建议用AIC或BIC准则选择最优滞后阶数,别用默认值。我曾经因为滞后阶数选错,把协整关系从2个误判成0个,白白错过了一个好策略。

4.5 本章知识体系

下面这张图,是我自己总结的协整理论知识框架。每次做配对交易前,我都会过一遍这个流程。

协整理论知识体系 协整:非平稳序列的线性组合平稳 相关 vs 协整 伪回归陷阱 Engle-Granger两步法 Johansen检验 Step1: 协整回归 Step2: ADF检验残差 VAR模型设定 特征根检验 配对交易策略:价差回归均值

这张图把整个协整理论串起来了。从核心概念出发,到区分相关与协整,再到两种检验方法,最后落到配对交易应用。我建议你把它保存下来,每次做策略前看一眼。

4.6 避坑指南

最后,分享几个我踩过的坑。

  • 不要只看相关系数。 相关系数高不代表协整,我见过相关系数0.99但价差越走越远的案例。
  • 注意数据频率。 日线数据协整,不代表分钟线也协整。我建议先用日线做筛选,再用小时线验证。
  • 小心结构突变。 2015年股灾后,很多原本协整的股票对都「脱钩」了。定期重新检验协整关系,别一劳永逸。
  • 样本外验证。 在样本内找到协整关系不难,难的是样本外依然有效。我习惯用前70%数据做检验,后30%做验证。

嗯,协整理论就讲到这里。记住一句话:协整是配对交易的灵魂,没有协整,就没有均值回归的保证。

专注资料整理