10、基差回归中的协整关系:Engle-Granger两步法、Johansen检验、误差修正模型(ECM)

聊到基差回归,有个概念绕不开——协整

说白了,就是两个看似随机游走的序列,它们之间却存在一种长期稳定的关系。基差就是这样。现货和期货各自涨跌,但价差总会回归。这不是巧合,而是协整在背后起作用。

我刚开始做基差交易时,犯过一个低级错误:直接用价格做回归,结果R²高得离谱,但一跑回测就亏钱。后来才明白,那是伪回归。两个非平稳序列硬凑在一起,统计上好看,实际上一塌糊涂。

所以,今天咱们就彻底搞懂协整。我会把Engle-Granger两步法、Johansen检验、误差修正模型(ECM)这三个工具讲透。都是实战中我反复用过的。

核心观点:基差回归的前提,是现货和期货之间存在协整关系。没有协整,一切回归都是空中楼阁。

10.1 协整的基本概念

先问一个问题:为什么两个随机游走的序列,它们的线性组合可以是平稳的?

举个例子。你牵着一条狗散步。狗跑来跑去(随机游走),你也走来走去(随机游走)。但狗绳的长度是固定的。狗离你太远,绳子就会把它拉回来。这个“绳子长度”就是协整关系。

在期货市场里,现货价格和期货价格就是那条狗和那个人。基差就是那根绳子。绳子不会无限拉长,总会回归。

协整的数学定义是这样的:

  • 如果两个时间序列 \( X_t \) 和 \( Y_t \) 都是 I(1)(一阶单整)
  • 但存在一个线性组合 \( Z_t = Y_t - \beta X_t \) 是 I(0)(平稳)
  • 那么 \( X_t \) 和 \( Y_t \) 就是协整的

嗯,这里要注意:协整的前提是单整阶数相同。如果一个是I(1),另一个是I(2),那它们不可能协整。我在项目中遇到过这种情况——螺纹钢现货和远月合约,单整阶数就不一样,硬做回归就是找死。

10.2 Engle-Granger两步法

这是最经典的协整检验方法。名字听着唬人,其实逻辑很简单。

第一步:估计长期关系

用普通最小二乘法(OLS)跑一个回归:

# Python示例:Engle-Granger第一步
import statsmodels.api as sm
import numpy as np

# 假设spot和futures是两个价格序列
spot = np.array([...])  # 现货价格
futures = np.array([...])  # 期货价格

# 回归:spot = alpha + beta * futures + epsilon
X = sm.add_constant(futures)
model = sm.OLS(spot, X).fit()
beta = model.params[1]
residuals = model.resid  # 这就是估计的基差

print(f"估计的beta系数: {beta:.4f}")

这一步得到的残差,就是我们估计的基差序列。注意,这个残差不是真实的基差(现货-期货),而是经过beta调整后的价差。

个人习惯:我一般会先做ADF检验,确认两个序列都是I(1)。别偷懒,这一步省了,后面全是错的。

第二步:检验残差的平稳性

对上一步的残差做ADF检验。如果残差是平稳的,就说明存在协整关系。

# Python示例:Engle-Granger第二步
from statsmodels.tsa.stattools import adfuller

adf_result = adfuller(residuals, maxlag=1)
p_value = adf_result[1]

if p_value < 0.05:
    print("残差平稳,存在协整关系")
else:
    print("残差不平稳,不存在协整关系")

这里有个坑:临界值不能用标准的ADF临界值。因为残差是估计出来的,不是真实值。Engle和Granger给出了专门的临界值表。不过现在统计软件都自动处理了,你直接用p值判断就行。

我曾经踩过的坑:有一次我用EG两步法检验豆粕和豆油的协整关系,ADF检验显示p=0.04,刚好显著。我兴冲冲地建了模型,结果实盘亏得一塌糊涂。后来发现,样本内刚好碰上了某个特殊行情,残差看起来平稳,但样本外根本不成立。所以,一定要做样本外验证

10.3 Johansen检验

EG两步法有个硬伤:它只能处理两个变量之间的协整关系。而且它假设协整向量只有一个。如果你有多个变量(比如同时考虑三个不同期限的期货合约),EG两步法就力不从心了。

这时候,Johansen检验就派上用场了。

Johansen检验的核心思想是:通过向量自回归(VAR)模型,检验协整向量的个数。它给出两个统计量:

  • 迹统计量(Trace Statistic):检验协整向量个数是否小于等于r
  • 最大特征值统计量(Max Eigenvalue Statistic):检验协整向量个数是否等于r
# Python示例:Johansen检验
from statsmodels.tsa.vector_ar.vecm import coint_johansen

