源文件:research/quant_digests/2026-04-06_0843_binance-l2-feeaware-as-maker-alpha.md
README.md + code/README.md + code/as_backtest.py + code/run_as_pipeline.py)+ Binance Futures 官方公开文档 + 经典 inventory-based market making 文献 groundingBTCUSDT 上持续挂双边 maker quote,赚的是“可覆盖 maker fee 的 bid-ask spread capture”;reservation price / inventory skew / fee floor / latency / queue 这些不是 alpha 替身,而是把这条 spread alpha 从玩具回测拉回现实所必需的执行层。> 先回答一句:这篇东西的 base alpha 是什么? > > base alpha = 在高流动、持续有对手盘的 perpetual order book 上,双边提供流动性并吃 spread。 > 不是方向预测,不是 filter,也不是 overlay;真正的赚钱假设仍然是 spread capture。只是这份 repo 的价值在于,它把「费率、延迟、排队」这些最容易把纸面 maker alpha 打回负数的现实约束,直接塞进了同一个可复现研究壳里。
这轮更值得先收的,不是又一篇“maker 很赚钱”的截图,而是这份 2026 新 repo 对 BTCUSDT 真实 L2 的重建式 A-S 回测:它让我们第一次能把 maker raw alpha 本体,和 fee / latency / queue 这三层现实损耗拆开测清楚。
这轮选它,主要有 4 个原因:
pairs / carry / cross-sectional / LOB directional 题;maker 虽然也出现过,但更多是宽价差 alt-perp 壳,这次是 BTCUSDT + 真实 L2 + queue/latency realism,不是同一件事。> gross edge 可能有,但净值常常先死在 fee,再死在 stale quote 和 queue 幻觉。
OBI / OFI / liquidity veto / adverse selection overlay 素材;这份东西不是和它们竞争,而是给这些组件找到了一个更自然的宿主:maker raw alpha 本体 + toxicity/regime veto。
要先把话说死,不然很容易把 A-S 读歪:
> A-S 的 base alpha 不是“模型公式”,而是“被动挂单吃 spread”本身。
说人话:
所以这里:
reservation price 负责把库存风险价格化;half-spread 负责决定你挂多宽;fee floor 负责避免“明明成交了,但每次 round-trip 都先亏给手续费”;latency / queue 负责告诉你:纸面上触价 ≠ 真实世界里轮得到你成交。
它们都重要,但它们服务的仍然是同一个 raw alpha: two-sided spread capture。
2026-03-202026-03-2816README 开宗明义写得很清楚: 这不是 production trading system,而是一个“把完整研究 workflow 复现出来”的项目。它的研究路径是:
snapshot / diff depth / aggTrade;snapshot + diff depth 重建 order book;这点很关键: > 它不是只给了一个公式,而是给了从 public data 到报告输出的完整研究闭环。
repo README 自己总结的当前结论非常实:
order_size 往往同时放大收益和回撤;这几句其实就是这篇 digest 的核心: maker alpha 值得收,但必须先当“gross alpha + execution haircut”去测,而不是把 gross 误当净 alpha。
README 列出的 as_backtest.py 默认参数:
order_size = 0.003max_order_notional = 300inventory_limit = 0.03maker_fee_rate = 0.0002dynamic_window_seconds = 10order_latency_ms = 150cancel_latency_ms = 100fee_spread_multiplier = 1.0这意味着它天然已经是一个完整策略壳:
order_size,但受 cash / max_notional / inventory_limit / qty_step 共同裁剪;所以它不是单独一个 filter,也不是只会给一个“alpha 方向”; 它本身就是一条能落成完整策略的 raw alpha shell。
as_backtest.py 先读取:
snapshot.ndjsondepth.ndjsonaggtrade.ndjson然后:
best_bid / best_ask / mid / spread;aggTrade 去检查 resting order 是否真的能被打到。这是它相对很多 maker repo 最重要的升级: > 不再是“bar high/low 碰到报价就算成交”,而是起码有了 book state + trade replay。
这还不等于完美,但已经从“回测幻觉”往前走了一大步。
源码里最关键的一行是:
reservation = event.mid - account.position_btc * auto_gamma * (sigma_now**2) * quote_horizon然后 half-spread 取:
0.5 * event.spread;min_half_spread_from_fees;三者的最大值。
这件事的交易翻译很简单:
reservation price 越往减仓方向偏;这比很多“只背 A-S 公式”的实现强很多,因为它明确承认: 真实 maker quote 的下界,常常不是理论最优,而是成本最优。
源码里 dynamic_window_seconds = 10,会在滚动窗口里动态估计:
sigmaintensityk并在 gamma 未手动指定时,先用库存风险预算推一个 base gamma,再在候选 gamma 网格上做小规模选择。
这让它更像 short-cycle desk 会真的去做的事情: 不是用一个永远不变的全局参数,而是承认盘口毒性和 arrival intensity 是会随时间变的。
源码里专门做了两件多数 repo 会跳过的事:
queue_ahead = best_bid_qtyqueue_ahead = best_ask_qtyorder_latency_ms = 150cancel_latency_ms = 100这两层现实性非常关键,因为 maker alpha 的大坑往往不是“公式不够优雅”,而是:
源码里 buy size 会被裁成:
cash_usdt 能负担的最大可买量;inventory_limit - current_position 允许的最大量;max_order_notional / bid_quote 的额度上限;qty_step 对齐。sell side 也同样受库存边界控制。
这意味着它不是“理论上一直双边对称挂满”,而是会因为已有库存与现金状态,动态缩一边、保另一边。
对 desk 来说,这正是 maker raw alpha 该有的定义:
README 给出的最新 5-minute full pipeline run:
events = 2925trades_seen = 5304fills = 5gross_pnl_before_fees = +0.0453 USDTfees_paid = 0.1690 USDTnet_pnl = -0.1237 USDT这组数非常值钱,因为它告诉我们:
> 在真实 L2 + aggTrade 的短样本上,spread capture 毛利可以为正,但若 quote 不够宽、成交不够好、或 fill 数太稀,fee 很容易把净值直接吃穿。
README 还给了一个信息点:
zero fees 假设下,size = 0.005 大约 net_pnl ≈ +0.00625 USDT这不是为了鼓吹“去掉 fee 就稳赚”; 恰恰相反,它告诉我们最现实的一句话:
> 这条 alpha 更像“有一点点 gross edge,但边际很薄”,所以任何 fee、latency、queue 误判都会把它从正打成负。
Binance 官方公开文档写明:
100ms / 250ms / 500ms 推送;aggTrade 以 100ms 聚合成交推送;GET /fapi/v1/depth 可取 snapshot,支持公开查询。这意味着这条研究不依赖私有撮合日志; 最小实验所需数据是公开可拿、更新频率也足够高的。
这个分类很重要。
如果这篇东西的核心只是:
那它顶多算 overlay。
但这里不是。
这里真正被交易的对象是:
所以:
换句话说: > 它不是“maker 的风控研究”;它首先是一条 maker raw alpha,然后顺手把风控做对了。
1m / 3m / 5m / 15m 的关系该怎么读这条东西不是传统 K 线 directional signal,所以不能硬装成“每根 5m bar 预测未来 5m return”。
更诚实、也更适合 desk 的读法是:
1m / 3m拿来做:
5m拿来做:
15m拿来做:
也就是说: > 事件时间是执行时钟,1m/3m/5m/15m 是管理时钟。
这并不削弱它的价值,反而让策略定义更符合实盘。
这是我认为这份材料最该带来的测试框架:
数据源
/fapi/v1/depth snapshot公开性
更新频率
100ms/250ms/500ms100ms最小实验标的
BTCUSDT。最小实验窗口
20 个独立 15m session;1m / 3m / 5m 管理窗口看参数稳定性。A. Toy A-S:无 fee、无 latency、无 queue; B. + Fee floor:加 maker fee 下界; C. + Latency:加 150ms/100ms 订单生命周期; D. + Queue:加 queue-ahead 与 aggTrade fill 检查。
最该看的不是最终绝对收益,而是每加一层现实性时:
如果 A 正、B/C/D 全负,那就别再骗自己“alpha 还在”。 如果 A/B/C 还能活,只是 D 砍掉一半,那下一步就该去做 queue / quote-priority 优化,而不是盲目 widen spread。
我会把下一步拆成 3 级:
BTCUSDTOBI / OFI / slippage / liquidity 素材接成 maker veto;BTCUSDT 把 realism haircut 拆清楚;值得进研究池,而且优先级不低。
但值得收的不是“Avellaneda–Stoikov”这个大名字本身,而是:
> 这份 2026 repo 终于把 maker raw alpha 最容易自欺的三件事——fee、latency、queue——一起摆上桌了。
所以对当前 desk,它的最佳用法不是:
而是把它当作:
OBI / OFI / toxicity / volatility veto 组件的主宿主。snapshot + diff-depth + aggTrade 抓 BTCUSDT 连续 20 个 15m session。Toy / +Fee / +Latency / +Queue。gross_pnl_before_feesfees_paidnet_pnlfillsinventory_abs_meanquote_refresh_events / replace_requests依次接到 maker 壳上,测它们各自对 fills / gross / net / inventory tail 的边际改善。
BTCUSDT -> ETHUSDT -> SOLUSDT10.1080/1469768070138122810.1007/s11579-012-0087-0