【维克】配对交易:两只股票的“引力波“

0 阅读14分钟

【维克】配对交易:两只股票的"引力波"

前言

在量化交易的所有策略类型里,有一类策略特别"反直觉"——它不关心大盘涨还是跌,不关心个股涨还是跌,它只关心一件事:两只股票之间的关系,偏离了正常水平没有。

这类策略叫配对交易(Pairs Trading)。

它的逻辑极其优雅:找两只"应该同涨同跌"的股票,当它们的价格关系出现异常偏离时,做多被低估的那只、做空被高估的那只,等价差回归时平仓赚钱。你不需要预测市场方向,只需要预测"关系会修复"。

听起来完美。但现实没有完美的策略。2015年,很多A股配对交易者用万科和保利做配对,结果万科因为宝能举牌事件单边暴涨,价差再也没有回归——这就是配对交易最大的风险:你以为的"稳定关系",可能在一夜之间彻底破裂。

这篇文章,从配对交易的底层原理讲起,带你走完品种选择、协整检验、信号设计、仓位管理、风控监控的完整链路。每一步都有代码和参数参考,帮你把这个"最优雅的量化策略"真正落地。

Why:配对交易为什么是最优雅的量化策略?

可口可乐与百事可乐的故事

1985年,华尔街量化先驱Nunzio Tartaglia的团队发现了一个现象:可口可乐和百事可乐的股价走势,虽然各自波动剧烈,但它们之间的价差总是围绕一个均值来回震荡。

当可口可乐比百事可乐贵了"太多",就卖空可口可乐、买入百事可乐——等价差回归平仓赚钱。当价差回归甚至反转后,百事可乐比可口可乐贵了"太多",反向操作。

这个策略后来被称为"配对交易",是量化交易史上最经典、最优雅的策略之一。

它优雅在哪?三个核心优势:

1. 市场中性:不赌涨跌

做多一只+做空另一只,市场的系统性风险(beta)基本对冲掉了。大盘暴跌?两只股票跌得差不多,你的配对头寸几乎不受影响。大盘暴涨?两只都涨,对冲后也没多少净暴露。你赚的是"价差回归"的钱,不是"市场涨跌"的钱。

2. 风险可控:波动率低

单只股票的年化波动率通常在20-30%,但两只相关股票的价差波动率只有5-8%。为什么?因为同行业的系统性波动被对冲掉了,剩下的只是两只股票之间的"相对偏差"——这个偏差通常很小、很稳定。

3. 逻辑直觉:基本面有支撑

同行业的两只股票,受相同的基本面驱动——行业政策、原材料价格、需求变化。它们的估值逻辑相似,价格应该维持某种稳定的关系。当这个关系暂时偏离时,回归是有基本面逻辑支撑的,不是纯统计游戏。

但优雅不等于安全

2005-2015年,A股市场最经典的配对之一是万科和保利——同属房地产行业龙头,市值规模接近,业务模式相似。两只股票的价差长期稳定,配对交易者靠这个组合赚了不少钱。

然后2015年底,宝能系开始举牌万科。万科股价因为股权争夺事件单边暴涨,和保利的价差急剧扩大。如果你在价差扩大的过程中不断加仓"等回归",你会亏到怀疑人生——因为这一次,价差再也没回来。

这就是配对交易最致命的风险:关系破裂。 你以为的"稳定关系"可能因为公司事件(并购、重组、造假暴雷)、行业格局变化(政策颠覆、技术革命)或市场结构变化(流动性枯竭、规则改变)而彻底失效。

历史上最著名的配对交易灾难,是2007年的长期资本管理公司(LTCM)。虽然LTCM的策略远比简单配对复杂,但核心逻辑相似——赌关系回归。当俄罗斯债务危机导致市场极端分化时,价差不仅没有回归,反而继续扩大,最终导致这家由诺贝尔经济学奖得主坐镇的基金在几周内亏损46亿美元,险些引发全球金融系统崩溃。

What:配对交易的核心原理

基本假设:价格之间有"引力"

配对交易的假设用一句话说:两只相关资产的价格,就像被一根橡皮筋连着——暂时拉开会弹回来。