# 假设data是一个包含多个价格序列的DataFrame
# 比如:['spot', 'futures_1m', 'futures_3m', 'futures_6m']
johansen_result = coint_johansen(data, det_order=0, k_ar_diff=1)

# 输出迹统计量
print("迹统计量:", johansen_result.lr1)
print("临界值(95%):", johansen_result.cvt[:, 1])

# 输出最大特征值统计量
print("最大特征值统计量:", johansen_result.lr2)
print("临界值(95%):", johansen_result.cvm[:, 1])

输出结果怎么看?我一般这样判断:

  • 如果迹统计量大于临界值,拒绝原假设,说明至少存在r+1个协整向量
  • 从r=0开始,依次往上检验,直到无法拒绝原假设为止

实战建议:Johansen检验对滞后阶数很敏感。我习惯用AIC或BIC准则选择最优滞后阶数。别用默认值,那通常是给时间序列课的学生准备的,不是给实战交易员用的。

10.4 误差修正模型(ECM)

好了,现在我们确认了协整关系。然后呢?

EG两步法告诉我们长期关系是什么。但短期偏离怎么修正?修正速度有多快?这就是ECM要回答的问题。

ECM的基本形式是这样的:

\[ \Delta Y_t = \alpha + \gamma \cdot Z_{t-1} + \sum_{i=1}^{p} \beta_i \Delta Y_{t-i} + \sum_{j=1}^{q} \delta_j \Delta X_{t-j} + \epsilon_t \]

其中 \( Z_{t-1} = Y_{t-1} - \beta X_{t-1} \) 就是上一期的基差偏离。\( \gamma \) 就是修正速度——它必须是负数,否则系统不会回归。

# Python示例:误差修正模型
import statsmodels.api as sm

# 假设我们已经从EG第一步得到了残差(基差偏离)
# residuals = spot - beta * futures

# 计算差分
d_spot = np.diff(spot)
d_futures = np.diff(futures)
z_lag = residuals[:-1]  # 滞后一期的基差偏离

# 构建ECM回归
X_ecm = sm.add_constant(np.column_stack([z_lag, d_futures]))
model_ecm = sm.OLS(d_spot, X_ecm).fit()

print(model_ecm.summary())
# 重点关注z_lag的系数,它应该是负的且显著

ECM的系数解读:

  • γ(修正速度):比如γ=-0.3,意味着上一期偏离的30%会在本期被修正。γ的绝对值越大,回归越快。
  • 短期动态项:ΔX的系数反映了短期冲击的传导效应。

我个人的经验:γ的绝对值一般在0.1到0.5之间。如果γ接近0,说明协整关系很弱,基差回归很慢,不适合做均值回归策略。如果γ接近-1,说明修正极快,但这种情况在期货市场很少见——通常意味着套利空间瞬间被抹平。

10.5 知识体系总览

说了这么多,咱们用一张图把整个逻辑串起来:

基差回归中的协整关系知识体系 输入:现货价格 + 期货价格 预处理:ADF检验确认单整阶数(必须都是I(1)) ↓ 选择检验方法 Engle-Granger两步法 Johansen检验 输出:协整向量 + 残差(基差) 输出:协整向量个数 + 协整关系 误差修正模型(ECM):量化回归速度

这张图把整个流程串起来了。你从左上角开始,先做ADF检验,然后根据变量个数选择EG两步法或Johansen检验,最后用ECM量化回归速度。每一步都有坑,但每一步也都有对应的解决方案。

10.6 实战中的几点提醒

最后,分享几个我在实战中总结的经验:

  1. 样本内拟合好,不代表样本外也能赚钱。协整关系会随时间变化。我一般每3个月重新估计一次协整系数。
  2. 不要迷信p值。p=0.049和p=0.051没有本质区别。结合经济意义判断,别只看统计显著性。
  3. ECM的修正速度γ,是策略参数的重要参考。γ太小,说明回归慢,持仓周期要拉长;γ太大,说明回归快,适合短线交易。
  4. 多品种协整时,Johansen检验比EG两步法更可靠。但Johansen检验对滞后阶数敏感,一定要做敏感性分析。

重要提醒:协整关系存在,不代表基差一定会回归到均值。它只说明长期来看,价差不会无限发散。但短期可能偏离很大,甚至持续很长时间。我见过一个品种,基差偏离了3个标准差,持续了2个月才回归。如果你仓位管理不好,早就爆仓了。

好了,协整这部分就聊到这儿。记住一句话:没有协整的基差回归,就是没有地基的高楼。下一节咱们会聊到如何用这些工具构建实际的交易策略,到时候这些概念都会用上。


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