📘 本章重点
- 理解配对交易的核心逻辑:利用两只协整资产价差的均值回归特性进行多空对冲
- 掌握协整检验(ADF检验)与对冲比率(OLS回归)的计算方法
- 学会Z-Score的计算与开仓/平仓阈值的设定
- 了解配对交易作为市场中性策略在系统性风险面前的保护作用与局限性
- 掌握寻找合适配对资产的完整流程:从行业筛选到协整验证
⚠️ 本章难点
- 区分“相关性”与“协整性”——两只股票走势相似不一定存在可交易的价差回归关系
- 理解对冲比率β的经济含义与计算方法
- 掌握协整关系破裂时的风险应对(基本面变化导致价差不再回归)
- 理解A股市场融券限制对配对交易执行的影响及替代方案
⏱️ 预估学习时间
- 55~75分钟
一、策略简述与一句话定性
一句话定性:配对交易是一种市场中性的统计套利策略,通过寻找两只具有长期均衡关系的资产,在价差偏离均值时进行“买低卖高”的对冲操作,等待价差回归后平仓获利。
配对交易(Pairs Trading)是统计套利领域最经典的策略之一。它不预测市场的涨跌方向,而是赌两只相关资产的价格差异会像弹簧一样“拉远了总会弹回来”。
配对交易的核心逻辑可以概括为四个字:高抛低吸——但抛的不是一只股票,而是一对股票的关系。
一个直观的比喻:配对交易就像双人三足跑比赛——两个人的腿绑在一起,必须步调一致才能前进(两只股票长期走势一致)。如果一个人突然迈了超大一步(价差偏离),两个人的节奏就会被打乱,但为了不摔倒,他们必须尽快调整回同步状态(价差回归)。配对交易者就是那个在旁边观察的人——当看到两人步调不一致时,就下注“他们会很快调整回来”。
老陈点评:
配对交易与传统股票交易最大的不同在于:它的投资标的是两只股票的价差,是一种相对价值而非绝对价值。它不关心大盘是涨是跌,只关心两只股票之间的价差是否“跑偏了”。这种“市场中性”的特性,让配对交易在熊市中也能有获利机会——这是它最吸引人的地方。
老王补充:
我早年做过一段时间配对交易,最大的体会是:它不像趋势跟踪那样大起大落,但需要极大的耐心。 价差可能偏离均值好几周都不回来,你每天看着浮亏,心里那个煎熬啊。而且A股融券难,想做空没那么容易。
二、策略的使用范围与条件
| 维度 | 适用范围与条件 | 说明 |
|---|---|---|
| 适用市场 | 股票、ETF、期货、加密货币 | 需要有足够的流动性支持多空双边交易 |
| 品种要求 | 同一行业、业务相似、有长期经济关联 | 同行业龙头股之间最容易出现协整关系 |
| 交易机制 | 支持做多与做空(或融券) | A股融券受限是最大障碍 |
| 适用周期 | 日线、小时线 | 价差回归通常需要数天至数周 |
| 资金门槛 | 中等 | 需要同时持有多头和空头仓位,资金利用率较高 |
| 不适合的市场状态 | 协整关系破裂、基本面发生重大变化 | 价差可能永久性偏离,不再回归 |
适用品种举例:
- 同行业龙头:贵州茅台与五粮液、工商银行与建设银行、美的集团与格力电器
- 产业链上下游:原油与航空股、铜与电线电缆股
- 跨境同股:A+H两地上市股票(如招商银行A股与H股)
- 高度相关的ETF:沪深300ETF与上证50ETF
失效案例:五粮液与泸州老窖曾长期保持稳定的价差关系,但随着两家公司基本面发生实质性变化——例如,泸州老窖在2017年前后经历了产品线收缩与品牌聚焦的战略调整,而五粮液则持续推进系列酒改革,两者在高端市场的竞争格局发生了变化——导致历史价差关系不再稳定,价差不再围绕零轴震荡,而是呈现单边走势,此时配对交易策略彻底失效。
老陈点评:
选择配对标的时候,基本面分析比统计检验更重要。两只股票即使协整检验p值很漂亮,如果它们的业务模式、竞争优势、管理层质量存在本质差异,协整关系随时可能破裂。配对交易的前提是“两只股票应该值差不多的钱”——这个“应该”来自基本面,而不是统计数字。
2.1 A股市场的特殊挑战与应对(新增位置)
在A股市场运行配对交易策略,面临一些独特的制度性障碍。提前了解这些限制,可以避免学到一半才发现“做不了”的尴尬。
| 挑战 | 应对方案 |
|---|---|
| 融券难、成本高 | 使用ETF替代个股做空;使用期货对冲;采用“搬砖策略” |
| T+1限制 | 使用模拟盘验证策略逻辑;用期货或ETF替代 |
| 涨跌停限制 | 避免选择经常涨停/跌停的标的;设置更宽的止损阈值 |
| 协整关系不稳定 | 使用滚动窗口定期重新计算协整关系和β值 |
“搬砖策略”是什么?
“搬砖”是指在同一资产的不同市场(如A股和H股)之间的价差套利。例如,招商银行同时在A股和H股上市,如果A股价格高于H股价格(溢价),就可以卖出A股、买入H股,等待价差收敛后平仓。这种操作的逻辑与配对交易一致——都是“买便宜、卖贵”,但标的物是同一公司的不同上市股份,协整关系比两只不同股票更稳定。在A股融券受限的情况下,A+H搬砖是一种可行的替代方案。
小李(散户)问:文中提到“用ETF替代个股做空”,比如做多银行股、做空银行ETF。具体怎么操作?A股真的能做空ETF吗?
老王补充:
能。A股市场里,只要ETF被纳入融资融券标的,就可以通过融券账户做空。比如华宝中证银行ETF(512800),它就是两融标的,散户可以融券卖出。
但要注意几点:第一,你得有融资融券账户(50万资产门槛),不是普通账户就能做;第二,即使ETF有资格,也可能遇到券源紧张——不是你想借多少就能借多少,尤其是在市场波动剧烈时,可能借不到券,建议提前向券商了解券源情况;第三,这种操作本质是板块对冲,不是完美的个股对冲——如果个股因自身利空大跌,但银行板块整体没跌,你的空头仓位就起不到保护作用。所以它更适合对冲系统性风险,而不是专门针对某一只个股。
老陈点评:
在A股缺乏做空工具的情况下,配对交易的“市场中性”优势被打了折扣。但这并不意味着策略完全无法使用——你可以用期货、期权、ETF等工具来构建对冲组合。关键是找到具有协整关系且双边可交易的资产对。
三、因子拆解与原理
3.1 协整关系(Cointegration)——价差回归的统计基础
配对交易的核心假设是:两只资产的价格存在长期均衡关系,短期偏离终将回归。
协整的数学定义:如果两只股票的价格序列Xt和Yt都是非平稳的 I(1)过程,但存在一个线性组合Zt = Xt – βYt是平稳的,则称Xt和Yt具有协整关系。Zt就是“价差”,它会在某个均值附近波动,不会无限偏离。
协整 ≠ 相关:两只股票可能因为同属一个行业而走势相似(高相关),但如果它们之间没有内在的经济联系,价差可能不会回归。协整检验比相关性分析更严格——它要求价差序列本身是平稳的,这意味着价差必须“有界”,不能无限漂移。
老陈点评:
相关性是“两只股票同涨同跌”,协整是“两只股票涨跌的差距不会越拉越大”。前者看的是同步性,后者看的是稳定性。配对交易需要的是后者——价差稳定,才能做均值回归。
3.1.1 如何寻找具有协整关系的资产对
协整检验只告诉你两只股票“有没有关系”,但不告诉你“从哪找”。寻找合适的配对资产是配对交易中最核心、也最考验功力的环节。完整的筛选流程可以分为三大步:划定范围 → 初步筛选 → 统计验证。
第一步:划定候选范围——从哪里找?
不要在整个市场里漫无目的地乱翻。先划圈子,再找配对。
| 筛选维度 | 具体方法 | 说明 |
|---|---|---|
| 同一行业 | 银行、白酒、券商、保险等 | 最常用。同一行业的公司面临相似的宏观环境、行业政策和竞争格局 |
| 同一风格 | 大盘股/小盘股、价值股/成长股 | 风格因子相同的股票,长期走势具有相似性 |
| 产业链上下游 | 原油 vs 航空股、铜 vs 电缆股 | 上游成本变化会传导至下游利润,形成逻辑上的对冲关系 |
| 同一市场不同品种 | A+H两地上市、ETF与其成分股 | 同一资产在不同市场的价格差异天然具有均值回归特征 |
一个值得关注的维度:产业链上下游配对。 有经验表明,上游企业与下游企业配对的效果,在某些情况下甚至好于同行业配对——因为成本与利润的传导关系比单纯的“同涨同跌”更具经济逻辑。
第二步:初步筛选——缩小候选池
划好圈子后,通常还有几十到上百只股票。直接做协整检验计算量太大,需要先用更轻量的方法缩小候选池。
方法一:相关系数法(最常用)
计算两只股票收益率的相关性,选出相关系数高的股票对。相关系数 > 0.8 是一个常见的阈值(具体数值可根据市场调整)。
# 计算多只股票之间的相关系数矩阵
corr_matrix = returns.corr()
# 筛选相关系数 > 0.8 的股票对
candidates = corr_matrix[corr_matrix > 0.8].stack().index.tolist()
方法二:最短距离法(非参数方法)
由Gatev等人提出,将价格序列标准化为累计收益率(起始值统一为1),计算两只股票标准化价差的平方和(SSD),SSD值越小,历史走势越相似。
为什么相关系数不够? 两只股票可能同涨同跌(高相关),但价差却越拉越大(不协整)。相关系数看的是同步性,协整看的是稳定性——前者是“一起走”,后者是“走在一起不散开”。
第三步:统计验证——协整检验与ADF检验
初步筛选后,对候选对进行严格的协整检验。具体步骤:
Step 1:OLS回归
对两只股票的价格序列做线性回归:
X_t = α + β × Y_t + ε_t
其中β就是对冲比率,ε_t是价差序列。
Step 2:ADF单位根检验
对回归残差ε_t进行ADF检验。如果检验结果显著(p值 < 0.05),说明残差序列是平稳的,两只股票存在协整关系。
from statsmodels.tsa.stattools import adfuller
# 对价差序列进行ADF检验
result = adfuller(spread)
# p值 < 0.05 表示价差平稳,即存在协整关系
Step 3:确认价差均值回归
验证价差是否围绕一个稳定的均值波动。可以用滚动窗口观察价差的均值和标准差是否稳定。
⚠️ 统计显著 ≠ 交易可盈利
协整检验p值 < 0.05只说明“两只股票的价差在统计上是平稳的”,但不保证“价差回归的速度足够快”或“回归的利润能覆盖交易成本”。在确定配对之前,还需要验证:
- 价差半衰期:价差偏离均值后,大约需要多长时间才能回归一半?半衰期越短,交易机会越多。
- 价差波动率:价差的标准差决定了单笔交易的潜在利润空间。如果价差波动太小,扣除成本后可能无利可图。
- 交易成本测算:将手续费、滑点、融券费率全部计入后,这个配对是否仍有正期望收益?
第四步:动态监控——协整关系不是永恒的
找到协整的配对只是开始。协整关系可能因为基本面变化而破裂,需要持续监控。
| 监控内容 | 方法 | 预警信号 |
|---|---|---|
| 协整关系稳定性 | 滚动窗口重新做协整检验 | p值从<0.05变为>0.05 |
| 对冲比率β的变化 | 滚动窗口重新做OLS回归 | β出现趋势性变化 |
| 价差均值漂移 | 监控价差的滚动均值 | 均值持续偏离历史均值 |
| 价差波动率变化 | 监控价差的标准差 | 标准差突然放大 |
建议使用滚动窗口(如每次用过去252天数据重新计算β和Z-Score),而不是固定参数,以便及时发现协整关系的变化。
协整关系也有“保质期” :研究表明,股票对之间的协整关系平均只能维持2-3年。随着公司基本面变化、行业格局演变、管理层更替,原本紧密的价差关系会逐渐松动。这意味着:你今天找到的“完美配对”,两年后可能就不再有效了。 建议每半年重新评估一次所有配对的协整关系,将失效的配对从策略池中剔除。
实操建议
- 优先选择有做空工具的品种。A股融券难是最大障碍,ETF、期货、期权是更好的替代方案。
- 同时监控多组配对。单组配对胜率50%-60%,20组同时运行,胜率才能上去。
- 行业选择有讲究。银行、保险、白酒等行业内公司同质化程度高,协整关系更稳定;科技、医药等行业差异化大,协整关系更脆弱。
- 数据频率不是越高越好。有研究表明,高频数据并不一定能提高配对交易的收益。
老陈点评:
寻找配对资产的过程,本质上是一个“漏斗模型”——从大范围的行业池,到相关系数筛选,再到协整检验确认。每一步都在缩小候选范围,同时提高配对的质量。不要跳过第二步直接做协整检验,那样计算量太大,而且会引入大量噪音。
老王补充:
我见过一种更“野”的找配对方法:直接找同一行业内市值最接近的两家公司。逻辑是:市值相近的公司,市场给它们的估值逻辑通常也相近,价差更容易回归。虽然不如统计方法精确,但在A股融券受限的环境下,这个思路值得一试。
3.2 对冲比率(Hedge Ratio β)——多空配比的量化
找到协整的股票对后,下一步是确定做多多少、做空多少才能让组合“中性”。
计算方法——OLS回归:
Xt = α + β × Yt + εt
- Xt和Yt分别是两只股票的价格
- β就是对冲比率
- εt是残差,即“价差”
经济含义:β告诉你,当Y变动1元时,X平均变动β元。为了构建中性组合,每持有1股X,就需要做空β股Y(或反之)。
举例:假设工商银行(X)与建设银行(Y)的回归结果为β=1.2。这意味着当建设银行涨1元时,工商银行平均涨1.2元。为了对冲市场风险,每买入1股工商银行,应做空1.2股建设银行。
⚠️ β不是常数——它会变化
两只股票的协整关系虽然长期稳定,但β值(对冲比率)会随着时间缓慢变化。例如,工商银行和建设银行的β可能在1.1到1.3之间波动——如果两家公司的盈利能力、分红政策、资产质量出现差异,β就会相应调整。
实战建议:不要用五年前的β来做今天的交易。建议每次开仓时,重新用最近252天的数据计算β,而不是固定使用历史均值。代码中已经实现了滚动计算,这正是实战中应该采用的方式。
3.3 Z-Score(标准化价差)——交易信号的量化
有了价差序列εt后,需要将其标准化,以便在不同时间段、不同股票对之间比较:
Z-Score = (εt - mean(ε)) / std(ε)
Z-Score的含义:
- Z-Score > 0:价差高于历史均值(X相对Y偏贵)
- Z-Score < 0:价差低于历史均值(X相对Y偏便宜)
- |Z-Score|越大,偏离越极端,回归的概率越高
老王补充:
Z-Score的阈值选择很关键。阈值太小(如1.0),信号太多,很多是假突破;阈值太大(如3.0),信号太少,可能一年都交易不了几次。2.0是一个经典的平衡点,但具体数值需要根据品种的历史波动率调整。
3.4 因子的优缺点与互补
| 优点 | 缺点 |
|---|---|
| 市场中性:多空对冲后,策略收益与大盘涨跌相关性极低 | 协整关系可能破裂:基本面变化会导致价差永久性偏离 |
| 回撤可控:即使在2008年次贷危机中,配对策略的回撤幅度也通常小于纯多头策略,体现了其市场中性的保护作用 | 需要双边交易:A股融券困难是最大障碍 |
| 收益来源多样:可同时运行多组配对,分散风险 | 价差回归时间不确定:可能偏离数周甚至数月 |
| 逻辑清晰:有坚实的统计学基础(协整理论) | 机会有限:真正存在协整关系的股票对并不多 |
四、仓位、买卖点与风险管理
4.1 入场信号(开仓规则)
| 信号类型 | 触发条件 | 操作(做多价差) | 操作(做空价差) |
|---|---|---|---|
| 开仓(做多价差) | Z-Score < -阈值(如-2.0) | 买入X(低估),做空β股Y(高估) | — |
| 开仓(做空价差) | Z-Score > +阈值(如+2.0) | — | 做空X(高估),买入β股Y(低估) |
阈值的设定:
- 经典值:±2.0倍标准差
- 激进值:±1.5(信号多,但假突破也多)
- 保守值:±2.5(信号少,但每笔胜率更高)
为什么平仓阈值是±0.5而不是0?
如果你等到Z-Score精确回归到0才平仓,可能会有两个问题:
- 可能永远到不了0——价差可能在0附近振荡,但永远不会精确等于0。
- 过长的持仓时间——为了等最后那一点点回归利润,你可能要持仓很久,资金效率低下。
将平仓阈值设为±0.5,意味着“价差回归到均值附近就获利了结”,不必等到精确的0。这是一种落袋为安的设计——牺牲少量潜在利润,换取更快的资金周转。阈值越小(越接近0),每笔利润越高,但持仓时间越长;阈值越大,交易越频繁,但单笔利润越薄。
4.2 平仓信号(出场规则)
| 平仓方式 | 触发条件 | 说明 |
|---|---|---|
| 回归平仓 | Z-Score回归至0附近(如±0.5) | 最常用,逻辑自洽 |
| 分批平仓 | Z-Score回归至±1.0时平一半,至0时平另一半 | 锁定部分利润 |
| 时间止损 | 持仓超过N个交易日仍未回归 | 防止资金长期被占用 |
| 协整破裂止损 | 价差持续偏离,ADF检验显示不再平稳 | 认赔离场,保住本金 |
4.3 仓位管理
配对交易的仓位管理相对简单:
- 等权重配对:每对分配相同资金
- 波动率调整:价差波动大的配对分配更少资金
- 风险预算:每对组合的最大亏损控制在总资金的1%-2%
资金占用计算:
做多市值 = 买入股数 × X价格
做空市值 = 做空股数 × Y价格 = β × 做多股数 × Y价格
总占用 ≈ 做多市值(因做空部分需缴纳保证金)
4.4 止损设计
| 止损方式 | 触发条件 | 说明 |
|---|---|---|
| 价差阈值止损 | Z-Score超过历史最大值(如3.5)仍未回归 | 可能协整关系已破裂 |
| 时间止损 | 持仓超过预设周期(如20个交易日) | 资金效率考虑 |
| 最大亏损止损 | 单笔亏损超过总资金2% | 通用风控原则 |
| 协整检验止损 | 滚动窗口内协整检验p值>0.05 | 统计关系已失效 |
五、策略的来历、设计者与趣闻
配对交易的核心理念最早可以追溯到20世纪20年代华尔街传奇交易员杰西·利弗莫尔(Jesse Livermore) 的“姐妹股票对”(Sister Stocks)交易策略。利弗莫尔在同一行业内选择业务相似、股价具有均衡关系的两家公司,做空相对强势的股票,同时做多相对弱势的股票,等待价差回归后平仓。
1985年,摩根士丹利(Morgan Stanley)成立了一支由Dr. Nunzio Tartaglia领导的量化团队,专门研究配对交易策略。1987年,该团队将策略投入实战,当年实现盈利5000万美元。然而,策略在之后的两年连续亏损,研究团队被迫解散,小组成员散落到各家对冲基金。
这次“摩根士丹利实验”虽然以团队解散告终,但它做了一件更重要的事:把配对交易从“利弗莫尔的直觉”变成了“可量化的统计模型” 。团队解散后,成员将这套方法论带到了整个对冲基金行业,配对交易从此成为全球量化基金的标配策略之一。值得一提的是,Morgan Stanley团队的成员后来将配对交易的思路带到了整个对冲基金行业,其中一些人(如Peter Muller)后来成为了量化交易史上的传奇人物。一个团队的解散,却点燃了整个行业的火花。
趣闻:Morgan Stanley团队当年的成功和随后的失败,恰好揭示了配对交易的两个核心挑战:选对股票对能赚钱,但协整关系不是永恒的。1987年他们大赚5000万美元,是因为选对了配对;之后两年连续亏损,很可能是因为之前有效的协整关系发生了变化。
“配对交易的悖论” :配对交易越流行,它的有效性就越低。当太多资金都在盯着同样的价差做均值回归时,价差回归的速度会加快,利润空间被压缩。
老陈点评:
摩根士丹利团队的故事告诉我们:统计套利不是“一劳永逸”的策略。协整关系需要持续监控——今天有效的配对,明天可能就失效了。量化交易的核心不是“找到一个好策略”,而是“持续监控策略是否仍然有效”。
老王补充:
我认识一个做配对交易的老交易员,他的秘诀是同时监控50组配对,哪组价差到了阈值就做哪组。他说:“单组配对的胜率也就50%-60%,但50组同时运行,胜率就上去了。”这就是分散化的力量。
六、Python回测示例
以下代码演示配对交易策略在两只银行股上的回测。采用日线数据、Z-Score阈值±2.0开仓、回归均值平仓。
import pandas as pd
import numpy as np
import yfinance as yf
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller, coint
from datetime import datetime
# 若yfinance无法获取数据,可使用akshare或聚宽数据源
def find_correlated_pairs(returns, threshold=0.8):
"""
利用相关系数法初步筛选配对资产
参数:
returns: 收益率DataFrame(每列一只股票)
threshold: 相关系数阈值(可根据市场调整)
返回:候选股票对列表
"""
corr_matrix = returns.corr()
# 筛选相关系数 > threshold 的股票对(去除自身)
pairs = []
for i in range(len(corr_matrix.columns)):
for j in range(i+1, len(corr_matrix.columns)):
if corr_matrix.iloc[i, j] > threshold:
pairs.append((corr_matrix.columns[i], corr_matrix.columns[j], corr_matrix.iloc[i, j]))
return sorted(pairs, key=lambda x: x[2], reverse=True)
def pairs_trading_strategy(data_dict,
stock1_name,
stock2_name,
lookback_days=252, # 回看周期(交易日)
entry_zscore=2.0, # 开仓阈值
exit_zscore=0.5, # 平仓阈值
stop_loss_zscore=3.5, # 止损阈值
cost_rate=0.001): # 双边交易成本
"""
配对交易策略(基于协整关系)
参数:
data_dict: {名称: DataFrame(含'Close'列)} 的字典
stock1_name, stock2_name: 两只股票的键名
lookback_days: 计算协整和Z-Score的回看窗口
entry_zscore: 开仓阈值
exit_zscore: 平仓阈值
stop_loss_zscore: 止损阈值
cost_rate: 双边交易成本(如0.001表示0.1%)
返回:添加了持仓和净值的DataFrame
"""
# 1. 合并价格数据
df1 = data_dict[stock1_name]['Close']
df2 = data_dict[stock2_name]['Close']
# 对齐日期
combined = pd.DataFrame({
stock1_name: df1,
stock2_name: df2
}).dropna()
# 2. 初始化结果DataFrame
result = pd.DataFrame(index=combined.index)
result['Price1'] = combined[stock1_name]
result['Price2'] = combined[stock2_name]
# 3. 滚动计算协整关系和Z-Score
result['Hedge_Ratio'] = np.nan
result['Spread'] = np.nan
result['ZScore'] = np.nan
result['Position'] = 0 # 1=做多价差,-1=做空价差,0=空仓
result['Position1'] = 0 # 股票1的持仓(正=做多,负=做空)
result['Position2'] = 0 # 股票2的持仓
position = 0
entry_spread = 0 # 开仓时的价差(用于计算盈亏)
for i in range(lookback_days, len(result)):
# 取过去lookback_days天的数据
window1 = combined[stock1_name].iloc[i-lookback_days:i]
window2 = combined[stock2_name].iloc[i-lookback_days:i]
# 滚动协整检验(可选预警)
coint_p = coint(window1, window2)[1]
if coint_p > 0.05:
# 协整关系可能已破裂,设置预警标记
pass
# OLS回归:stock1 = alpha + beta * stock2 + epsilon
X = sm.add_constant(window2)
model = sm.OLS(window1, X).fit()
beta = model.params[stock2_name]
alpha = model.params['const']
# 计算当前价差和Z-Score
current_spread = result['Price1'].iloc[i] - beta * result['Price2'].iloc[i]
# 计算历史价差的均值和标准差(使用滚动窗口)
spread_history = window1 - beta * window2
spread_mean = spread_history.mean()
spread_std = spread_history.std()
zscore = (current_spread - spread_mean) / spread_std if spread_std > 0 else 0
result.loc[result.index[i], 'Hedge_Ratio'] = beta
result.loc[result.index[i], 'Spread'] = current_spread
result.loc[result.index[i], 'ZScore'] = zscore
# 交易逻辑
if position == 0:
# 无持仓:检查开仓信号
if zscore < -entry_zscore:
position = 1
entry_spread = current_spread
result.loc[result.index[i], 'Position1'] = 1
result.loc[result.index[i], 'Position2'] = -beta
elif zscore > entry_zscore:
position = -1
entry_spread = current_spread
result.loc[result.index[i], 'Position1'] = -1
result.loc[result.index[i], 'Position2'] = beta
else:
# 已有持仓:检查平仓信号
# 价差回归平仓
if abs(zscore) < exit_zscore:
position = 0
result.loc[result.index[i], 'Position1'] = 0
result.loc[result.index[i], 'Position2'] = 0
# 止损
elif abs(zscore) > stop_loss_zscore:
position = 0
result.loc[result.index[i], 'Position1'] = 0
result.loc[result.index[i], 'Position2'] = 0
result.loc[result.index[i], 'Position'] = position
# 4. 计算每日收益率
result['Return1'] = result['Position1'].shift(1) * (result['Price1'] - result['Price1'].shift(1)) / result['Price1'].shift(1)
result['Return2'] = result['Position2'].shift(1) * (result['Price2'] - result['Price2'].shift(1)) / result['Price2'].shift(1)
result['Daily_Return'] = result['Return1'] + result['Return2'] - cost_rate # 扣除交易成本
result['Net_Value'] = (1 + result['Daily_Return']).cumprod()
# 5. 统计指标
total_return = (result['Net_Value'].iloc[-1] - 1) * 100
max_drawdown = ((result['Net_Value'].cummax() - result['Net_Value']) / result['Net_Value'].cummax()).max() * 100
print(f"总收益率:{total_return:.2f}%")
print(f"最大回撤:{max_drawdown:.2f}%")
print(f"交易次数:{(result['Position'].diff() != 0).sum() // 2}")
return result
if __name__ == "__main__":
# 下载两只银行股数据
stock1 = yf.download('601398.SS', start='2018-01-01', end='2024-12-31', progress=False)
stock2 = yf.download('601939.SS', start='2018-01-01', end='2024-12-31', progress=False)
data_dict = {
'ICBC': stock1, # 工商银行
'CCB': stock2 # 建设银行
}
# 示例:如果你有多个ETF的数据,可以用以下方式筛选候选配对
# returns_df = pd.DataFrame({name: data['Close'].pct_change() for name, data in data_dict.items()})
# candidates = find_correlated_pairs(returns_df, threshold=0.8)
# print("找到的候选配对:", candidates)
result = pairs_trading_strategy(
data_dict,
stock1_name='ICBC',
stock2_name='CCB',
lookback_days=252,
entry_zscore=2.0,
exit_zscore=0.5,
cost_rate=0.001
)
print(result[['Price1', 'Price2', 'ZScore', 'Position', 'Net_Value']].tail(10))
回测结果简要解读(以实际运行为准):
- 在两只银行股价差稳定期间,策略能持续捕捉价差回归的利润
- 在银行板块整体趋势性行情中,价差可能长期偏离,策略交易频率下降
- 建议读者尝试不同阈值(1.5、2.0、2.5)和不同回看周期(126、252天),观察参数敏感性
代码说明:
本代码为简化版配对交易策略,核心逻辑是滚动计算协整关系、Z-Score,在阈值触发时开仓,回归时平仓。代码中包含了find_correlated_pairs函数,演示如何利用相关系数法初步筛选配对。实际应用中,建议同时运行多组配对以分散风险,并加入交易成本考量。
⚠️ 回测与实盘的差异:
本代码使用日线收盘价进行回测,所有信号基于收盘价判断。在实盘分钟级交易中,信号触发后会立即执行,与回测假设存在差异——你可能在盘中以高于或低于收盘价的价格成交。建议读者使用分钟级数据进行更精确的回测,并在实盘前充分评估滑点影响。
老陈点评:
回测时要注意:协整关系是用历史数据算出来的,但未来不一定成立。建议使用滚动窗口(如每次用过去252天数据重新计算β和Z-Score),而不是固定参数。代码中的滚动协整检验预警可以帮助你及时发现协整关系的变化。
老王补充:
实盘中最容易被忽视的问题是交易成本。配对交易涉及双边交易,手续费和滑点的影响比单边策略更大。如果每笔交易的利润只有1%-2%,扣除成本后可能所剩无几。建议在回测中加入0.1%-0.2%的双边成本,看看策略是否还能盈利。
七、本章小结与思考题
小结
| 项目 | 核心要点 |
|---|---|
| 策略类型 | 统计套利 / 均值回归,基于协整关系 |
| 核心公式 | 价差 = X – βY;Z-Score = (价差 – 均值) / 标准差 |
| 适用行情 | 价差稳定、均值回归特征明显的市场 |
| 核心优势 | 市场中性,与大盘涨跌无关,熊市中也能获利 |
| 最大风险 | 协整关系破裂,价差永久性偏离不再回归 |
| 资金门槛 | 中等(需双边持仓,A股融券受限是主要障碍) |
配对交易是统计套利策略的经典代表,它用“买低卖高”的对冲逻辑,在两只相关资产之间构建了一个与市场涨跌无关的“迷你对冲基金”。
老陈总结:
配对交易的核心不是“预测方向”,而是“赌关系回归”。这种“关系”必须是基于经济逻辑的——同行业、同产业链、同市场——而不是纯粹的数据挖掘。协整检验只是验证工具,基本面分析才是选股的根本。 从划定候选范围到统计验证的“漏斗模型”,正是将基本面逻辑与统计学方法有机结合的过程。
老王总结:
如果你在A股做配对交易,我的建议是:先找能做空的工具。ETF、期货、期权都可以作为替代方案。没有做空工具,配对交易就是“一条腿走路”。另外,别只盯着一组配对——同时监控10-20组,哪组出信号做哪组,这样才能平滑收益曲线。
💡 思考题
- 协整(Cointegration)和相关性(Correlation)有什么区别?为什么配对交易需要协整而不是相关性?
- 假设贵州茅台和五粮液的股价走势长期高度相关,但协整检验p值=0.08(>0.05),你还会用它们做配对交易吗?为什么?
- 在A股市场融券受限的情况下,你会如何调整配对交易策略?请给出至少两种替代方案。
- 如果你要在银行、白酒、科技三个行业中各选一对配对股票,你会选择哪三对?请说明你的选择逻辑。
- (扩展题) 传统的配对交易思路是在同一板块或同一行业内找配对(如工商银行与建设银行)。但有没有可能打破这个思路——比如,找一只银行股和一只保险股,或找一只上游资源股和一只下游消费股?它们可能不属于同一个板块,但从经济逻辑上看,它们之间存在成本传导或利润对冲的关系,组合在一起也能产生互补效果。你认为这种“跨板块配对”是否可行?如果能找到协整关系,它的经济逻辑是什么?如果找不到,你认为最大障碍在哪里?
- (展望题) 如果未来A股市场做空机制更加完善(如个股期权、更便捷的融券),配对交易策略的有效性会增强还是减弱?请从“策略容量”和“竞争加剧”两个角度分析。
八、引用/参考出处
网上内容:
- JoinQuant量化课堂《基于协整的搬砖策略》:https://www.joinquant.com/view/community/detail/e11fcec811670158d771b64eb8176744
- 百度开发者《基于协整关系的配对量化交易策略:R语言实现全解析》:https://developer.baidu.com/article/detail.html?id=3792438.
- 百度百科 配对交易 https://baike.baidu.com/item/配对交易/50885779
- 知乎 量化交易-配对交易策略(Pairs Trading) https://zhuanlan.zhihu.com/p/931638133
学术论文与研报(元信息):
- 海通证券《统计套利之股票配对交易策略》,2011年6月10日
- Gatev, E., Goetzmann, W. N., & Rouwenhorst, K. G. (2006). “Pairs Trading: Performance of a Relative-Value Arbitrage Rule.” Review of Financial Studies, 19(3), 797-827.(配对交易策略的经典实证研究)
- Engle, R. F., & Granger, C. W. J. (1987). “Co-integration and error correction: Representation, estimation, and testing.” Econometrica, 55(2), 251-276.(协整理论的奠基之作)
- Do, B., & Faff, R. (2010). “Does simple pairs trading still work?” Financial Analysts Journal, 66(4), 39-52.(配对交易策略的长期有效性研究)




















暂无评论内容