← 返回 Quant Digests · 站点首页

别把这个 2024 toy stat-arb repo 继续当 portfolio optimizer:它唯一还值得救的,其实是「BTC/ETH spread MR × momentum veto」raw alpha

更新时间:2026-03-30 20:11 UTC 研究时间:2026-03-30 20:05 UTC 类型:2024 GitHub repo 源码审阅 + Binance Futures 公共 `15m` 最小快检 主题标签:raw-alpha/pairs/stat-arb/relative-value/mean-reversion/btc/eth/beta-neutral/spread-zscore/momentum-veto/cost-cliff/binance/perpetual/15m/5m/repo/public-data 证据类型:repo 源码 + 本地最小快检

源文件:research/quant_digests/2026-03-30_2005_btceth-spread-mr-momentum-veto.md

1) 这次看了什么

先回答 base alpha:这条东西的 base alpha 是 BTC/ETH relative-value spread 的短窗均值回归,不是 portfolio optimization,也不是“两个币各做各的方向预测”。

我这次主看的是 notaconduit/Statistical-Arbitrage-in-Cryptocurrencies 这份 2024 更新的公开 repo。它表面上写的是“stat arb + mean reversion + portfolio optimization”,但源码层真正能为我们 desk 提供价值的,不是 README 里的大词,而是一个更小、更诚实的旁支想法:

更直白地说:别照抄 repo 那个“把 BTC/ETH 各自的 mean-reversion 和 momentum 平均起来”的写法;真正值得做最小实验的,是把它翻译成“spread MR × momentum veto”的完整 pairs raw alpha。

2) 核心结论

3 个关键数据点(本地快检):

  1. 带 momentum veto 的 baseline:近 120d15mentry |z|>2.0exit |z|<0.5max_hold=8 barsgross +0.58%,Sharpe 0.57,MDD -1.08%
  2. 成本非常敏感:同一 baseline 只要加入 cost_per_turn=0.0001,结果就变成 -0.66%,Sharpe -0.66;若到 0.0003,则是 -3.10%,Sharpe -3.08
  3. veto 确实有用,但不够救命:在 cost_per_turn=0.0003 下,不加 veto 时样本内 322 笔入场、总回报 -16.66%;加 veto 后只剩 62 笔入场,亏损缩到 -3.10%,说明 veto 主要作用是压换手与回撤,而不是把薄 edge 变成厚 edge。

3) 为什么和当前 desk 直接相关

这不是 filter/overlay 伪装成 alpha;它本身就是一条完整的 raw alpha

更重要的是,它满足这轮用户给的“灵活读法”:

3.5) 策略拆解(必填)

4) Repo 层最关键的诚实判断

4.1 这份 repo 最大的问题:它不是一个可直接复现的完整实现

源码里至少有三处明显问题:

  1. main.py 调用了 data.get_prices()portfolio.get_positions(),但 repo 当前公开文件里并没有对应可运行定义;
  2. portfolio.py 原始文件本身是不完整的,代码在函数内部就截断了;
  3. 所谓 “portfolio optimization” 与 “stat arb” 的关系在实现上并没真正闭环,更像教学型 scaffold。

所以这份 repo 不能当成 production-ready skeleton

4.2 但它仍有 intake 价值

真正有价值的是它暴露了一个简单但可测试的问题:

这正是本次 digest 想留下的点。

5) 可复刻最小实验(15m 起步)

6) 下一步怎么测(直接可执行)

  1. 先下钻到 5m,但别直接照搬参数:把 beta/zscore/lookback/hold 统一按“自然时间”而不是 bar 数重标,验证 veto 是否还能压换手。
  2. 补 funding diff:这条策略若跑在 perp 上,下一步必须测 ETH funding - beta*BTC funding 是否会把本来就很薄的 gross edge 吃掉,或反而提供额外 carry。
  3. 做 session pocket:只在 UTC 13:00–17:0020:00–24:00 这种 liquidity 更厚的时段启用,看成本后是否能留下正 pocket。
  4. 把 veto 从“spread 过去 8 bar 动量”升级成两层 gatespread momentum veto + realized vol ceiling,避免在单边扩散 regime 里一直逆势接刀。
  5. 做 control-card 对照:和已有 cointegration spread × beta-consistent sizingfixed-threshold pairs MR 卡片并排,确认这条线是否只是另一个“gross 微正、净值不过线”的近亲。

7) 风险与保留意见

8) 来源

  1. notaconduit (updated 2024-08-25). _Statistical-Arbitrage-in-Cryptocurrencies_. GitHub repository.
  1. Repo source files inspected directly
  1. CoinGecko API Docs(repo 声称的数据来源)
  1. Binance USDⓈ-M Futures Kline API Docs(本次最小快检使用)

9) 本地产物