← 返回 Quant Digests · 站点首页

别把这份 HFT repo 只读成低延迟炫技:对 short-cycle desk,更该先拆的是「microprice spread z-score fade × OBI veto」这条 raw alpha 壳

更新时间:2026-04-14 21:57 UTC 研究时间:2026-04-14 22:18 UTC 类型:2026 GitHub repo source audit(`README.md` + `main.cpp` + `optimizer.py` + `analyzer.py` + `book_recorder.py` + `data_loader.py` + `fix_strategies.py`)+ Binance USDⓈ-M `1h/1m/1s` public-data portability probe 主题标签:raw-alpha/pairs/stat-arb/relative-value/mean-reversion/microprice/order-book-imbalance/obi/microstructure/hft/binance-perpetual/1s/1m/3m/5m/repo/public-data/cost/risk 证据类型:repo source audit + public-data live probe + public-data portability backtest

源文件:research/quant_digests/2026-04-14_2218_microprice-obi-spreadfade-shell.md

1. 这次为什么选它

这轮默认还是优先补 raw alpha 素材池,而不是再写一个纯 gate / overlay。

最近几篇 digest 已经写过不少 pairs / cointegration / spread fade,但还没单独把这条线拆清楚:

> 当 spread 本体还是老老实实的均值回复时,能不能把“更快的定价口径(microprice)+ 更近盘口的 admission(OBI veto)+ 更像生产壳的执行线程”拼成一条更短周期的 pairs shell?

这份 repo 值得看的地方,不是作者自称 ~42µs 逻辑延迟,也不是 AWS Tokyo 这些工程姿势;真正值得 desk 收进池子的,是它把下面三件事放在了一条链里:

  1. pair admission:先用相关性 / 协整 / ADF / half-life 找 pair;
  2. signal:对 pair 的 microprice spread 做 z-score fade;
  3. execution veto:用两个腿各自的 OBI 决定是否允许开仓。

一句话说,它不是“又一个普通 z-score pair notebook”,而是:

> spread mean reversion 这条 raw alpha,往真正更短的微观结构执行层又推了一步。

2. 这次看了什么

2.1 仓库信息

2.2 我重点看的源码

这些文件基本把作者想表达的结构都摆出来了:

3. 先把 base alpha 说死:不是 OBI alpha,也不是 latency alpha

这篇东西的 base alpha 是什么?

> base alpha = 协整 pair 的 spread mean reversion。

更具体点:

这里:

所以它不是:

它本质上还是一条很标准的:

> pairs / stat-arb / relative-value / mean-reversion raw alpha。

4. repo 里最值得记住的策略骨架

4.1 research layer:先找 pair,再做 spread

analyzer.py 的路线是:

翻成人话就是:

> 不是拿任何两个相关币就直接上 z-score,而是先问“它到底像不像一条会回来的 spread”。

4.2 optimizer layer:1m spread 回测 + 参数网格

optimizer.py 用的是典型的 spread-fade 网格:

逻辑也很直白:

这部分没什么花活,但优点是:alpha 本体很干净,容易搬到我们自己的 1m / 3m / 5m 研究框架里。

4.3 C++ live layer:真正的新意在 microprice + OBI veto

main.cpp 里,作者没有直接用 last 或普通 mid,而是用:

> microprice = (best_bid * ask_vol + best_ask * bid_vol) / (bid_vol + ask_vol)

也就是:

然后在 pair 信号里再叠一层 OBI

开仓逻辑可以翻成人话:

这层东西最值得 desk 记住的,不是阈值本身,而是它背后的结构:

> spread alpha 负责告诉你“价差远了”;OBI 负责告诉你“现在追进去会不会刚好撞上盘口不利一侧”。

5. 但它还不能被直接叫做 production shell:源码里有 3 个很关键的断点

这是这轮最值得诚实写出来的部分。

5.1 optimizer.pymain.cpp 没真正接上

optimizer.py 输出的是:

main.cpp 真正读取并使用的却是:

也就是说:

> 研究层找到的 entry/exit/stop 参数,live engine 根本没用上。

5.2 main.cpp 依赖 mean/std_dev,而 optimizer 并不输出它们

这也是为什么 repo 里又多了一份 fix_strategies.py

换句话说:

