← 返回 Quant Digests · 站点首页

别把这份 2025 Bybit C++ 做市 repo 只读成示例工程:对 short-cycle desk,更该先测的是「min-spread floor × laddered quotes × inventory skew × drift-cancel」这条完整 maker raw alpha

更新时间:2026-04-04 10:15 UTC 研究时间:2026-04-04 10:16 UTC 类型:2025 GitHub repo source audit(`README.md` + `src/strategy.cpp` + `src/main.cpp` + `src/trading_helper.cpp` + `.env.example`)+ Bybit V5 公开接口复现实验口径映射 主题标签:raw-alpha/liquidity-provision/market-making/maker/bybit/perpetual/laddered-quotes/inventory-skew/drift-cancel/funding-aware-pnl/execution/microstructure/repo/public-data/1m/3m/5m/15m/cost/risk 证据类型:repo 源码证据 + 交易所公开数据复现实验口径

源文件:research/quant_digests/2026-04-04_1016_bybit-laddered-inventory-skew-maker-alpha.md

1. 这次看了什么

这轮我刻意不继续补 pairs / carry / OFI / 单币反转,而是补一条素材池里同样必须长期保留的家族:

> maker / liquidity provision raw alpha。

原因很简单:

所以这轮选它,不是因为它“最 fancy”,而是因为它非常符合当前优先级:

> 它是一条能独立复现、也能直接落成完整策略壳的 raw alpha。

2. 先回答最重要的一句:base alpha 是什么?

一句话版:

> base alpha 就是:在有足够可赚点差时,用被动双边挂单赚 spread;如果库存偏了,就缩一侧、放另一侧,同时用 TP / stop / gross cap 控住 adverse selection 和库存爆炸。

换成人话:

  1. 先看最优买一卖一和实时 spread;
  2. 如果当前 spread 够宽,就围着 mid 两侧分层挂单;
  3. 被成交后,不赌大方向,而是继续靠另一侧报价和 TP 把库存慢慢卸掉;
  4. 如果 mid 漂得太快、库存太偏、总敞口太大,就收缩甚至暂停报价。

所以这条主题非常清楚:

3. repo 真正给了哪些完整策略部件

3.1 Entry / Quote engine:它不是“挂一笔试试”,而是完整的双边分层做市

src/strategy.cpp 里,核心报价逻辑是:

也就是说,第一层想法不是“预测涨跌”,而是:

> 盘口只要还能留出一点 edge,就按层数在两侧排队吃 spread。

而且 repo 不是单层挂单,而是默认每侧 3 层 ladder。这个点很重要,因为它直接决定:

3.2 Inventory skew:repo 给的不是“均匀双边挂”,而是库存感知报价

这份材料最值钱的一点之一,是它没有把做市写成“永远等量双边挂”。

源码里:

默认配置里:

翻成人话:

> 它的 alpha 不是“始终双边收租”,而是“尽量双边收租,但不为收租把自己堆成单边风险仓”。

这让它从一个示例 bot,变成了可 desk 化的 maker alpha 壳

3.3 Exit:TP、stop、gross cap 都给了,已经不是半成品

这份 repo 的退场层也写得很完整:

这几个部件拼起来以后,结构非常清楚:

也就是说:

> 它已经不是“有信号、没策略”;而是完整到可以直接拿来改成回测器输入的策略定义。

3.4 Refresh / Cancel:它还把 stale quote 问题显式写进去了

src/main.cpp 里还有一个对 short-cycle 很关键的细节:

源码里的口径是:

这很重要,因为 maker alpha 最怕的不是“没挂上”,而是:

> 挂着旧价,结果被新信息反向成交。

repo 至少把这个问题正面写出来了,而不是假装“被动成交=天然有 edge”。

3.5 Cost / PnL:它没有忽略 funding 和 fees

README 和 src/main.cpp / src/trading_helper.cpp 还给了另外一个很像样的地方:

这意味着它的“收益”定义不是拍脑袋,而是更接近真实 desk 视角:

> 净 capture = realized spread - fee ± funding ± inventory mark-to-market。

这对 perpetual maker 策略尤其关键。

4. 这条主题为什么值得进当前研究池

最近学习进展里,我们已经连续补了很多:

这些都重要,但它们大多偏:

而这份 repo 补的是另一条独立家族:

> 不靠方向预测先赚第一层 alpha,而是靠流动性供给本身赚钱。

所以它的价值不只是“又一份 repo”,而是:

5. 这份 repo 最值钱、也最该警惕的地方

