3. 配对交易的核心逻辑:协整关系的数学定义与统计检验,如何找到“天生一对”的股票对

配对交易,说白了就是找两只“步调一致”的股票。你涨我也涨,你跌我也跌。但光步调一致还不够——关键是要看它们分开后,会不会再回到一起。这就是协整关系要干的事。

我刚开始做配对交易时,犯过一个低级错误:直接拿两只同行业的股票,算个相关系数就上了。结果呢?价差越走越远,亏得我头皮发麻。后来我才明白,相关系数高不代表它们会“回来”。协整,才是那个“回来”的数学保证。

3.1 协整的数学定义:别被公式吓到

协整的数学定义其实不复杂。我尽量用大白话讲清楚。

假设有两只股票的价格序列:X_tY_t。它们各自都是“随机游走”——也就是非平稳的。但如果我们能找到一组系数 (1, -β),使得它们的线性组合:

Z_t = Y_t - β * X_t

变成一个平稳序列,那我们就说 X_tY_t 是协整的。

嗯,这里要注意:平稳是什么意思?就是 Z_t 的均值、方差不会随时间改变,它会围绕一个固定值上下波动。说白了,价差不会飘走,它会回归。

核心要点: 协整 ≠ 高相关。两只股票可以相关系数只有0.6,但协整关系很稳;也可以相关系数0.95,但根本不协整。我见过太多人把相关当协整,结果亏得底裤都不剩。

3.2 如何检验协整?三步走

我个人习惯用 Engle-Granger 两步法。为什么?简单、直观、好解释。你想想看,给老板汇报时,你总不能搬出一堆矩阵特征值吧?

第一步:用OLS估计协整系数

Y_tX_t 做回归:

Y_t = α + β * X_t + ε_t

这里的 β 就是我们需要的对冲比率。残差 ε_t 就是价差序列。

第二步:对残差做单位根检验

常用的方法是 ADF 检验(Augmented Dickey-Fuller)。原假设是:残差存在单位根(即非平稳)。如果 p 值小于 0.05,我们就拒绝原假设,认为残差是平稳的——也就是协整关系成立。

第三步:确定交易阈值

如果协整成立,我们就用残差的均值和标准差来设定开仓、平仓线。一般做法是:

  • 价差偏离均值 2 个标准差 → 开仓
  • 价差回归到均值附近 → 平仓
  • 价差偏离 3 个标准差 → 止损

我的经验: 别死磕 2 个标准差。我做过回测,有些股票对用 1.5 个标准差效果更好。市场波动大的时候,2 个标准差可能一年都开不了几次仓。建议你先跑一遍历史数据,看看最优阈值是多少。

3.3 代码实现:用Python找“天生一对”

下面是我常用的协整检验代码。你直接拿去用就行。

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

def find_cointegrated_pairs(data, p_value_threshold=0.05):
    """
    在股票池中寻找所有协整对
    data: DataFrame, 每列是一只股票的价格序列
    """
    n = data.shape[1]
    pairs = []
    
    for i in range(n):
        for j in range(i+1, n):
            # 取两只股票的价格
            stock1 = data.iloc[:, i]
            stock2 = data.iloc[:, j]
            
            # OLS回归:stock2 = α + β * stock1
            X = sm.add_constant(stock1)
            model = sm.OLS(stock2, X).fit()
            beta = model.params[1]
            
            # 计算残差(价差)
            spread = stock2 - beta * stock1
            
            # ADF检验
            adf_result = adfuller(spread, maxlag=1)
            p_value = adf_result[1]
            
            if p_value < p_value_threshold:
                pairs.append((data.columns[i], data.columns[j], beta, p_value))
    
    return pairs

这段代码会遍历所有股票对,找出协整关系显著的组合。返回的结果里包含了股票名称、对冲比率和 p 值。

避坑指南: 我曾经用这段代码跑全市场3000只股票,结果跑出来2000多对“协整”的。为什么?多重比较问题!你想想看,3000只股票两两组合,光随机噪声就能产生不少假阳性。我的建议是:要么用 Bonferroni 校正,要么先用行业筛选缩小范围。

3.4 协整 vs 相关:一张图说清楚

我画了一张图,帮你直观理解协整和相关的区别。

协整 vs 相关:本质区别 高相关,但非协整 两条线走势相似 但价差越走越远 ✗ 不能做配对交易 协整关系 两条线纠缠在一起 价差围绕均值波动 ✓ 适合做配对交易 关键:协整保证价差会回归,相关不保证

你看左边那张图,两只股票走势很像吧?但价差一直在扩大,永远不会回来。这就是高相关但非协整的典型。右边才是我们想要的——价差来回摆动,像橡皮筋一样。

3.5 实际选股中的注意事项

光靠统计检验还不够。我在实战中总结了几条经验:

  1. 行业要相同:两只银行股比银行和科技股更容易协整。逻辑上讲得通——它们受同样的宏观因素影响。
  2. 市值要接近:大银行和小银行的波动特征不同,协整关系不稳定。
  3. 流动性要好:我吃过亏,选了一只小盘股,开仓后半天成交不了,滑点吃掉所有利润。
  4. 样本期要够长:至少1年以上的日线数据。用3个月的数据跑出来的协整,大概率是过拟合。

一个小技巧: 我习惯用滚动窗口检验协整的稳定性。比如每3个月重新检验一次,如果某对股票连续多个窗口都通过检验,那才是真正的“天生一对”。

3.6 协整的局限性

说实话,协整不是万能的。它有几个硬伤:

  • 结构突变:公司并购、行业政策变化,都可能让原本协整的关系破裂。我遇到过最惨的一次,两只银行股协整了5年,突然因为一次监管新规,价差再也没回来。
  • 滞后性:协整检验用的是历史数据,但未来不一定重复历史。说白了,它是个后视镜。
  • 交易成本:协整策略通常需要频繁调仓,如果交易成本太高,利润会被吃掉。

所以我的建议是:协整是选股的第一步,但不是唯一的一步。用它筛选出候选股票对后,还要结合基本面、市场情绪等因素做最终决策。

好了,这一章的内容就到这里。记住一句话:协整保证的是“会回来”,而不是“什么时候回来”。耐心,是做配对交易最重要的品质。


专注资料整理