互换利差套利:赚国债与利率互换之间那条会漂移的价差
互换利差 = 同期限利率互换固定利率 - 同期限国债收益率,理论上由信用、流动性、供需驱动,围绕一个缓慢移动的中枢均值回归。固定种子 20260801 受控模拟把它建成中枢会漂移的 OU 过程(真实半衰期 58 交易日):滚动 z 分数均值回归策略仅靠价差收敛 Sharpe 0.85,含 carry 后 1.13,最优入场阈值 z*=1.5(Sharpe 1.30)。三个陷阱最硬:半衰期在 60 日短样本上被系统性低估到 13 日(高估回归速度近 4 倍,要 2000 日才收敛到 54);用全样本均值算 z 是隐蔽 look-ahead,纯随机游走价差上凭空刷出 Sharpe 0.59 假 alpha,换因果滚动 z 立刻掉到 0.01;θ 从 3 降到 0 退化成随机游走时价差收敛 Sharpe 从 0.82 崩到 -0.51。置换 300 次真实 0.85 超过 95 分位 0.60。carry 那条 Sharpe 6.3 的曲线是模型把利差收益建得太干净的产物,真实世界要扣融资、展期、对冲摩擦。
问题:一条价差,两种利率,谁围着谁转?#
固定收益里有一类”相对价值”交易,赌的不是利率涨还是跌,而是两条利率之间的价差。互换利差(swap spread)是其中最经典的一个:
举个例子,10 年期利率互换(收固定/付浮动)的固定利率是 4.45%,同期限 10 年国债收益率 4.00%,那么 10 年互换利差就是 45bp(基点)。这个价差不是随便一个数字,它承载着一堆经济含义:
- 信用/机构风险:互换的浮动腿盯着银行间拆借利率,隐含银行体系的信用溢价;国债是主权信用。价差里有一块是”银行 vs 政府”的信用差。
- 流动性溢价:国债是全市场最流动的抵押品,“想持有国债”的需求会把国债收益率压低、把互换利差推高。
- 供需与监管:国债发行放量、养老金用互换做久期对冲、银行监管资本占用……都会推动价差。
关键在于:这些驱动力大多是缓慢变化的结构性因素,所以互换利差不像股价那样漫无目的地漂,它更像是围绕一个中枢来回摆动——偏高了会有人来做收窄、偏低了会有人来做走阔。这就给了均值回归交易一个立足点。
但立足点不等于免费午餐。本文用固定种子 20260801 造一个中枢本身会缓慢漂移的互换利差世界(真实回归半衰期 58 交易日),检验四件事:价差均值回归到底能不能赚钱?carry(正利差的滚动收益)贡献多少?半衰期这个命门参数有多难估准?以及——如果我偷偷用了未来信息,随机游走能不能也被”洗”成假 alpha?
一、互换利差长什么样:均值回归 + 中枢漂移#
我把互换利差建成一个 Ornstein-Uhlenbeck(OU)均值回归过程,但关键设定是:它回归的中枢不是常数,而是自己在缓慢随机游走。
- 是回归速度,我设成对应半衰期 交易日——价差偏离中枢后,大约三个月修复一半;
- 是中枢,让它以极慢的速度随机游走,模拟金融危机、量化宽松、监管新规这些会永久性移动长期中枢的体制变化;
- 是日度扰动。

上图蓝线是模拟出的互换利差,橙色虚线是它真实的中枢。你能清楚看到两件事同时发生:价差在短期内围着中枢上下摆(这是可交易的部分),而中枢本身在长期里缓慢移动(这是会坑死你的部分)。下半图是 252 日滚动 z 分数——用过去一年的均值和标准差把当前价差标准化。策略规则很简单:z 触及 ±1 进场押回归,回到 ±0.25 出场。
为什么必须用滚动窗口而不是全样本?因为中枢在漂移。如果你用整段历史的均值当锚点,当中枢已经从 45bp 漂到 60bp 时,你会一直觉得”价差偏高、该做收窄”——然后被漂移方向反复碾压。滚动窗口让锚点跟着中枢走,这是这个策略能不能活下来的第一道生死线。
import numpy as np
def zscore_rolling(x, win=252):
"""因果滚动 z 分数:只用过去 win 天的均值和标准差,绝不偷看未来"""
z = np.full_like(x, np.nan)
for t in range(win, len(x)):
w = x[t-win:t]
sd = w.std()
z[t] = (x[t] - w.mean()) / sd if sd > 0 else 0.0
return z
def run_strategy(spread, z, entry=1.0, exit=0.25):
"""价差偏高(z>entry)押收窄、偏低(z<-entry)押走阔,回到±exit出场"""
pos, pnl = 0, np.zeros(len(spread))
positions = np.zeros(len(spread))
for t in range(1, len(spread)):
if np.isnan(z[t]):
continue
if pos != 0 and abs(z[t]) < exit: # 出场
pos = 0
if pos == 0: # 进场
pos = -1 if z[t] > entry else (1 if z[t] < -entry else 0)
positions[t] = pos
# 当日盈亏 = 昨日持仓 × 今日价差变化(做多价差 => 利差上升赚钱)
pnl[t] = positions[t-1] * (spread[t] - spread[t-1])
return pnl, positionspython二、钱从哪来:价差收敛 vs carry#
均值回归交易的盈亏有两个来源,必须拆开看:
- 价差收敛(convergence):你在价差偏离时进场,赌它回到中枢。这是”低买高卖价差”的资本利得。
- carry:互换利差交易的一条腿(收固定/付浮动)在利差为正时本身携带正的滚动收益——你什么都不做,只要拿着头寸,正利差就在往你口袋里滴钱。

