4. 协整关系与Engle-Granger两步法
4.1 协整到底在说什么?
咱们先聊个实际场景。
我刚开始做统计套利那会儿,总想着找两个走势相似的股票,然后做多一个、做空另一个。结果呢?亏得挺惨。后来我才明白,光看价格走势相似没用,得看它们之间有没有「协整关系」。
协整,说白了就是:两个非平稳的时间序列,它们的线性组合是平稳的。
你想想看,股票价格本身是随机游走的,今天涨明天跌,根本没法预测。但如果两个股票的价格差(或者某个线性组合)是平稳的,那这个价差就会围绕一个均值来回波动。涨多了会跌回来,跌多了会涨回去。这就是套利机会的来源。
核心要点:协整 ≠ 相关性。两个高度相关的股票,可能根本没有协整关系。我见过太多人把相关系数高的股票对直接拿来套利,结果亏得找不着北。
4.2 经济学意义:为什么会有协整?
从经济学角度看,协整反映的是长期均衡关系。
举个例子:
- 贵州茅台和五粮液,都是白酒龙头。它们的价格可能短期有偏差,但长期来看,估值水平会趋于一致。
- 黄金和白银,历史上价格比一直比较稳定。短期可能偏离,但最终会回归。
- 沪深300指数期货和现货,理论上价差应该围绕零波动。
为什么会这样?因为有套利者在干活。当价差偏离到一定程度,套利者就会进场,把价差推回均衡位置。这就是协整背后的市场力量。
我的经验:我在做A股配对交易时,发现同行业的龙头和龙二最容易有协整关系。比如招商银行和兴业银行,格力电器和美的集团。但要注意,这种关系不是永恒的,公司基本面变了,协整可能就断了。
4.3 Engle-Granger两步法:手把手教你做检验
Engle-Granger两步法,名字听着唬人,其实逻辑特别简单。就两步:
- 第一步:用OLS回归估计协整系数
- 第二步:对残差做单位根检验
说白了,就是先找到两个序列的线性关系,然后看看这个关系的「误差」是不是平稳的。
4.3.1 第一步:OLS回归
假设我们有两个价格序列:y_t 和 x_t。我们做回归:
y_t = α + β * x_t + ε_t
这里 β 就是对冲比率,ε_t 是残差。如果 ε_t 是平稳的,那 y_t 和 x_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 协整检验的完整流程
下面这张图是我做协整检验时的标准流程,你可以参考:
4.6 实战中的坑与经验
做EG两步法,有几个地方特别容易翻车:
| 常见问题 | 原因 | 解决办法 |
|---|---|---|
| 伪回归 | 两个不相关的非平稳序列,回归结果看起来很好 | 先做单位根检验,确认都是I(1)序列 |
| 协整关系断裂 | 公司基本面变化、政策调整等 | 用滚动窗口检验,比如每60天重新跑一次 |
| 滞后阶数选择 | ADF检验的滞后阶数影响结果 | 用AIC或BIC自动选择,别拍脑袋定 |
| 样本期选择 | 样本太短检验不准确,太长可能包含结构变化 | 我一般用1-2年的日线数据 |
避坑指南:我曾经用EG两步法检验两只银行股,结果p值0.049,刚好在临界值附近。我以为是协整的,结果实盘亏了。后来发现是样本期选在了牛市,协整关系是假的。从那以后,我坚持用滚动窗口检验,并且要求p值至少小于0.01才进场。
4.7 小结
协整检验是统计套利的基石。没有协整,就没有均值回归,也就没有套利机会。
EG两步法虽然简单,但很实用。记住:先检验单整性,再做回归,最后检验残差。三步走,稳得很。
嗯,下一节我们会聊Johansen检验,那是处理多只股票协整关系的利器。不过今天先把EG两步法吃透,够你应付大部分场景了。
公众号:蓝海资料掘金营,微信deep3321