4. 协整关系与Engle-Granger两步法

4.1 协整到底在说什么?

咱们先聊个实际场景。

我刚开始做统计套利那会儿,总想着找两个走势相似的股票,然后做多一个、做空另一个。结果呢?亏得挺惨。后来我才明白,光看价格走势相似没用,得看它们之间有没有「协整关系」。

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

你想想看,股票价格本身是随机游走的,今天涨明天跌,根本没法预测。但如果两个股票的价格差(或者某个线性组合)是平稳的,那这个价差就会围绕一个均值来回波动。涨多了会跌回来,跌多了会涨回去。这就是套利机会的来源。

核心要点:协整 ≠ 相关性。两个高度相关的股票,可能根本没有协整关系。我见过太多人把相关系数高的股票对直接拿来套利,结果亏得找不着北。

4.2 经济学意义:为什么会有协整?

从经济学角度看,协整反映的是长期均衡关系

举个例子:

  • 贵州茅台和五粮液,都是白酒龙头。它们的价格可能短期有偏差,但长期来看,估值水平会趋于一致。
  • 黄金和白银,历史上价格比一直比较稳定。短期可能偏离,但最终会回归。
  • 沪深300指数期货和现货,理论上价差应该围绕零波动。

为什么会这样?因为有套利者在干活。当价差偏离到一定程度,套利者就会进场,把价差推回均衡位置。这就是协整背后的市场力量。

我的经验:我在做A股配对交易时,发现同行业的龙头和龙二最容易有协整关系。比如招商银行和兴业银行,格力电器和美的集团。但要注意,这种关系不是永恒的,公司基本面变了,协整可能就断了。

4.3 Engle-Granger两步法:手把手教你做检验

Engle-Granger两步法,名字听着唬人,其实逻辑特别简单。就两步:

  1. 第一步:用OLS回归估计协整系数
  2. 第二步:对残差做单位根检验

说白了,就是先找到两个序列的线性关系,然后看看这个关系的「误差」是不是平稳的。

4.3.1 第一步:OLS回归

假设我们有两个价格序列:y_tx_t。我们做回归:

y_t = α + β * x_t + ε_t

这里 β 就是对冲比率,ε_t 是残差。如果 ε_t 是平稳的,那 y_tx_t 就存在协整关系。

注意:回归时要注意方向。我习惯把流动性好的股票放在左边(y),流动性差的放在右边(x)。这样回归出来的β更稳定。曾经有一次我搞反了,结果回测效果一塌糊涂。

4.3.2 第二步:残差单位根检验

对残差 ε_t 做ADF检验。注意,这里不能用标准的ADF临界值,因为残差是从回归中估计出来的。不过别担心,statsmodels已经帮我们处理好了。

4.4 用statsmodels实现EG两步法

直接上代码,我习惯这么写:

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

def engle_granger_test(y, x):
    """
    Engle-Granger两步法协整检验
    y: 被解释变量(比如股票A的价格)
    x: 解释变量(比如股票B的价格)
    """
    # 第一步:OLS回归
    x_with_const = sm.add_constant(x)
    model = sm.OLS(y, x_with_const).fit()
    beta = model.params[1]  # 对冲比率
    alpha = model.params[0]  # 截距
    residuals = model.resid  # 残差
    
    # 第二步:对残差做ADF检验
    adf_result = adfuller(residuals, maxlag=1, autolag='AIC')
    adf_stat = adf_result[0]
    p_value = adf_result[1]
    critical_values = adf_result[4]
    
    # 判断是否协整
    is_cointegrated = p_value < 0.05
    
    return {
        'alpha': alpha,
        'beta': beta,
        'adf_statistic': adf_stat,
        'p_value': p_value,
        'critical_values': critical_values,
        'is_cointegrated': is_cointegrated,
        'residuals': residuals
    }

# 使用示例
# 假设我们有两只股票的价格数据
# stock_a = ...
# stock_b = ...
# result = engle_granger_test(stock_a, stock_b)
# print(f"对冲比率: {result['beta']:.4f}")
# print(f"ADF统计量: {result['adf_statistic']:.4f}")
# print(f"p值: {result['p_value']:.4f}")
# print(f"是否协整: {result['is_cointegrated']}")

4.5 协整检验的完整流程

下面这张图是我做协整检验时的标准流程,你可以参考:

协整检验完整流程 1. 数据准备 2. 单位根检验(ADF) 是否平稳? 不平稳 → 继续 3. OLS回归 4. 残差ADF检验 得出协整结论 关键点 • 两个序列必须同阶单整 • 残差检验用特殊临界值 • p值 < 0.05 才认为协整 • 协整关系可能随时间变化 • 建议滚动窗口重新检验

4.6 实战中的坑与经验

做EG两步法,有几个地方特别容易翻车:

常见问题 原因 解决办法
伪回归 两个不相关的非平稳序列,回归结果看起来很好 先做单位根检验,确认都是I(1)序列
协整关系断裂 公司基本面变化、政策调整等 用滚动窗口检验,比如每60天重新跑一次
滞后阶数选择 ADF检验的滞后阶数影响结果 用AIC或BIC自动选择,别拍脑袋定
样本期选择 样本太短检验不准确,太长可能包含结构变化 我一般用1-2年的日线数据

避坑指南:我曾经用EG两步法检验两只银行股,结果p值0.049,刚好在临界值附近。我以为是协整的,结果实盘亏了。后来发现是样本期选在了牛市,协整关系是假的。从那以后,我坚持用滚动窗口检验,并且要求p值至少小于0.01才进场。

4.7 小结

协整检验是统计套利的基石。没有协整,就没有均值回归,也就没有套利机会。

EG两步法虽然简单,但很实用。记住:先检验单整性,再做回归,最后检验残差。三步走,稳得很。

嗯,下一节我们会聊Johansen检验,那是处理多只股票协整关系的利器。不过今天先把EG两步法吃透,够你应付大部分场景了。


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