左图三条线揭示了收益结构:只靠价差收敛,Sharpe 是 0.85(橙线);加上 carry 后完整策略 Sharpe 1.13(蓝线)。而单独看 carry(绿虚线),Sharpe 高达 6.3——一条几乎笔直向上的线。
这条 6.3 的 carry 曲线是一个必须警惕的信号,而不是值得炫耀的成绩。 在我的模型里,carry 被建得”太干净”了:正利差被当成一笔近乎无风险的稳定累计。真实世界完全不是这样——carry 要扣掉融资成本、互换的浮动腿重定价风险、国债回购(repo)利率的波动、展期和对冲的交易摩擦。任何回测里出现 Sharpe 6+ 的”carry”,第一反应都应该是”我把某个风险建漏了”,而不是”我发现了印钞机”。 这条线在本文的作用恰恰是反面教材:它提醒你,收益拆分时最需要盯的不是最漂亮那条,而是那条漂亮到不真实的。
真正代表这个策略核心能力的,是价差收敛的 0.85。右图显示策略约 61% 的时间在场,押走阔和押收窄大致平衡——这符合一个围绕中枢对称摆动的价差应有的样子。
三、命门参数:半衰期估不准,一切都是空谈#
均值回归策略的一切都建立在”价差会回来、而且回得够快”之上。回得多快,由半衰期决定。问题是——半衰期极难估准,尤其在短样本上。

左图是用 AR(1) 回归(对价差的日变化对滞后价差回归,斜率反推 )估计半衰期,在不同样本长度下的表现。真实半衰期是 58 交易日(红虚线),但:
- N=60(约三个月数据)时,估计半衰期只有 13 天——把回归速度高估了近 4 倍!
- 要到 N=2000(约 8 年),估计才收敛到 54 天,接近真值。
这个偏差是方向恒定的(系统性低估半衰期 = 高估回归速度),根子在 Dickey-Fuller 类估计量在有限样本上的均值回归偏误。它的后果很致命:如果你用短历史选”回归最快的价差对”来交易,你选中的大概率是估计噪声制造的幻觉——真实半衰期 58 天的价差,被短样本误报成 13 天的”快速印钞机”,你满仓压上去,等来的是漫长的不回归。
右图是入场阈值扫描:最优入场 z*≈1.5(Sharpe 1.30),略高于但基本吻合教科书的 ±1σ~±2σ 区间。阈值越高,交易次数越少(z*=0.5 时 71 笔,z*=3.0 时只剩 5 笔)——阈值是在”多机会但每次信号弱”和”少机会但每次信号强”之间权衡。曲线在最优点附近相当平坦,说明这个策略对阈值不算特别敏感,拿不准就选中间偏高一点。
四、对抗式检验:这 0.85 是真的吗?#
一个 Sharpe 0.85 的均值回归策略,不算惊艳,但也够诱人到必须怀疑。四个对抗式检验直击要害。

