协整理论入门:从直觉到实战

协整,这个词听起来挺唬人的。我第一次接触时也觉得玄乎。

说白了,协整就是描述两个或多个时间序列之间,存在一种长期稳定的关系。哪怕它们各自都在乱跑,但彼此之间的差距不会越拉越大。

举个例子。你想想看,一个人牵着一条狗散步。人走的路径可能忽左忽右,狗跑的轨迹更是上蹿下跳。但狗绳的长度是固定的。所以无论人和狗怎么折腾,他们之间的距离始终围绕绳子长度波动,不会无限扩大。

这就是协整的直观理解——两个变量各自不平稳,但它们的线性组合是平稳的。

核心要点:协整 ≠ 相关。相关描述的是同步性,协整描述的是长期均衡关系。两只股票可能完全不相关,但它们的价差却可能具有协整关系。

平稳性:协整的前提

聊协整之前,必须先搞懂平稳性。我见过太多人跳过这一步,结果模型一跑就崩。

平稳性,简单说就是一个时间序列的统计性质不随时间变化。均值恒定、方差恒定、自协方差只与时间间隔有关。

不平稳的序列长什么样?

  • 有明显的趋势(一直涨或一直跌)
  • 季节性波动(每年固定时间涨跌)
  • 随机游走(今天的价格 = 昨天的价格 + 随机扰动)

大多数金融价格序列都是不平稳的。你打开K线图看看,股价十年涨了十倍,均值一直在变,这显然不平稳。

我的经验:做统计套利时,我习惯先对每只标的做平稳性检验。如果序列本身是平稳的,那直接做均值回归策略就行,根本不需要协整。协整的价值,恰恰在于处理那些各自不平稳、但组合后变平稳的情况。

单位根检验:ADF检验

怎么判断一个序列是否平稳?最常用的方法是单位根检验。

单位根,你可以理解为「不平稳的根源」。如果一个时间序列模型的特征方程有单位根(即根为1),那这个序列就是不平稳的。

ADF检验(Augmented Dickey-Fuller Test)是检验单位根的标准工具。它的原假设是:序列存在单位根(即不平稳)。

检验逻辑很简单:

  • 如果p值小于显著性水平(通常0.05),拒绝原假设,序列平稳
  • 如果p值大于0.05,不能拒绝原假设,序列不平稳
# Python中的ADF检验示例
from statsmodels.tsa.stattools import adfuller

# 假设price是某只股票的价格序列
result = adfuller(price)
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')

if result[1] < 0.05:
    print('序列平稳,拒绝单位根假设')
else:
    print('序列不平稳,存在单位根')

注意:ADF检验对滞后阶数的选择比较敏感。我一般用AIC或BIC准则自动选择最优滞后阶数,而不是拍脑袋定一个固定值。曾经有一次我偷懒用了默认参数,结果把不平稳的序列误判为平稳,回测时亏了不少。

Engle-Granger两步法

这是最经典的协整检验方法。1987年由Engle和Granger提出,两人后来还拿了诺贝尔奖。

两步法,顾名思义,分两步走:

  1. 第一步:估计协整关系
    • 用OLS回归:y = α + βx + ε
    • 得到残差序列 ε
  2. 第二步:检验残差的平稳性
    • 对残差 ε 做ADF检验
    • 如果残差平稳,说明y和x存在协整关系

嗯,这里要注意。第一步回归得到的β就是协整系数,它代表两个序列之间的长期均衡关系。残差就是价差,也就是我们做统计套利时交易的对象。

# Engle-Granger两步法示例
import statsmodels.api as sm

# 第一步:回归
X = sm.add_constant(price_x)
model = sm.OLS(price_y, X).fit()
beta = model.params[1]
residuals = model.resid

# 第二步:检验残差平稳性
result = adfuller(residuals)
print(f'残差ADF检验p值: {result[1]:.4f}')

if result[1] < 0.05:
    print('存在协整关系,可以构建配对交易策略')
    print(f'协整系数 β = {beta:.4f}')
else:
    print('不存在协整关系,换个标的试试')

避坑指南:Engle-Granger两步法有个小毛病——第一步回归时,选择哪个变量作为y、哪个作为x会影响结果。我建议两个方向都试一下,选残差更平稳的那个组合。另外,这个方法只适用于两个变量之间的协整检验,变量多了就不灵了。

Johansen检验简介

当你要处理三个或更多变量时,Engle-Granger就不够用了。这时候需要Johansen检验。

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

它输出两个统计量:

  • 迹统计量(Trace Statistic):检验协整秩是否小于等于r
  • 最大特征值统计量(Max Eigenvalue Statistic):检验协整秩是否恰好为r

说白了,Johansen检验能告诉你:这些变量之间,到底存在几对协整关系。

# Johansen检验示例
from statsmodels.tsa.vector_ar.vecm import coint_johansen

# 假设data是一个包含多只股票价格的DataFrame
result = coint_johansen(data, det_order=0, k_ar_diff=1)

print('迹统计量:', result.lr1)
print('迹统计量临界值(95%):', result.cvt)
print('最大特征值统计量:', result.lr2)
print('最大特征值临界值(95%):', result.cvm2)

# 判断协整关系个数
r = 0
for i in range(len(result.lr1)):
    if result.lr1[i] > result.cvt[i]:
        r += 1
print(f'存在 {r} 个协整关系')

我的建议:做多标的统计套利时,我一般先用Johansen检验看看整体协整结构,再用Engle-Granger去确认具体的配对关系。两者结合使用,效果更好。Johansen检验对滞后阶数也很敏感,我习惯用信息准则多试几个阶数,选最稳定的那个。

本章知识体系

下面这张图,帮你理清协整理论的核心脉络:

协整理论入门 · 知识体系 协整理论 直观理解 长期均衡关系 平稳性 均值/方差恒定 ADF检验 单位根检验 价差回归 配对交易 趋势/季节 随机游走 p值判断 滞后阶数 Engle-Granger两步法 Johansen检验 两变量协整检验 OLS回归 + 残差ADF 多变量协整检验 VAR模型 + 特征根 核心:不平稳序列的线性组合可以变得平稳

这张图把协整理论的几个核心模块串起来了。从直观理解出发,到平稳性概念,再到ADF检验,最后引出两种主流检验方法。做统计套利时,这套流程基本够用了。

我个人习惯是先做Johansen检验看看全局,再用Engle-Granger精确定位具体的配对。两种方法各有优劣,配合使用才能发挥最大价值。

专注资料整理