用数学语言描述:

Y(t) = α + β × X(t) + ε(t)

• Y、X:两只资产的价格

• α:截距(固定的价格偏移)

• β:对冲比率(Y相对X的价格倍数)

• ε(t):残差——这就是我们交易的"价差"

当ε(t)偏离其均值时,橡皮筋被拉长了,我们入场赌它弹回来。当ε(t)回归均值时,平仓获利。

关键区分:相关性 ≠ 协整性

很多人以为"两只股票相关性高就可以做配对",这是错误的。

相关性衡量的是"涨跌方向是否一致"——两只股票每天同涨同跌,相关性就高。但即使相关性高达0.95,它们的价差也可能一直在扩大(只是扩大的速度很稳定)。

协整性衡量的是"价差是否稳定"——两只股票的价差是否围绕一个均值来回震荡,偏离了会不会自动回归。

只有协整的配对才能做配对交易。高相关不等于协整。

举个例子:你和朋友每天从同一个出发点去上班,路线不同但方向一致——你们的路径相关性很高。但如果你的朋友换了工作,新公司比旧公司远10公里,你们的路径虽然还是高度相关,但"距离差"这个指标永久性地变了。相关性还在,但"距离差的均值回归"已经不存在了。

收益来源

配对交易赚的是两种钱:

1. Alpha剥离(价差回归收益)

当两只股票的相对估值偏离后回归,你赚的是alpha——与市场涨跌无关的超额收益。这是配对交易的核心收益来源,也是它被称为"市场中性策略"的原因。

2. 风险对冲(beta中性收益)

做多一只+做空另一只,市场beta基本对冲。即使大盘暴跌5%,只要两只股票跌的幅度差不多,你的配对头寸几乎不受影响。

收益的天花板:价差回归的幅度有限(通常几个百分点),所以配对交易是低收益、低风险的策略——年化收益通常5-15%,波动率5-8%,夏普比率反而可能很高(1.2-2.0)。

配对品种的选择标准

选对品种是配对交易成功的一半。三个核心标准,缺一不可:

1. 行业相关(基本面锚定)

同行业的股票受相同基本面驱动——行业政策、原材料价格、需求变化。价格关系有经济逻辑支撑,偏离后回归的动力更强。

经典配对:

• 银行股:工行 vs 建行、招行 vs 平银

• 白酒:茅台 vs 五粮液(但注意茅台长期溢价问题)

• 券商:中信 vs 海通

• 能源:中石油 vs 中石化

2. 估值逻辑相似(排除"同行业不同命")

市值规模、盈利模式、财务杠杆要接近。大行 vs 城商行虽然都是银行,但估值逻辑差异巨大——大行受宏观经济影响大,城商行受地方经济影响大,价差的稳定性远不如大行之间。

3. 历史价差平稳(实证验证)

这是最重要的标准——不管行业多相关、估值多相似,如果历史价差不平稳(ADF检验不通过),这个配对就是无效的。

三个标准的关系:行业相关和估值逻辑相似是"先验条件",帮你缩小候选范围。历史价差平稳是"实证条件",最终决定这个配对能不能用。

配对交易 vs 单纯做多

| 维度 | 配对交易 | 单纯做多 | | --- | --- | --- | | 市场暴露 | 接近中性 | 完全暴露 | | 年化收益 | 5-15% | 取决于市场环境 | | 波动率 | 5-8% | 15-25% | | 最大回撤 | 10-20% | 30-50% | | 夏普比率 | 1.2-2.0 | 0.3-0.8 | | 容量 | 有限(价差流动性约束) | 大 | | 做空要求 | 必须有 | 不需要 |

A股的特殊挑战:A股做空困难——融券成本高(年化8-10%)、券源不稳定、很多股票根本没有融券标的。纯配对交易在A股执行受限。实务中的常见变体:

• 伪配对:只做多被低估的那只,不卖空被高估的。放弃了市场中性,但执行简单。

• 配对+择时:在市场趋势明确时只做多低估值品种,震荡时做完整配对。

• 期货替代:用股指期货替代做空端,做多低估股票+做空IC/IF合约,近似实现市场中性。

