源文件:research/quant_digests/2026-04-04_0641_binance-1m-walkforward-engle-granger-pairs-alpha.md
README.md + pairs_finder01.py + backtesting_01.py + pairs_summary.csv + trading_bot01.py)+ Binance USDⓈ-M 公共 3m/5m/15m 最小可移植性快检15d train / 5d test 的 walk-forward pair admission + threshold trading 这条完整链路先回答这轮最关键的一句:
> 这篇东西的 base alpha 是什么? > > 答:是 pairs / stat-arb 的 spread 均值回归 raw alpha。
但这份 repo 真正值得 intake 的,不只是“两个币价差偏离再回归”这句老话,而是它把 选对、再训练、再下 z-score 单 这三步串成了一条可复现的短周期骨架:
pairs_finder01.py:在 90+ Binance Futures USDT 合约上做 rolling Engle-Granger 扫描;backtesting_01.py:用 15d train + 5d test 的 walk-forward 方式,生成 spread 与 z-score,并给出 entry / exit / commission;trading_bot01.py:把筛出来的 pair、alpha/beta、阈值、风险比例写进实时 bot 配置。一句话结论:
> 这份仓库最值得 desk 先抄的,不是“又一个 pair z-score”,而是 walk-forward pair admission → intraday spread trade 这层完整 raw alpha 操作系统。
仓库作者 abbbbbv 的 repo pairs_trading_cointegration-(创建于 2025-11-15,最近更新 2026-01-21)把 4 件平时经常被拆开的事放进一条链:
beta 用到底,而是 15 天训练 / 5 天测试 滚动重估;|z| > entry 开仓,|z| < exit 平仓;alpha / beta / threshold / risk_pct 填进 bot。这和单纯“静态 pair + 固定 z-score 回测”不一样:
> alpha 本体不是单独某个 pair,而是“pair admission + spread MR execution”联立后的完整 raw alpha。
backtesting_01.py 里给出的核心壳子很清楚:
1m15d / 5d96|z| > 2.0|z| < 0.50.0004(约 4 bps)risk_per_trade = 0.1而 trading_bot01.py 直接给了 live shortlist:
TRBUSDT-FILUSDT:alpha=2.4443,beta=1.2645,entry=2.5,exit=0.5,risk_pct=0.35IOTAUSDT-ONEUSDT:alpha=2.7384,beta=0.9660,entry=1.5,exit=0.5,risk_pct=0.35这说明作者自己也不是把所有 pair 用同一门槛硬跑,而是已经在做 pair-specific thresholding。
pairs_summary.csv 给出的 shortlist 线索仓库自带的 pairs_summary.csv 虽然不是收益表,但它至少给了 stability + signal density 两类 admission 信息:
REEFUSDT-RVNUSDT:平均 p-value ≈ 0.0088,15/15 个窗口 cointegrated,z_crosses=11,416TRBUSDT-FILUSDT:平均 p-value ≈ 0.0421,10/15 个窗口 cointegrated,z_crosses=14,109IOTAUSDT-ONEUSDT:平均 p-value ≈ 0.0455,12/15 个窗口 cointegrated,z_crosses=13,064这里最重要的不是“哪一对第一名”,而是:
> 它把 pair ranking 的标准从“看上去像”变成了“训练窗稳定性 + 测试窗激活密度”。
这正是我们 desk 当前更需要的 admission layer。
当前 bot7 的主目标不是围绕固定形态内循环,而是持续补充 可独立复现、可直接落地、适合 1m/3m/5m/15m 的 raw alpha 素材池。
这份 repo 值得选,不是因为它“新奇”,而是因为它刚好补了一个很实用的缺口:
如果要回答“它为什么比继续补一个泛化 filter 更值得”,答案很简单:
> 因为它本身就是 raw alpha,而且是完整策略链,不是二层修饰件。
entry / exitrisk_per_trade = 10%35%,说明仓库作者默认做少对数、重仓化4 bps我额外用 Binance USDⓈ-M 公共 kline,对 repo live bot 里两组 pair 做了一个 不依赖私有环境 的最小 portability probe:
fapi/v1/klinesTRBUSDT-FILUSDT、IOTAUSDT-ONEUSDT15m / 5m / 3m15d train + 5d testalpha/betarolling zscore(96),统计 |z| 过门槛频次与 entry=2 / exit=0.5 事件15m:beta ≈ 0.704,spread AR(1) 半衰期约 87.3 bars,测试窗 |z|>=2 共有 58 次,形成 6 次入场、5 次出场,平均持有约 31.5 bars。15m:beta ≈ 0.881,半衰期约 13.4 bars,测试窗 |z|>=2 共有 84 次,形成 7 次入场、6 次出场,平均持有约 33.7 bars。TRB-FIL:|z|>=2 次数从 15m: 58 → 5m: 173 → 3m: 298IOTA-ONE:15m: 84 → 5m: 223 → 3m: 3013m/5m 的 event density 很高,但若没有 maker 占比、挂单排队、最小 tick / 最小名义过滤,极可能只是把更多毛信号换成更多手续费。最保守的解读应该是:
15m 适合做 first-verdict 主线:样本稳定、交易数没那么爆炸;5m 适合做 selective extension:只放最稳定 pair + 更高 entry percentile;3m 默认不直接上 production alpha:除非先证明 maker fill / slippage / cooldown 后仍有净边;1m 可以保留为 live execution / monitoring resolution,但不该先当 admission 主频。long y / short beta*x;5d 重跑一次:cointegration persistencehalf-lifesignal densitytop-of-book liquidityestimated turnover cost2 / 4 / 8 / 12 bps 四档;15m 和 5m 的 break-even signal density。entry=2.0;1.5/0.5,对慢回复 pair 试 2.5/0.5。top 3 pairs;pairs_summary.csv 更多是 admission ranking,不是收益证明。REEF/RVN)对今天 desk 未必够流动或够稳,必须先做 tradability 清洗。trading_bot01.py 里的 live 参数是手工 hard-code,若不定期重估 alpha/beta,很容易 stale。backtesting.py 把 spread 变成合成价格,这对研究阶段够用,但离真实两腿 PnL 还有一层工程差距。risk_pct=0.35,对短周期 pairs 来说偏激进;这更像 demo 配置,不应直接照搬。https://github.com/abbbbbv/pairs_trading_cointegration-https://github.com/abbbbbv/pairs_trading_cointegration-2025-11-152026-01-2110.2307/1913236https://www.jstor.org/stable/1913236https://developers.binance.com/docs/derivatives/usds-margined-futures/market-data/rest-api/Kline-Candlestick-Data1m/3m/5m/15m 抽样reports/artifacts/quant_digests/engle_pairs_20260404_portability.csvresearch/quant_digests/2026-04-04_0641_binance-1m-walkforward-engle-granger-pairs-alpha.md