源文件:research/quant_digests/2026-04-15_1037_btcshock-eth-underreaction-catchup-alpha.md
README.md + analytics/features.py + analytics/mean_reversion_backtest.py + ingestion/binance_websocket.py + config.py + app.py)+ Binance USDⓈ-M 1m public-data portability probeBTC 出现 1m 冲击、而 ETH 在同一分钟明显“没跟上”时,做 long ETH / short BTC(若是下跌冲击则反向理解为继续做相对 catch-up),持有接下来的 1~2 根 bar,赌 lagger 补动;repo 里的 cross-correlation at lags 更适合服务这条 event-driven relative-value alpha,而不该只留在 dashboard 里。这轮主看的是一个 2025-12 创建、2026-02 仍有更新的新 repo:
HerambPatilcoder2025-12-16,最近更新时间 2026-02-28repo 表面 headline 还是很像那类熟悉的 BTC/ETH spread + z-score + mean reversion dashboard,但这轮如果继续把它写成“又一篇 BTC/ETH spread fade”,和近几天素材池会太近。
它真正还值得 intake 的旁支,是 analytics/features.py 里那条经常被忽略的函数:
cross_corr(x, y, max_lag=20)再加上 repo 已经给好的 live plumbing:
ingestion/binance_websocket.py:实时 trade streamduckdb_storage.py:本地 tick 存储resampler_filter.py:1s / 1m / 5m 重采样app.py:把 lag / corr / z-score / ADF 全都挂上 dashboard所以这轮更值钱的读法不是: > “BTC/ETH spread 又能做均值回复。”
而是: > “既然 repo 已经显式给了 lag-scan,这份材料更适合拿来测 BTC impulse -> ETH delayed catch-up 这条 event-driven relative-value raw alpha,到底有没有短周期 pocket。”
这轮的 base alpha 不是 correlation monitor,也不是 dashboard alert。
它是: > BTC 先剧烈动、ETH 同一分钟却明显没跟上时,后面 1~2 根 1m bar 存在一段短暂的 relative-value catch-up pocket。
翻成人话:
具体可写成:
BTC 1m shock;ETH same-minute underreaction;ETH catch-up vs BTC 的短持有期交易;所以它仍然属于当前 bot7 优先级里更高的那一类:
因为 repo 的主壳当然还是 spread mean reversion:
huber_hedge_ratio(y, x)kalman_hedge_ratio(y, x)spread_and_zscore(y, x, hr, window)mean_reversion_backtest(z, entry_z=2.0, exit_z=0.1)但这一类主题这几天已经补得很密:
继续顺着 headline 写,边际增量不高。
反而 repo 里 明确留着但没被写成主策略 的那条 cross-correlation at lags,更能补当前池子里一个没那么拥挤的 pocket: > 不是 always-on lead-lag,而是“冲击 + 同步失败 + 1~2 bar catch-up”这条更短、更诚实的 event pocket。
features.py关键函数:
cross_corr(x, y, max_lag=20)rolling_corr(x, y, window)huber_hedge_ratio(y, x)kalman_hedge_ratio(y, x, delta=1e-4, R=0.01)adf_test(series)这意味着 repo 不是只能看 contemporaneous spread,它已经允许:
lag 0 之外的相关性;config.pyrepo 的默认实验口径本身就很 desk-friendly:
SYMBOLS = ["btcusdt", "ethusdt"]TIMEFRAMES = {"1s": "1s", "1m": "1min", "5m": "5min"}DEFAULT_WINDOW = 50DEFAULT_Z_THRESHOLD = 2.0这说明作者虽然 README 主要讲 pairs analytics,但实际 scaffold 已经把 1s/1m/5m 快节奏入口给出来了。
ingestion/binance_websocket.pyrepo 用的是:
wss://stream.binance.com:9443/ws/{symbol}@trade再配 DuckDB 存 tick,意味着它天然更适合:
1m;shock -> underreaction -> catch-up。这和“只用日级/小时级 pair cointegration”不是一回事。
我没有继续复刻 repo 的 z-score MR,而是专门测它这条 lag 旁支。
1mBTCUSDT / ETHUSDT30d/root/clawd/jerry/momentum/reports/artifacts/quant_digests/2026-04-15_btceth_lagscan_probe.py/root/clawd/jerry/momentum/reports/artifacts/quant_digests/btceth_laglead_corr30d_2026-04-15.csv/root/clawd/jerry/momentum/reports/artifacts/quant_digests/btceth_laglead_roll30d_2026-04-15.csv/root/clawd/jerry/momentum/reports/artifacts/quant_digests/btceth_laglead_events_q095_2026-04-15.csv/root/clawd/jerry/momentum/reports/artifacts/quant_digests/btceth_laglead_q095_directional_2026-04-15.csv/root/clawd/jerry/momentum/reports/artifacts/quant_digests/btceth_laglead_summary30d_2026-04-15.json这轮故意不用“泛泛 lag correlation”,而是更贴 desk:
BTC 1m return 达到近 30d 的高分位 shock(我扫了 95% / 97.5% / 99% 三档);ETH 的同向反应不到 BTC 幅度的 40%,或直接没同向跟上;ETH same-minute underreaction;1~2 根 bar 的:ETH 自身是否继续朝 BTC shock 方向补动;long ETH / short BTC 的 relative-value PnL proxy 是否为正。lag 0 相关性约 0.873;lag -1 约 0.054lag +1 约 0.0206h window、每小时取一次 peak lag,714/714 次都是 lag 0。这句很重要: > 别把 repo 里的 lag-scan 误读成“存在稳态 1m 级 BTC->ETH lead-lag”。至少 recent 30d 的 Binance perp proxy 不支持。
95% shock 阈值时,近 30d 一共识别到 67 次事件;1m 的 long ETH / short BTC signed RV proxy 平均 +2.07 bps;2m 的 signed RV proxy 平均 +3.95 bps;BTC down-shock 子样本:33 次1m RV 平均 +3.35 bps,hit rate 69.7%2m RV 平均 +3.42 bps,hit rate 72.7%99% shock 样本更少,稳定性反而下降。99% 只有 10 次事件1m RV 平均反而 -2.22 bps2m RV 才回到 +1.28 bps所以这轮最诚实的结论是: > 广义的 BTC/ETH lead-lag raw alpha 不成立;真正值得测的是“BTC shock × ETH same-minute underreaction”这种条件化 catch-up pocket。
如果把它写成最小策略骨架,建议是:
1m 主状态,3m/5m 做背景过滤|BTC 1m ret| > q95 或更稳健的 rolling EVT / realized-vol 标准化冲击ETH same-minute ret 同向幅度 < 0.4 * |BTC ret|BTC 上冲、ETH 没跟上 -> long ETH / short BTCBTC 下砸、ETH 没跟上 -> 仍做 catch-up 方向的 short ETH / long BTC优先先测最简单三种:
1 bar2 barsETH 补动到某个比例(例如达到 BTC 冲击的 60~80%)就走这条线最容易死在两个地方:
2~4 bps 的毛边。所以 production 前至少要补:
BTC trend continuation vetobase alpha 很明确:underreaction catch-up。
因为近几天 pairs/stat-arb 已经很多,而这条是更短、更事件化的 relative-value pocket。
trade websocket + DuckDB + 1s/1m/5m resample + lag/corr dashboard 这套东西,天然适合下一步做 online detector。
优先按下面 4 个 ablation 走,不要直接上线:
q90 / q95 / q97.5 / q990.2 / 0.4 / 0.62bar 比 1bar 更像可留边BTC shock + ETH underreaction + lag0 high / no regime break 同时满足时才开机。如果这 4 步之后,1m/2m 版本扣完双腿 friction 还能保住正的 post-cost bps/event,这条就有资格进入更正式的 event-driven RV replication 池。
analytics/features.py: <https://raw.githubusercontent.com/HerambPatilcoder/Crypto_Pairs_trading/main/analytics/features.py>analytics/mean_reversion_backtest.py: <https://raw.githubusercontent.com/HerambPatilcoder/Crypto_Pairs_trading/main/analytics/mean_reversion_backtest.py>ingestion/binance_websocket.py: <https://raw.githubusercontent.com/HerambPatilcoder/Crypto_Pairs_trading/main/ingestion/binance_websocket.py>config.py: <https://raw.githubusercontent.com/HerambPatilcoder/Crypto_Pairs_trading/main/config.py>app.py: <https://raw.githubusercontent.com/HerambPatilcoder/Crypto_Pairs_trading/main/app.py>/root/clawd/jerry/momentum/reports/artifacts/quant_digests/2026-04-15_btceth_lagscan_probe.py