How:配对交易的完整落地实操

第一步:筛选候选配对

// python
import pandas as pd
import numpy as np
from itertools import combinations

def screen_pairs(price_df, corr_threshold=0.8):
"""
初筛:高相关性的股票对

    参数:
- price_df: 列为股票代码,行为日期的收盘价DataFrame
- corr_threshold: 相关性阈值,默认0.8

    返回:
- pairs: [(股票A, 股票B, 相关系数), ...],按相关性降序排列
"""
# 计算日收益率
returns = price_df.pct_change().dropna()

    # 计算收益率相关性矩阵
corr_matrix = returns.corr()

    # 找出高相关的配对(避免重复)
pairs = []
stocks = corr_matrix.columns
for i, j in combinations(range(len(stocks)), 2):
corr = corr_matrix.iloc[i, j]
if corr > corr_threshold:
pairs.append((stocks[i], stocks[j], round(corr, 3)))

    # 按相关性从高到低排序
pairs.sort(key=lambda x: x[2], reverse=True)
return pairs

# 示例:在银行股中筛选高相关配对
# bank_stocks = ['601398', '601939', '600036', '000001', '601166']
# price_data = pd.read_csv('bank_prices.csv', index_col='date')
# pairs = screen_pairs(price_data[bank_stocks])
# print(pairs)

逐行解释:

• pct_change():计算日收益率(百分比变化)

• corr():计算收益率的相关系数矩阵

• combinations(range(len(stocks)), 2):两两组合所有股票对,不重复

• 相关性阈值0.8是经验值——低于0.8的配对,价差稳定性通常不够

初筛只做相关性过滤,后面用协整检验做精筛。

第二步:协整检验确认

相关性高 ≠ 适合配对。必须做协整检验,确认价差的平稳性:

// python
from statsmodels.tsa.stattools import coint
import statsmodels.api as sm

def test_cointegration(y_prices, x_prices):
"""
Engle-Granger协整检验

    参数:
- y_prices: 股票Y的价格序列
- x_prices: 股票X的价格序列

    返回:
- pvalue: 协整检验p值(<0.05表示协整关系成立)
- beta: 对冲比率
- spread: 价差序列(残差)
"""
# 第一步:OLS回归 y = alpha + beta*x + epsilon
x_with_const = sm.add_constant(x_prices)
model = sm.OLS(y_prices, x_with_const).fit()
beta = model.params[1]
alpha = model.params[0]

    # 第二步:提取残差作为价差
spread = y_prices - (alpha + beta * x_prices)

    # 第三步:ADF检验残差是否平稳
score, pvalue, critical_values = coint(y_prices, x_prices)

    return pvalue, beta, spread

# 使用示例:
# pvalue, beta, spread = test_cointegration(y_prices, x_prices)
# print(f"p值: {pvalue:.4f}, 对冲比率: {beta:.3f}")
# if pvalue < 0.05:
#     print("协整关系成立,可以做配对交易")

逐行解释:

• sm.add_constant(x_prices):给自变量加常数项(截距α)

• sm.OLS(y, x).fit():最小二乘法回归,求出α和β

• spread = y - (alpha + beta * x):残差就是"价差"——价格偏离均衡关系的程度

• coint(y, x):Engle-Granger协整检验,返回p值。p值<0.05意味着"价差是平稳的,偏离会回归"

选对标准:p值 < 0.05(统计显著),且价差的半衰期在5-30天之间(回归速度合理)。

第三步:计算价差和交易信号

// python
def pair_trading_signal(spread, lookback=60, entry_z=2.0, exit_z=0.5):
"""
配对交易信号生成

    参数:
- spread: 价差序列(协整回归的残差)
- lookback: 计算均值和标准差的回看窗口
- entry_z: 入场Z-score阈值(默认2倍标准差)
- exit_z: 出场Z-score阈值(默认0.5倍标准差)

    返回:
- signal: 1=做多价差, -1=做空价差, 0=平仓/无信号
- z_score: 当前Z-score值
"""
# 计算滚动Z-score
mean = spread.rolling(lookback).mean()
std = spread.rolling(lookback).std()
z_score = (spread - mean) / std

    current_z = z_score.iloc[-1]

    # 信号逻辑