5.1 值钱的地方:它真的是完整策略壳,不只是片段

我会把它归入“高可复现度 repo”的原因,是它已经给了:

也就是说,如果现在要做最小复现,不需要先脑补半套规则。

5.2 最该警惕的地方:默认参数薄得吓人,极容易被 adverse selection 吃掉

repo 默认配置里最醒目的数字其实不是“稳”,而是“薄”:

换句话说:

> 这更像“尽量把 very thin maker edge 收干净”的工程模板,而不是已经证明 robust 的 production alpha。

如果你把它直接理解成“0.2bps spread floor 就能长期赚钱”,那基本是在骗自己。真正的敌人是:

所以这条材料的正确读法不是“参数可直接抄”,而是:

> 结构可以先抄,edge 厚度必须重测。

5.3 一个小但很说明问题的细节:README 和 .env.example 口径不完全一致

README 里提到:

.env.example 末尾又直接给了:

这类小不一致恰好说明:

> 它是一个很好的策略工程样板,但不是一份已经被严肃验证过的研究结论。

这也意味着我们更该把它当作“完整策略壳候选”,而不是现成 production truth。

6. 它和 1m / 3m / 5m / 15m 的关系怎么理解

6.1 这条 alpha 的原生时间尺度其实比 1m 更快

严格说,这条策略并不是 K 线形态 alpha:

所以它的原生战场更接近:

而不是纯 15m candle alpha。

6.2 但它依然能服务 5m / 15m desk

对当前 desk,更合理的映射方式不是“强行把信号 bar 化”,而是:

也就是说,这条 alpha 可以这样 desk 化:

> 执行在 1m/3m,风险与是否开 maker 在 5m/15m

这和我们当前短周期研发目标并不冲突,反而能补齐“更快、更偏执行”的 alpha 家族。

7. 最小可复现实验应该怎么定义

如果要最快验证,我不会先碰 live,而是先做一个公开数据 fill-proxy 版最小实验

7.1 数据源

全部公开可得:

更新频率:

7.2 最小实验口径

第一版不用追求完美撮合,只要先回答:

> 这条 maker edge 有没有“扣掉现实摩擦后仍可能存活”的可能性?

第一版口径可以是:

  1. 1s 取一次 BBO / mid;
  2. 按 repo 逻辑生成 bid / ask ladder;
  3. 用“触价 / trade-through / queue haircut”三档 fill proxy 做成交;
  4. 记账时显式扣:
  1. 最后把 PnL 聚合到 1m / 3m / 5m / 15m 看稳定性。

7.3 第一版最该看的不是收益曲线,而是四个诊断量

第一版我最想先看这四个量:

因为 maker alpha 的核心不是“预测对几次”,而是:

> 被动成交以后,净 capture 还剩多少。

8. 我对这条材料的结论

8.1 值得 intake 吗?

值得。

因为它满足:

8.2 现在就能当 production 吗?

不能。

原因也非常明确:

  1. 默认 edge 太薄;
  2. repo 更像工程模板,不像严肃验证结论;
  3. 真实胜负手在 queue / latency / adverse selection,不在 README;
  4. 还没看到 walk-forward、fee-tier 分层、不同 symbol 的稳健性证据。

8.3 最准确的 desk 化定位

我会把它定位成:

> 中高优先级的 maker raw alpha 壳:先验证净 capture、生存成本线和库存周转,再决定它是独立 sleeve,还是作为 execution / liquidity overlay 服务别的 raw alpha。

9. 下一步怎么测

实验 A:先跑一版公开数据 fill-proxy 回测

最小网格:

目的:

> 看“结构成立”还是“默认参数太薄”。

实验 B:单独做成本 / adverse selection 生存线

至少并排测:

通过条件不是收益最大,而是:

> 有没有一块参数区间在保守摩擦下仍为正。

实验 C:做 symbol 分层,不要只看 BTC

这份 repo 的结构天然适合做 symbol stratification:

如果最后发现:

那就别再把它写成“通用 Bybit 做市 alpha”,而要直接收缩成symbol-specific sleeve

实验 D:如果独立 edge 不够厚,就把它降级成共享 execution / overlay 组件

如果最终发现:

那它依然有价值,只是身份要降级为:

也就是:

> 别硬保 raw alpha 身份;能服务其他 raw alpha 也完全值得留下。

10. 参考资料

  1. Sebastian Boehler. (2025). _bybit_market_maker_cpp_. GitHub repository.
  1. Repo source files used in this digest
  1. Bybit API documentation (V5)