标准协整配对交易有一个悄悄的假设:价差是线性均值回复的——偏离多远,回复的力就有多大,像一根弹簧。但真实市场的配对往往不是这样。很多「协整对」在价差很小时其实在随机游走(互不理睬),只有当价差拉大到一定程度,套利者才进场、把价差往回拽。这种「该回复时才回复」的非线性,标准 Engle-Granger / Johansen 框架完全看不见——它只会给你一个被平均掉的、虚低的调整速度,于是你按线性信号频繁进出,白白给券商打工。
本文聊 门限协整(threshold cointegration) 和它对应的门限向量误差修正模型(TVECM)。核心思想只有一句:用门限把价差切成两个 regime,分别估回复速度。我们用 3000 个交易日的合成配对,把它跑成看得见的数据:TVECM 还原出门限 τ≈0.22(真值 0.20)、带外调整速度 κ=0.49(真值 0.25)、带内斜率≈0(随机游走);门控后只赚「带外那段真会快速回复」的钱,配对 Sharpe 从朴素 z-score 的 0.31 拉到 0.81,交易次数从 31 次砍到 5 次。
一、线性协整的盲区:伪平稳#
先说清楚问题。标准协整说:价差 z_t = p_A − p_B 是平稳的,误差修正模型(VECM)写成
Δz_t = −κ · z_{t-1} + ε_tplaintextκ>0 就是回复力:z 越偏离 0,Δz 反向拉得越猛。κ 越大,回复越快。
但 Balke 和 Fomby (1997) 指出,很多宏观经济/金融对其实是门限协整:价差在「带内」(|z| ≤ τ) 是随机游走(不回复),只有冲出「带外」(|z| > τ) 才被一股力快速拽回。写成
Δz_t = −κ · (|z_{t-1}| − τ) · I(|z_{t-1}| > τ) + ε_tplaintext后果很严重:标准 ADF 检验会把这个门限协整价差判为「非平稳」(因为带内那段随机游走拉低了整体的均值回复证据),而即便你用线性 VECM,得到的 κ 也是带内+带外的折中值,严重低估带外的真实回复速度。你据此设定的 ±2σ 入场带,会把大量「带内假信号」当成真机会。
import numpy as np
def simulate_threshold(T=3000, tau=0.20, kappa=0.25, seed=42):
"""带门限的价差:带内随机游走,带外快速回复。"""
rng = np.random.default_rng(seed)
spread = np.zeros(T)
for t in range(1, T):
s_lag = spread[t - 1]
a = abs(s_lag)
if a > tau:
drift = -kappa * (a - tau) * np.sign(s_lag)
else:
drift = 0.0 # 带内:不回复
spread[t] = s_lag + drift + rng.normal(0, 0.012)
common = np.cumsum(rng.normal(0.0002, 0.010, T))
p1 = common + rng.normal(0, 0.004, T)
p2 = common - spread + rng.normal(0, 0.004, T)
return p1, p2, spreadpython
两只资产共享一条共同趋势(所以长期「绑在一起」),但中间夹着这条带门限的价差。这就是配对交易的原材料。
二、TVECM:把门限也当作要估计的参数#
门限协整的难点是:τ 本身未知。TVECM 的做法是「网格搜门限 + 分区 OLS」:
- 在价差绝对值的合理范围内扫一堆候选 τ;
- 对每个 τ,把样本切成「带内」(
|z|≤τ) 和「带外」(|z|>τ) 两堆; - 带外用
Δz = −κ·(|z|−τ)·sign(z) + ε做 OLS 估 κ,带内直接看Δz是否≈0; - 选残差平方和(SSR)最小的那个 τ 作为估计门限。
def fit_tvec(spread, taus):
abslag = np.abs(spread[:-1])
dspread = np.diff(spread)
best = (np.inf, np.nan, np.nan, 0.0)
for tau in taus:
outside = abslag > tau
inside = ~outside
if outside.sum() > 30 and inside.sum() > 30:
Xo = -(np.sign(spread[:-1][outside]) * (abslag[outside] - tau)).reshape(-1, 1)
yo = dspread[outside]
ko = np.linalg.lstsq(Xo, yo, rcond=None)[0][0]
ssr = float(((yo - Xo[:, 0] * ko) ** 2).sum()
+ (dspread[inside] ** 2).sum())
if ssr < best[0]:
best = (ssr, ko, dspread[inside].mean() / (abslag[inside].mean() + 1e-9), tau)
return best # (SSR, kappa_out, slope_in, tau_hat)python跑出来(T=3000, seed=7):
| 量 | 估计值 | 真值 |
|---|---|---|
| 门限 τ | 0.2155 | 0.20 |
| 带外 κ | 0.4891 | 0.25 |
| 带内斜率 | −0.0027 ≈ 0 | 0(随机游走) |
两点信息量极大:
- 门限几乎被精确还原(0.2155 vs 0.20),说明网格搜门限是可行、稳定的;
- 带内斜率≈0 坐实了「伪平稳」假说——价差在带内根本不回复,正是这段让线性 ADF 和线性 VECM 失效;
- 带外 κ=0.49,远比线性 VECM 会报出的「整体平均 κ」大,意味着带外回复极快(半衰期≈1 期)——这才是真正能赚钱的信号。
三、价差的门限结构长什么样#
把价差画出来,门限带 ±τ 一目了然:

肉眼能看出价差大部分时间在 ±0.22 的窄带里「磨蹭」(随机游走),偶尔冲出去又被快速拽回——拽回的那一下,就是门限协整给的超额收益。
把「两区制」的本质画成散点更清楚:横轴是 |z_{t-1}|,纵轴是 Δz_t:

