协整理论:从定义到实战检验

协整,这个词听起来挺唬人的。说白了,它就是用来描述两个或多个非平稳时间序列之间,是否存在一种长期稳定的均衡关系。

我刚开始接触量化时,对协整的理解也很模糊。直到有一次,我在做股指期货的跨期套利,发现近月和远月合约的价格走势虽然各自飘忽不定,但它们的价差却总能在某个范围内来回摆动。嗯,这就是协整的典型表现。

协整的定义

先给个严谨的说法:如果两个或多个时间序列本身是非平稳的(比如随机游走),但它们的某个线性组合却是平稳的,那我们就说这些序列之间存在协整关系。

举个例子。你想想看,两只同行业的股票,比如茅台和五粮液。单看任何一只,价格都是随机游走的,今天涨明天跌,没法预测。但它们的价差呢?往往会在一个均值附近波动。价差大了,就会回归;价差小了,也会回归。这个价差,就是那个平稳的线性组合。

核心要点:

  • 单个序列非平稳(有单位根)
  • 线性组合平稳(无单位根)
  • 存在长期均衡关系

我个人习惯把协整理解为「绑在一起的橡皮筋」。两个价格虽然各自乱跑,但中间有根橡皮筋拉着,跑远了就会被拽回来。这就是套利机会的来源。

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检验 第一步:OLS回归估计 第二步:残差ADF检验 建立VAR模型 计算特征根与统计量 核心目标:找到平稳的线性组合

这张图把协整理论的三个核心模块串起来了。从定义出发,左边是Engle-Granger两步法,适合两变量场景;右边是Johansen检验,适合多变量场景。底部是它们共同的目标——找到那个平稳的线性组合。

总结一下:

  • 协整 ≠ 相关。相关高不一定协整,协整也不一定相关高。
  • Engle-Granger简单实用,适合入门和快速验证。
  • Johansen更强大,但需要你对VAR模型有一定了解。
  • 实际项目中,我建议两种方法都跑一下,互相验证。

好了,协整理论的核心内容就这些。记住,理论是死的,市场是活的。再完美的协整检验,也抵不过一次黑天鹅事件。所以,永远别忘了加止损。

专注资料整理