> repo 现在不是“一键从 research 直通 live”,而是 research 产物还要再补一次参数,才能接进执行层。

5.3 pair admission 里的 half-life 单位有歧义

analyzer.py 注释写的是:

但它实际是在 1 小时重采样数据 上估 half-life,再直接拿 hl < 240 做筛选。

这意味着代码实际放行的更像是:

这会直接影响 pair universe:

6. 我这轮做的 Binance public-data portability probe

为了不只停在源码阅读,我补了两层最小验证:

6.1 第一步:先在 liquid universe 里找一个还能讲得通的 pair

我用 Binance USDⓈ-M 当前 24h quote volume 前 15 个 USDT 对,抓最近 3251h 收盘,按 repo 的大框架做了一个 quick pair scan。

其中比较干净的一对是:

为什么选这对?

6.2 第二步:做 180 秒 live microstructure quick check

我按 repo 的思路,用 Binance depth?limit=5 连续抓了 180sDOGE/XRP 五档盘口,计算:

同时用最近 2001m close(配合 hedge ratio)给 spread 做 mean/std 标准化。

产物保存到了:

结果很直白:

这说明什么?

> 在 liquid pair 上,这种 microprice spread + OBI veto 不是那种“每分钟乱响一堆信号”的玩具。它更像一个低频、挑时机、需要更长观察窗或更多 pair 并行的短周期壳。

6.3 第三步:补一个 7 天 1m portability backtest

我继续对同一对 DOGE/XRP 抓了最近 7d1m K 线(10080 bars),沿用 repo 的参数网格跑最小 spread 回测。

核心结果:

  1. 不计费时,spread MR 本体是正的
  1. 按 repo 口径的 12 bps round-trip 费用后,best 组合转负
  1. 如果 friction 压到约 6 bps round-trip,best 组合又回到正值
  1. 信号本身并不稀缺

这组数字最重要的解读不是“它能直接上”,而是:

> spread MR 本体存在,但它对 friction 非常敏感;repo 里那种 HFT/microstructure 包装,不是锦上添花,而是它能否活下来的核心。

7. first verdict:这是 raw alpha,但还不是可直接落地的完整策略

把这轮结论压缩成四句话:

  1. 它是 raw alpha,不是 filter。
  1. 它能独立复现。
  1. 它还不能直接落地成完整 production shell。
  1. 它更像“低摩擦 + 更强执行”的 pocket。

所以这轮 4 字段应该老实写成:

8. 这条线为什么仍然值得进入研究池

8.1 它补的不是“又一个 pairs 标题”,而是 pairs × microstructure admission

最近 pairs digest 已经不少,但多数还停在:

这份 repo 额外给出的,是:

> 把 spread 的观察口径往盘口推进一层,把 admission 也往盘口推进一层。

这对 short-cycle desk 是有增量的。

8.2 它把“alpha 本体”和“执行壳”分得还算清楚

这点很重要。源码虽然有断点,但结构上没有混淆:

这种拆法对我们自己重写最有帮助。

8.3 它提醒了一个现实:HFT 外壳不是装饰,而是 edge 的一部分

这类 alpha 在 1m 甚至更快层面,常见误判就是:

这轮 quick probe 恰好反过来提醒:

> 如果 friction 压不下去,那你看到的可能只是“有方向感的统计现象”,不一定是“可交易的 PnL”。

9. 下一步怎么测

我不建议下一步继续在同一套粗糙 taker 框架里磨参数;更值钱的是下面 4 件事:

9.1 先修 research-to-live handoff

必须先改掉两处硬伤:

不修这个,后面所有 live probe 都会混着配置漂移。

9.2 把 pair admission 改成真正适合 short-cycle 的口径

建议:

9.3 execution 先测“maker-first close-out”,不要急着追更多 signal

最小实验可以这样分层:

9.4 OBI 别再用固定阈值,改成分位数 / z-score 版

±0.2 这种裸阈值太依赖单币微观结构。

下一轮更值得测的是:

这样更容易扩到不同 liquidity bucket。

10. 相关产物

11. 来源

  1. Samarth Chaudhary. (2026). _Crypto_Stat-Arb_HFT_Model_. GitHub repository.
  1. Repo source files used in this digest
  1. Public data used for portability check