图4a:这是最重要的一个检验——look-ahead 能把随机游走洗成假 alpha 吗? 我造一条纯随机游走的价差(没有任何均值回归,真实 alpha 严格为零),然后用全样本的均值和标准差算 z 分数来交易。结果:Sharpe 0.59! 一条根本不回归的价差,凭空刷出了近 0.6 的 Sharpe。为什么?因为用全样本均值当锚点,等于偷看了未来——你”知道”这条随机游走最终会在哪个水平附近,于是每次偏离这个”未来均值”时下注,看起来就像在做均值回归。而当我换成因果的滚动 z(只用历史),同一条随机游走的 Sharpe 立刻掉到 0.01——真相大白:随机游走里没有 alpha,之前那 0.59 全是 look-ahead 制造的海市蜃楼。这是整篇文章最该记住的一条:用全样本统计量算 z 分数,是统计套利里最隐蔽、最常见、也最致命的作弊。
图4b:真实价差上,look-ahead 也在偷偷抬高 Sharpe。 同样对比全样本 z 和滚动 z,但这次用真实的 OU 价差:全样本 z 的 Sharpe 1.10,滚动 z 的 0.85。即使价差真的均值回归,look-ahead 依然额外注水了约 0.25 的 Sharpe。这说明 look-ahead 不只在假信号上骗你,在真信号上也会让你高估策略的真实能力,实盘时预期落空。
图4c:置换检验。 我把价差的日变化顺序打乱重排(这会彻底破坏均值回归结构,但保留了日变化的分布),跑 300 次,得到零假设下的 Sharpe 分布:95 分位只有 0.60,最大 0.81。真实价差收敛的 0.85 超过了 95 分位——说明收益来自价差真实的时间结构(均值回归),而不是随便打乱也能刷出来的运气。
图4d:回归速度 θ 敏感性——alpha 从哪来一目了然。 我把回归速度 θ 从强(对应半衰期几十天)一路调到 0(价差退化成纯随机游走),看价差收敛 Sharpe 怎么变:θ 越大(回归越快)Sharpe 越高,θ=0 时 Sharpe 崩到 -0.51。这条曲线是这个策略的”出生证明”:它的 alpha 完全来自价差的均值回归特性,回归消失,alpha 就变成负数(还要倒贴交易成本)。任何声称做互换利差均值回归的策略,都该先确认:你交易的价差真的在回归吗?还是它其实已经变成了随机游走、甚至趋势?
三段式总结#
A. 实现细节#
- 数据生成:2520 个交易日(约 10 年)的互换利差序列,建成 OU 均值回归过程(真实回归半衰期 58 交易日、日度扰动 4bp、初始中枢 45bp),并让中枢本身以极慢速度随机游走(模拟体制漂移)。固定种子
20260801。 - 信号构造:252 日滚动 z 分数(因果,只用历史),z 触及 ±1 进场(价差偏高押收窄、偏低押走阔),回到 ±0.25 出场。
- 盈亏口径:把利差交易建成 DV01 中性、利率中性的价差交易,每日盈亏 = 昨日持仓方向 × 当日利差变化(bp)+ carry(持有正利差腿的滚动收益)。收益拆成”价差收敛”和”carry”两块分别核算。
- 对抗式检验:(1) 纯随机游走上全样本 z(look-ahead)vs 滚动 z;(2) 真实价差上全样本 z vs 滚动 z;(3) 打乱价差日变化顺序的置换检验 300 次;(4) 回归速度 θ 从强到 0 的敏感性扫描。
B. 已知偏差#
- carry 建得太干净:模型把正利差当成近乎无风险的稳定累计(Sharpe 6.3 的那条线就是证据),完全没建融资成本、回购利率波动、浮动腿重定价、展期与对冲摩擦、双边保证金。真实互换利差交易的 carry 远没这么好赚,这是本文最大的简化。
- 价差过程是外生设定的:真实互换利差由信用、流动性、国债供需、监管资本等多因素驱动,中枢的漂移幅度、回归速度都是随时间变化的经验量,本文用固定 θ 的 OU + 慢漂移中枢做了大幅简化。
- 无交易成本与冲击:均值回归策略换手不低(最优阈值下约几十笔进出),本文未建买卖价差、市场冲击、互换的报价点差。真实 Sharpe 会因此打折。
- 半衰期时变性:本文用固定半衰期,真实价差的回归速度会随市场流动性、货币政策松紧而变,估计滞后会在体制切换时让策略失灵。
- DV01 中性的简化:把利差变化的 bp 直接线性映射为盈亏,忽略了曲线形变、凸性、互换与国债久期不完全匹配带来的残差风险。
C. 结果解读#
- 互换利差均值回归是真 alpha,但很朴素:在一个真实回归半衰期 58 天的世界里,因果滚动 z 策略仅靠价差收敛拿到 Sharpe 0.85,置换检验证明它超过 95 分位、θ 敏感性证明它来自真实回归结构。这是一个结构性、可解释的收益来源,但 0.85 的量级也提醒你:它是相对价值交易的常态,不是暴利。
- look-ahead 是这类策略的头号杀手:图4a 里一条纯随机游走用全样本 z 就刷出 0.59 的假 Sharpe,换因果滚动 z 立刻归零——这是判断一个统计套利回测真伪的第一块试金石。 如果你的价差策略在”确定无 alpha 的随机游走”上还赚钱,你赚的一定是未来信息,不是回归。任何 z 分数、均值、标准差都必须严格只用历史数据算。
- 半衰期决定成败,却最难估:短样本把 58 天的真实半衰期估成 13 天(高估回归速度近 4 倍),会诱导你去追”回归最快”的假信号。选价差对时,对短历史估出的半衰期要打足够的折扣,宁可用更长窗口、宁可相信回归更慢。
- 收益拆分时盯最漂亮那条:carry 的 Sharpe 6.3 不是好消息,是”某个风险被建漏了”的报警。这个原则对所有含 carry 的策略(外汇 carry、商品展期、期限结构)都适用——carry 从来不是免费的,看起来免费只说明你还没找到成本藏在哪。
- 适用边界:互换利差套利适合能低成本融资、能进入互换和回购市场、能承受相对价值交易长持有期与偶发剧烈拉伸的机构。它在流动性正常的市场里是稳健的低 Sharpe 收益源,但在流动性危机(如 2008、2020 年 3 月)里,互换利差会剧烈甚至反常地拉开——那时候”回归”会迟到很久,杠杆过高的套利者会先爆仓。先算清你能扛多久的不回归,再决定上多少杠杆。