1. 协整关系导论:协整的定义、伪回归问题、协整在量化交易中的意义
1.1 协整到底是个啥?
说实话,我刚入行那会儿,第一次听到「协整」这个词,脑子里蹦出来的是「斜着整」——心想这玩意儿是不是跟斜线有关系?后来被前辈拍了一下脑袋,才明白过来。
协整,英文叫 Cointegration,说白了就是:两个或多个非平稳的时间序列,它们的某种线性组合却是平稳的。
你想想看,单独看一只股票的价格,它可能像喝醉了酒一样到处乱晃,毫无规律。但如果你把两只股票的价格做个差值,这个差值反而变得规规矩矩、均值回归了。嗯,这就是协整的精髓。
核心定义:如果两个时间序列 X_t 和 Y_t 都是 I(1)(一阶单整),但存在一个系数 β,使得 Z_t = Y_t - βX_t 是 I(0)(平稳序列),那么我们就说 X_t 和 Y_t 之间存在协整关系。
我在项目中遇到过不少新手,一上来就问我:「老师,那相关性不就是协整吗?」我每次都得耐心解释:相关性看的是短期同步性,协整看的是长期均衡关系。两个完全不相关的序列,也可能存在协整关系——比如黄金和白银,短期走势可能各走各的,但长期来看,它们的价差总会回到某个合理区间。
1.2 伪回归问题——一个坑了我两个月的教训
伪回归,英文叫 Spurious Regression。这玩意儿有多坑?我曾经在早期做策略回测时,把两只完全不相关的股票做了回归分析,结果 R² 高达 0.85,t 统计量也显著。我当时兴奋得不行,以为发现了新大陆。
结果呢?实盘一跑,亏得亲妈都不认识。
为什么会这样?因为两个独立的随机游走序列,你拿去做回归,大概率会得到「显著」的结果。这不是因为它们真的有关系,纯粹是统计上的幻觉。
避坑指南:我曾经犯过一个低级错误——直接用价格序列做回归,然后看 R² 和 t 值来判断关系。后来被导师骂了一顿,才明白非平稳序列之间做回归,必须先用协整检验。记住:高 R² 不等于有关系,低 R² 不等于没关系。
伪回归的典型特征:
- R² 非常高(通常 > 0.8)
- Durbin-Watson 统计量非常低(接近 0)
- 残差序列明显非平稳(有趋势或周期性)
你想想看,如果我把中国股市的收盘价和纽约的降雨量做回归,大概率也能得到「显著」结果——但这有意义吗?没有。这就是伪回归的荒谬之处。
1.3 协整在量化交易中的意义
好了,前面说了那么多理论,咱们来点实际的。协整在量化交易里到底能干啥?
我个人习惯把协整策略叫做「配对交易」的升级版。传统的配对交易看的是相关性,但相关性会变——今天高度相关的两只股票,明天可能就分道扬镳了。而协整关系,看的是长期均衡,更稳定。
具体来说,协整策略的核心逻辑是:
- 找到协整对:比如贵州茅台和五粮液,它们的价格长期存在均衡关系
- 计算价差:Z_t = Y_t - βX_t,这个价差应该是平稳的
- 设定阈值:当价差偏离均值超过 2 倍标准差时,开仓
- 等待回归:价差回归到均值附近时,平仓获利
实战小技巧:我建议你在选协整对时,优先考虑同一行业、业务模式相似的股票。比如银行股之间、保险股之间,协整关系往往更稳定。跨行业的配对,比如茅台和特斯拉,虽然也可能协整,但逻辑上说不通,实盘容易翻车。
协整策略的优势很明显:
- 市场中性:无论大盘涨跌,只要价差回归,就能赚钱
- 低回撤:因为做的是均值回归,回撤通常可控
- 可解释性强:每一笔交易都有明确的逻辑支撑
但也要注意,协整关系不是一成不变的。公司基本面变了、行业政策调整了,协整关系可能就断了。所以,我一般每 3 个月重新检验一次协整关系,确保策略还在「有效期内」。
1.4 本章知识体系总览
下面这张图,是我自己画的一个知识框架,帮你理清协整的核心脉络:
这张图把协整的三个核心模块串起来了。从左到右,先理解定义,再警惕伪回归,最后应用到量化交易中。每一步都环环相扣,缺一不可。
1.5 一个简单的协整检验示例
光说不练假把式。下面我用 Python 演示一下协整检验的基本流程。这段代码我用了很多年,基本没改过。
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller, coint
# 模拟两个协整序列
np.random.seed(42)
T = 500
# 共同趋势
common_trend = np.cumsum(np.random.randn(T))
# 两个序列
X = common_trend + np.random.randn(T) * 0.5
Y = common_trend + np.random.randn(T) * 0.5 + 2 # 有截距
# 做协整检验
score, pvalue, _ = coint(Y, X)
print(f'协整检验统计量: {score:.4f}')
print(f'p值: {pvalue:.4f}')
if pvalue < 0.05:
print('结论:存在协整关系(拒绝原假设)')
else:
print('结论:不存在协整关系(无法拒绝原假设)')
# 计算价差
# 先做回归估计协整系数
X_const = sm.add_constant(X)
model = sm.OLS(Y, X_const).fit()
beta = model.params[1]
alpha = model.params[0]
spread = Y - (alpha + beta * X)
# 价差平稳性检验
adf_result = adfuller(spread)
print(f'\n价差ADF检验p值: {adf_result[1]:.4f}')
这段代码做了三件事:生成两个协整序列、做 Engle-Granger 两步法检验、计算价差并验证平稳性。你跑一遍就会发现,p 值通常远小于 0.05,说明协整关系确实存在。
个人习惯:我一般不会只看 coint 函数的 p 值,还会额外做一步 ADF 检验,双重确认。毕竟实盘资金不是闹着玩的,多一道验证就少一分风险。
好了,这一章的内容就到这里。协整的概念、伪回归的坑、以及它在量化交易中的价值,我都尽量用大白话讲清楚了。下一章我们会深入 Engle-Granger 两步法的具体实现,到时候我会手把手带你写代码。
公众号:蓝海资料掘金营,微信deep3321