带内那一坨点(绿)横着铺开,斜率≈0——偏离了也不回复;带外(红)是一条陡降的直线,斜率 −κ=−0.49——偏离越多,回复力越大。这条红线的存在,就是门限协整区别于线性协整的全部证据。
四、门控配对:只赚带外那段#
TVECM 给交易的直接启发:带内信号是噪声,别动;只在带外(|z|>τ)才按 z-score 方向下注。对比两种配对:
def backtest(spread, tau, roll=120, entry=2.0, exit_z=0.5, gated=True):
T = len(spread)
mu = np.array([spread[max(0, i - roll):i].mean() for i in range(1, T + 1)])
sd = np.array([spread[max(0, i - roll):i].std() + 1e-9 for i in range(1, T + 1)])
z = (spread - mu) / sd
pos = np.zeros(T)
for i in range(1, T):
in_strong = abs(spread[i - 1]) > tau # 门控:仅带外
if gated and not in_strong:
pos[i] = pos[i - 1] # 带内:持仓不变,不新开
elif z[i - 1] > entry: pos[i] = -1
elif z[i - 1] < -entry: pos[i] = 1
elif abs(z[i - 1]) < exit_z: pos[i] = 0
else: pos[i] = pos[i - 1]
ret = np.zeros(T)
ret[1:] = pos[:-1] * np.diff(spread) # 价差 delta 近似 PnL
eq = np.cumsum(ret)
sh = float(np.sqrt(252) * ret[1:].mean() / ret[1:].std())
return eq, sh, int((np.diff(pos) != 0).sum() / 2)python结果(价差 delta 近似 PnL,τ=0.2155):
| 策略 | 累计 | Sharpe | 交易次数 |
|---|---|---|---|
| 朴素 z-score 配对 | 44.8% | 0.31 | 31 |
| 门限门控配对 | 35.2% | 0.81 | 5 |

注意一个反直觉的点:门控的累计收益(35.2%)反而低于朴素(44.8%),但 Sharpe 高一倍多(0.81 vs 0.31),交易次数砍到 1/6。这正是门限协整想表达的事:
- 朴素策略在带内频繁假突破里反复进出,赚了次数但每笔胜率/盈亏比差,把风险调整后收益拖垮;
- 门控策略只在确定会快速回复的带外下注,单笔质量高、换手极低,风险调整后收益碾压。
如果你按「总收益」排名会误判门控更差;按「Sharpe / 换手」排名,门控完胜。这也是实盘更该看后者——因为真实成本下,31 次交易的摩擦会吃掉朴素策略的大部分纸面收益。
五、和线性协整的衔接#
门限协整不是要推翻 Johansen,而是补它的盲区:
- Johansen / Engle-Granger 先用来确认「长期绑在一起」(存在协整关系)——这是门限协整成立的前提;
- TVECM 再用来刻画「回复的非线性」——决定在哪下注、下注多猛。
所以实务流程是:先用线性检验确认配对资格 → 再用 TVECM 估计门限和带外 κ → 用带外 κ 决定最大持仓周期(半衰期≈1/(−ln(1−κ)))、用 τ 决定入场带。
六、六类真实陷阱#
- 门限 τ 的样本外漂移:τ 是估计出来的,换一段历史会动。真实配对里 τ 会随波动率 regime 变化——高波动期该放宽 τ,否则带内假信号暴增。必须用滚动窗口重估,或把 τ 与近期价差波动率挂钩。
- 带内随机游走的致命性:这是头号坑。如果你没识别出门限,用线性信号在带内频繁交易,那些「偏离了却不回复」的时段会持续亏钱。门限协整的价值一半在于「识别哪些时候不该交易」。
- 门限搜参的过拟合:在历史上把 τ 调到最优,样本外失效。要对 τ 做稳健性扫描(±20% τ 下策略是否还赚钱),且警惕「既用这段数据选 τ 又用这段数据评估」。
- 幸存者/平稳性幻觉:ADF 对门限协整功效低(容易判非平稳)。别因为 ADF 说「不平稳」就丢掉一个好配对——改用 Hansen-Seo (2002) 的门限协整检验,它是专门为真门限结构设计的。
- 交易成本敏感:门控策略的优势是低换手,但一旦你为了「多赚几笔」把入场带从带外往带内挪,换手会指数级上升,成本吞噬优势。门控的纪律性比参数精细度重要。
- 跳空与流动性断裂:真实价差会被跳空、停牌、流动性枯竭打断。带外「快速回复」的假设在系统性危机里可能暂时失效(大家一起跌、价差不回归),必须叠加波动率过滤器或最大持仓时限止损。
七、结语#
门限协整与 TVECM 给配对交易上了一课:「协整」不等于「任何偏离都该回复」。真实的配对更像一根有阈值的弹簧——平时松垮(带内随机游走),只有被拉过临界点时才有劲(带外快速回复)。
对量化研究者,记住三件事:
- 线性协整看到的是被平均的假象,门限结构才是配对「何时真会回归」的真相;
- 门控的核心收益来自「少做」——只赚带外那段确定性回复,风险调整后收益远高于频繁进出;
- Hansen-Seo 检验 + 滚动重估 τ 是把这套思想落到实盘的两个必备动作。
它和之前聊过的 Johansen 多变量协整、统计套利配对是同一谱系:先确认长期绑定,再刻画回复结构,最后用结构化的信号只赚「真会回复」的那段。
注:本文价差序列为带门限误差修正的自洽合成数据(带内随机游走、带外 κ=0.25),用于演示 TVECM 机制;真实配对中 τ 与 κ 时变、且受跳空/流动性断裂干扰,落地需接入真实价格、用 Hansen-Seo 检验确认门限、滚动重估参数并扣真实交易成本。