3. 协整理论入门:直观理解、与相关的区别、单整阶数

协整(Cointegration)这个词,刚接触时容易觉得玄乎。我当年第一次听这个术语,以为是什么高深的数学魔法。其实说白了,它描述的是一个很直观的现象:两个看似随机漫步的变量,它们之间却存在一条隐形的「橡皮筋」。

你想想看,如果两条船在海上各自漂,但中间有根绳子连着。它们可能会分开,但绳子拉紧后又会弹回来。协整,就是这根绳子。

3.1 协整的直观理解

先看一个生活中的例子。假设你观察「上海机场」和「北京首都机场」的股价。两家公司业务相似,受同样的宏观经济影响。短期内,一只股票可能因为某个新闻涨得多一些,另一只跌得多一些。但长期来看,它们的价差会回归到一个均衡水平。

用数学语言说:如果两个时间序列 X_t 和 Y_t 都是非平稳的(比如随机游走),但它们的某个线性组合 Y_t - βX_t 是平稳的,那么我们就说 X_t 和 Y_t 是协整的。

核心思想:协整描述的是变量之间的长期均衡关系。短期可以偏离,但长期一定会回归。

我在做配对交易策略时,经常用这个性质。找到协整对,就等于找到了一个「均值回归」的价差。价差大了就做空,小了就做多。嗯,听起来简单,但实际筛选协整对时坑不少,后面会细说。

3.2 协整与相关的区别

这是新手最容易混淆的地方。我见过不少交易员,看到两个资产走势图长得像,就以为它们协整。其实,相关不等于协整。

举个例子:

  • 相关:A 涨的时候 B 也涨,A 跌的时候 B 也跌。这是短期同步性。
  • 协整:A 和 B 可以短期不同步,但长期价差必须稳定。这是长期均衡性。

更直白地说:两个随机游走序列,即使完全不相关,也可能在某个时间段内走势相似。但它们的价差会越走越远,不会回归。这就是伪回归的根源。

维度 相关性 协整性
关注点 短期同步变动 长期均衡关系
序列要求 无要求(平稳/非平稳均可) 必须同阶单整
数学本质 线性相关程度 残差平稳性
交易应用 不适合直接配对 配对交易核心

避坑指南:我曾经用相关系数筛选配对,结果回测漂亮,实盘亏惨。后来才发现,两个完全不相关的随机游走,在样本内也能算出高相关系数。记住:高相关 ≠ 协整,低相关 ≠ 不协整。

3.3 单整阶数的概念

要理解协整,必须先理解「单整」(Integration)。

一个时间序列,如果经过 d 次差分后变成平稳序列,我们就说它是 d 阶单整,记作 I(d)。

  • I(0):本身就是平稳序列。比如白噪声、均值回归的价差。
  • I(1):一阶差分后平稳。比如大多数股票价格、汇率。
  • I(2):二阶差分后平稳。比如某些价格指数、货币供应量。

为什么单整阶数重要?因为协整要求:所有参与协整的变量,必须是同阶单整的。

举个例子:

  • 如果 A 是 I(1),B 也是 I(1),它们可能协整。
  • 如果 A 是 I(1),B 是 I(2),它们不可能协整。

我个人的习惯是,拿到数据后先做单位根检验(ADF 检验),确认每个序列的单整阶数。这一步不能省,否则后面全是白费功夫。

小技巧:金融数据中,价格序列通常是 I(1),收益率序列是 I(0)。所以配对交易用的是价格,不是收益率。

3.4 知识体系框架

下面这张图总结了本章的核心逻辑。我建议你把它记在脑子里,后面几章都会用到。

协整理论入门知识框架 协整理论入门知识框架 协整 (Cointegration) 直观理解 与相关区别 单整阶数 长期均衡关系 均值回归性质 短期 vs 长期 伪回归风险 I(0) / I(1) / I(2) 同阶单整要求 核心:协整 ≠ 相关,协整要求同阶单整 + 残差平稳 配对交易的基础:找到协整对,利用价差均值回归获利

3.5 如何判断单整阶数

实际操作中,我们通常用 ADF 检验来判断单整阶数。流程很简单:

  1. 对原始序列做 ADF 检验。如果 p 值 < 0.05,拒绝单位根假设,序列是 I(0)。
  2. 如果不能拒绝,对序列做一阶差分,再检验差分后的序列。
  3. 如果一阶差分后平稳,则原序列是 I(1)。
  4. 如果还不平稳,继续差分,直到平稳为止。

下面是一个 Python 示例,演示如何判断单整阶数:

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

def check_integration_order(series, max_diff=2):
    """
    判断时间序列的单整阶数
    """
    for d in range(max_diff + 1):
        if d == 0:
            test_series = series
        else:
            test_series = series.diff(d).dropna()
        
        result = adfuller(test_series)
        p_value = result[1]
        
        print(f"差分阶数 d={d}, ADF p-value: {p_value:.4f}")
        
        if p_value < 0.05:
            print(f"→ 序列是 I({d})")
            return d
    
    print("→ 序列可能是 I(2) 或更高阶")
    return None

# 示例:模拟一个 I(1) 序列
np.random.seed(42)
random_walk = np.cumsum(np.random.randn(500))
series = pd.Series(random_walk)

check_integration_order(series)

输出结果大致如下:

差分阶数 d=0, ADF p-value: 0.4521
差分阶数 d=1, ADF p-value: 0.0000
→ 序列是 I(1)

个人经验:我一般设置最大差分阶数为 2。金融数据中 I(2) 很少见,如果遇到,我会怀疑数据本身有问题,或者需要做对数变换。

3.6 本章小结

协整理论是配对交易的基石。记住三个要点:

  • 协整是长期均衡,不是短期相关。
  • 协整要求同阶单整,I(1) 配 I(1),I(0) 配 I(0)。
  • 单整阶数用 ADF 检验判断,先测原始序列,不行就差分。