做什么(One-liner)
Engle-Granger 2 步协整检验:两条序列是否存在 long-run 稳态关系,返回 t-stat / p-value / hedge ratio / spread z-score。配对交易的必备前置筛选。
怎么用
Canvas 拖 cointegration_v1,填 series_a、series_b(必填)+ significance(可选,默认 0.05)。输出布尔判断 + 完整统计量。
典型用法:
series_a = SPY 价格
series_b = IVV 价格 # 都跟踪 S&P 500,应该高度协整
→ is_cointegrated: True, hedge_ratio ≈ 1.0, z_score ≈ 0核心公式
Step 1 — OLS: a_t = α + β · b_t + ε_t
Step 2 — ADF: H0: ε_t has unit root (not cointegrated)
H1: ε_t is I(0) stationary
→ p-value < significance → reject H0 → cointegrated
spread_t = a_t - α - β · b_t
z_t = (spread_t - mean(spread)) / std(spread, ddof=0)Rounding 契约(golden 锁定):
- t_stat / p_value / critical_values / z_score →
round(4) - hedge_ratio / spread_mean / spread_std →
round(6)
假设与适用场景
假设:两序列都 I(1) + 线性协整 + constant-only(无 trend)+ 同步时间戳。
适用:ETF 对配对交易、跨市场套利、宏观 long-run 关系;n≥30(实操 n≥100 更稳)。
不适用:HFT / tick、> 2 序列(用 Johansen)、非线性 / regime-switch。
输入 / 输出契约
{series_a, series_b, significance?} → {is_cointegrated, t_statistic, p_value, critical_values: {1%, 5%, 10%}, hedge_ratio, spread_mean, spread_std, current_z_score, n_observations, _method}。详见 frontmatter。
已知局限
- Pairwise only(> 2 需 Johansen)
- n=30 低 power,实操 n≥100 更可靠
- Constant-only(无 deterministic trend)
- 不输出 β 的 SE / CI
- 不做 structural break test(Gregory-Hansen 未实现)
- spread std 用 ddof=0(Bloomberg 有时用 ddof=1)
参考文献
Engle-Granger (1987) 诺奖原始论文 + Hamilton (1994) Ch.19 教科书 + MacKinnon (2010) critical values 表(statsmodels 内部使用)。详见 frontmatter。
Golden Test
tests/golden/fixtures/tier2/cointegration/,1e-12 tolerance(post-rounding byte-equality)。4 tests:
matches_reference— field-by-field byte equality vs wrapper-mirrored referencedeterminism— 5 reruns byte-identicalrejects_short_series— n<30 → error payloadsignificance_threshold_matters— significance 改变is_cointegrated布尔但不影响 t_stat / p_value / hedge_ratio 等 intrinsic 量
参考实现走同样的 statsmodels.coint + np.linalg.lstsq OLS 派生,锁定 Pangura 的 wrapper 行为(输入 cast / rounding / design matrix / std ddof)。
Changelog
- 1.0.0 (2026-04-20) — 首次 Active