if current_z > entry_z:
signal = -1   # 价差偏高,做空Y做多X(赌价差下降)
elif current_z < -entry_z:
signal = 1    # 价差偏低,做多Y做空X(赌价差上升)
elif abs(current_z) < exit_z:
signal = 0    # 价差回归均值,平仓
else:
signal = None  # 持仓等待

    return signal, round(current_z, 2)

逐行解释:

• rolling(lookback).mean():计算过去60天价差的滚动均值

• z_score = (spread - mean) / std:当前价差偏离均值多少个标准差

• Z-score > 2:价差显著偏高,赌它下降(做空Y做多X)

• Z-score < -2:价差显著偏低,赌它上升(做多Y做空X)

• |Z-score| < 0.5:价差已经回归,平仓获利

第四步:仓位管理与执行

仓位计算:

对冲比 = beta(协整回归的系数)。如果beta=1.5,意味着每做空1万元的X,需要做多1.5万元的Y——这样才能保证两边对价差的敏感度一致。

仓位上限:

• 单对配对不超过账户净值的30%

• 多对配对总计不超过50%

• 预留足够保证金应对价差继续扩大的浮亏

A股执行注意事项:

1. 融券成本约年化8-10%,会吃掉一部分收益。如果价差的年化回归收益只有6-8%,扣除融券成本后所剩无几

2. 券源不稳定,可能无法持续做空。今天能借到的券,明天可能被召回

3. 替代方案:用股指期货(IF/IC/IM)替代做空端。做多低估股票+做空股指期货,近似实现市场中性

4. 最简方案:只做"伪配对"——只做多被低估的那只,放弃做空端。在市场下行时承受beta风险,但执行简单、成本低

第五步:风控与持续监控

回测数据仅作教学演示,不代表未来表现

配对交易不是"设好就不管"的策略。关系破裂是最致命的风险,必须持续监控。

三个必须监控的指标:

1. 协整关系是否还成立:每月重新跑ADF检验。p值 > 0.1时,暂停该配对,观察一周后再决定

2. 价差极端偏离:Z-score超过4时,关系可能已经破裂,无条件止损离场

3. 对冲比漂移:beta每季度重新估计。如果变化超过20%,旧参数失效,需要重新校准

配对交易的常见"死法":

• 公司事件:并购、重组、大股东变更、财务造假——导致一只股票单边暴涨或暴跌,价差永远不回归

• 行业格局变化:政策颠覆(如教培行业)、技术革命(如新能源替代传统能源)——两只股票的估值逻辑永久分化

• 过度拥挤:太多人做同一个配对,价差的波动被压缩到无法覆盖交易成本

• 流动性枯竭:极端行情下融券被召回、买卖价差扩大,无法按预期价格平仓

回测参考(用A股银行股2019-2024年数据):

• 有效配对约5-8对(从沪深300成分股中筛选)

• 年化收益6-10%,夏普比率1.2-1.8

• 最大回撤-12%,发生在2020年3月(疫情冲击导致价差短暂破裂后回归)

• 平均持仓5-15天,年换手率约20-30倍

总结

配对交易的美感在于:你不赌市场涨跌,你赌"关系回归"——这比赌方向温和得多,也稳当得多。

但温和不等于安全。"关系破裂"是配对交易者的噩梦。2015年万科保利配对失效、2007年LTCM崩盘,都在提醒同一件事:历史协整不代表未来协整,任何配对都需要持续监控和止损保护。

这篇文章帮你建立了配对交易的完整框架:

1. 品种选择:行业相关 + 估值逻辑相似 + 历史价差平稳,三标准缺一不可

2. 协整检验:高相关 ≠ 协整,必须用ADF检验确认价差平稳性

3. 信号设计:Z-score > 2入场,< 0.5出场,滚动窗口60天

4. 仓位管理:按beta对冲,单对不超过30%,预留保证金

5. 风控监控:月度ADF检验、极端偏离止损、季度beta重估

记住:配对交易的核心不是"找两只同行业股票",而是"证明它们的价差会回归"。 证明靠的是协整检验,不是直觉。