【维克】配对交易:两只股票的"引力波"
前言
在量化交易的所有策略类型里,有一类策略特别"反直觉"——它不关心大盘涨还是跌,不关心个股涨还是跌,它只关心一件事:两只股票之间的关系,偏离了正常水平没有。
这类策略叫配对交易(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重估
记住:配对交易的核心不是"找两只同行业股票",而是"证明它们的价差会回归"。 证明靠的是协整检验,不是直觉。