NarrowGate 成交质量与动作选择:Markout、Quote EV 和 E/C 实验

做市商需要判断的不只是订单能否成交,还包括成交后增加的库存是否值得持有。从成交价起算的短期 markout 衡量未来估值相对成交价的价格优势,却不能直接告诉我们:跳过这次交易、把报价挂得更远,或者继续等待,最终是否会让账户赚得更多。

原因在于,动作会改变后续路径。少一笔成交,可能少承担一段不利库存,也可能失去正常价差、改变减仓机会或延长已有仓位的持有时间。要从“这笔成交后来亏了”走到“当时应该采取另一种动作”,需要依次区分成交质量、库存归因与相对基线的完整路径收益。

短期价格变化与完整库存价值

一个 fill 的早期 maker-signed markout 可以写成

动作比较的共同终点 T 必须事前定义:可以是固定窗口、库存生命周期终点或完整账户终点,不要求一律等到 flat。在未将费用和资金费净含于成交现金项的写法中:

第一式是价格差单位,fee 须匹配该单位;第二式是账户货币单位,包含初始库存估值及带符号资金费。使用已经净含费用或资金费的 cash 字段时直接计算权益差,不重复扣加。动作价值为 DeltaV = (W_T - W_0)_action - (W_T - W_0)_baseline,两路径使用同一初态与终点;不能将负 markout 取反当作可避免损失。E/C 使用决策后 30 秒共同结算、未平库存按合同估值,而完整策略反复应用后的净 PnL 仍需完整账户评价。

从标签到动作:各项实验的比较对象

实验 比较对象 结果的适用范围
Fill-to-inventory lifecycle 30 秒 markout 与 库存生命周期 PnL 的关系是什么? 保留 estimand;旧绝对数值撤回
Dynamic 库存生命周期 attribution add toxicity、repair failure 如何累积为库存尾部? 描述机制;不能当动作因果结论
First-add terminal loss 负价值从哪个决策时刻开始? 两侧均值稳定为负;没有稳定可执行 subgroup
Decision-visible fill value 当时可见状态能否提前筛出负价值路径? chronological prediction branches 关闭
BUY soft-widen action 解除一次放宽是否创造直接 assignment-to-terminal value? 动作真实发生;两种 role 均负,关闭

成交前 E/C:独立的配对选择实验

这与上表成交条件 markout/soft-widen、以及另一个双侧十头风险加宽单账户实验不同。E 为 POST−WAIT,只处理原基线允许的空仓开仓机会;C 为 KEEP−CANCEL,只处理基线 KEEP、仍有效且属于可见增险角色的旧单。四个 Ridge 对应 E/C 的 BUY/SELL 表面,不是 F03 十三头或 F05 十头。30 秒是一次干预后的共同结算窗口,不是新增冷却,更不是短标签可以直接累加成账户 PnL。

实际冻结输入为八项:侧向 L1 不平衡、波动率、同侧距离 ticks、spread ticks、可见库存 lots、其他同侧 pending lots、对侧 pending lots、本地订单年龄。缺少严格支持的 5 秒成交不平衡与中价变化未用其他窗口替代。字段单位与可见性由实际特征消费者约束,不包含未来成交信息。

f03-407-t100-final107-v2 已完成 2,288 个有效标签对、16 个合法空槽、132 个标签父账户、4 次冻结拟合,以及同一 204 个独立账户上的十路径、2,040 个经济单元、4,070 策略日。2,304 是槽位配额而非有效标签数。T100 提供拟合,A50/B100/C50 是交错日期诊断;全期包含训练日,Final 不供监督标签但已经评价。维护状态见同一机器台账,私有模型、配置和收益表不公开。

EC 是原预声明主候选,不事后改称 E。随机对照匹配训练期机会流的否决概率,不匹配评价期成交量、库存暴露或实际否决率;仅两个种子的证据有限。减亏或单位成交额改善不单独证明选择性,不能据此断言随机更聪明或 E 等于随机减单。该批已完成不等于稳定盈利或整个 F05/F07 完成;E 未替换 B0/live,CANCEL 也不等于 REPLACE/REENTER。

完整路径支持什么结论

该批全期和 Final 汇总中,各路径仍均亏损。模型 E、EC 相对 B0 少亏,但 C 单独使用、以及把 C 加到 E 上的效果随评价范围改变方向,没有一致的额外收益证据。不能因为 E 更有利,就把原预声明主候选 EC 事后改名为 E。

随机 E/EC 对照的总亏损更少,同时成交量也明显更低,因此它们不是同成交量对照。模型 E 的单位成交额损益比两个随机 E 对照略好,但在 Final 上仍弱于 B0。总额与单位成交额回答不同问题:少亏可能伴随少交易,而单位指标略好也不保证完整账户更好。现有结果既不能证明稳定选择性,也不能简单断言“随机比模型聪明”或“E 就是随机减单”;两个种子还不足以刻画随机对照的分布。

这项实验归 F05,C 从 F07 交叉引用订单生命周期语义。完成的是这一批标签、拟合和完整策略比较,不是整个 F05/F07 的成功,也不是 E 已进入 B0 或 live。全期含训练日、A/B/C 为交错诊断、Final 已有使用历史,均限制结果的外推。

Fill-to-inventory lifecycle

成交后的价格变化、单份库存何时被抵消、净库存何时归零,是三个不同终点。这里先定义它们,再说明为什么历史时长统计失效后,方法上的区别仍然成立。

Fill、30 秒 markout、inventory lot 与 库存生命周期 terminal 的生命周期

图 1:同一 opening fill 启动短期 markout、库存 lot 和库存生命周期时钟。回放终点仍未关闭时,持有时长右删失;未平仓价值按期末估值纳入权益。这是成交后时间轴,不是 E/C 决策后 30 秒动作标签图。

从 markout 到 action uplift 的归因阶梯

图 2:fill markout、lot、库存生命周期、portfolio mechanism 与 action uplift 是五层不同证据。左侧可以定位毒性与持有风险,只有最右侧完整反事实才回答“改变报价是否值得”。

一个 fill 同时启动了三只时钟

假设 maker BUY 在 $t_f$ 以价格 $P_f$ 成交,创建正库存。第一只时钟是 micro markout clock:在预先冻结的 $h=1,5,20,30$ 秒读取因果可见的 mid-price,测量相对成交价的短期价格优势,并另行分解成交后的中价变化。第二只时钟是 lot lifecycle:等待未来 reducing SELL fills 按某种归因规则抵消该 opening quantity。第三只时钟是库存生命周期:从库存离开零开始,直到整个策略库存重新回到 flat。

三只时钟的终点通常不同。价格可能在 30 秒内向上,使 BUY markout 为正,但该库存随后长时间占用风险预算;也可能 30 秒 markout 为负,却在后续 reducing fill 与 spread capture 中修复。只读取任意一个终点都会遗漏其它机制。

因此“fill PnL”不是一个天然字段。研究必须先说明分母是一笔 fill、一个 attributed lot、一次 库存生命周期,还是一个随机化 intervention;再说明终点是固定 horizon、lot close、库存生命周期 flat 或 replay terminal MTM。

Micro markout:它回答的是早期 adverse selection

令 maker side sign 为

以 fill price 为起点的 $h$ 秒 maker-signed markout 可以写为

$Mh>0$ 表示未来估值相对成交价仍有正价格优势,不保证成交后的中价向有利方向移动。绝对价格差可拆成 $s(P{mid}(tf)-P_f)+s(P{mid}(tf+h)-P{mid}(t_f))$;判断不利选择时,应分别分析成交时价格优势与成交后中价变化。例如合成买入价99.90、成交时中价100.00、未来中价99.95:完整价格 markout 为+0.05,后续中价变化却为−0.05;这只是定义示例,不是实际成交。上式 bps 以成交价归一化;货币价值还需匹配数量,费用只能扣一次。该标签没有包含订单在 fill 前的 queue cost、后续库存持有风险、减仓执行、手续费或库存生命周期尾部,不是完整净 PnL。

实际观测还需要区分 target time 与 observation time。若目标是 $t_f+30s$,却只在更晚一次 quote decision 才读取 markout,那么名义 30 秒可能变成 10–20 秒额外延迟。后续 time/unit repair 因此要求用频繁 wall-clock tick 解析 pending markout,并记录 target、actual observation、source age 与 censoring。

Inventory lot:交易所不会告诉你 FIFO 还是 LIFO

opening/add fill 会增加绝对库存,reducing fill 会降低绝对库存,但 inventory 是 fungible 的。若策略先后买入两笔,再卖出一笔,交易所只知道净数量变化,不知道该 SELL 关闭第一笔 BUY 还是第二笔 BUY。

FIFO 把最早 opening quantity 先关闭,LIFO 把最近 opening quantity 先关闭。对一个 attributed lot $\ell$,可定义

若 opening 与 reducing 都是 passive fills,closed-lot realized value 可以按配对 quantity、成交价和费用计算。但 FIFO/LIFO 的差异是 model uncertainty,不是 exchange-observed truth。报告一条 lot-duration 曲线时,至少应同时给出两种归因、closed rate、median、tail quantiles 与 censoring rate。

对 replay 结束仍未关闭的 lot,$T_{lot}$ 是右删失。不能把 replay boundary 当作一笔虚构 taker close,也不能无依据扣除假设性 taker fee。价值评价仍须按合同将 terminal MTM 纳入权益,并单独报告该分量:

它是窗口终点上的策略权益,不是 realized lot PnL。

一个 FIFO/LIFO 都合理却给出不同 duration 的例子

假设先后以 100.00、99.90 各 BUY 0.001 BTC,随后以 100.05 SELL 0.001。FIFO认为第一笔在 100.05关闭,lot duration较长、毛价差 +0.05;LIFO认为第二笔关闭,duration较短、毛价差 +0.15。净库存都从 0.002降到0.001,现金与终局权益完全相同。

因此 lot attribution可改变“哪笔fill修复更快、哪笔赚多少”的叙述,却不应改变组合会计:

在FIFO/LIFO下相同。若两种规则算出不同terminal equity,说明实现重复或漏记quantity/fee,而不是发现了市场效应。

Lot duration 是归因量,inventory-time 是路径量

FIFO/LIFO duration依赖配对约定;absolute inventory-time:

直接由净库存路径确定,不需要指定哪个reducing fill关哪一lot。前者适合解释fill cohort,后者适合衡量策略承担多少库存暴露。两者回答不同问题,最好同时报告。

即使 $I$ 较小,PnL也未必更好:更激进修复可以缩短库存时间却牺牲价格;F09 reducing-BUY实验就是实际反例。inventory-time是risk mechanism,不是价值函数。

库存生命周期:真正的库存终局通常比 30 秒晚得多

库存生命周期 从净库存离开零开始,到再次回到零结束。一次 库存生命周期 可以包含 opener、多个 exposure-increasing adds、部分 reducing fills、quote pauses、cancel/re-entry 与其它反馈。一个 early fill 的价值会通过整条路径传递。

对第 $c$ 个 库存生命周期,终局变化可写为

并与 maximum adverse excursion、absolute inventory time、repair latency、duration 和 tail indicator 一起报告。若库存生命周期到 replay boundary 仍未 flat,持有时长右删失;未平仓价值仍按冻结 terminal-MTM 规则纳入权益。

动作研究尤其不能把同一个 $Y_c$ 复制给 库存生命周期 内每个 decision。那会把一次终局损失重复计入多行,产生伪精度。正确做法是每个 intervention identity 只拥有一次 库存生命周期-level attribution,或使用明确的 incremental contribution contract。

生存视角:平均 duration 会被长尾支配

令 $T$ 是 lot close 或 库存生命周期 flat time,$C$ 是 replay censor time,观察到的是

生存函数

回答在 $u$ 时刻仍未修复的比例。仅报告 closed rows 的平均 duration 会丢掉所有长寿 censor,并倾向于把修复速度说得过快。仅报告均值又会被极少数长 库存生命周期 拉高,所以 median、P75、P90、Kaplan–Meier median 与固定 horizon survival 应共同出现。

若 fill、cancel ACK、库存生命周期 flat 等结局竞争,还需要 competing-risk 方法,而不是把每个 horizon 当作彼此独立的 binary label。Lifecycle research 的贡献就在于先定义风险集和终局,再谈预测。

Closed-only mean 的方向性偏差

假设十笔lot中九笔1分钟关闭,一笔到一小时窗口末仍未关闭。只看closed rows,mean为1分钟;真实第十笔至少存活60分钟。把boundary当close,mean变为6.9分钟,却又虚构了一笔执行。两种简化分别向快修复和假realization偏。

Kaplan–Meier把第十笔作为right censor:它贡献“至少活到60分钟”的信息,但不声称之后何时关闭。若censor与市场状态相关,例如趋势日更容易在窗口末仍持仓,还应谨慎解释independent censoring;固定窗口设计不能自动消除informative censoring。

固定30秒与随机terminal为何不能直接比较均值

30秒markout对每笔fill使用相同horizon;库存生命周期 terminal时间随path变化。前者接近横截面早期价格反应,后者混合不同持有时长与后续action。把两者做相关并不能证明30秒“解释了多少PnL”,因为terminal duration本身可能由markout与策略共同决定。

更有用的分解是把 $M_{30s}$ 当predefined mechanism slice,再单独报告post-30s continuation:

两项会受数量、费用与inventory定义影响,不能简单把bps markout与USDC terminal相加;但这种结构能显示早期toxicity是否被后续repair抵消。

被撤回的 Retained111 数字该怎样阅读

旧审计的历史表如下,全部只用于说明为何 estimand 不能被压成 30 秒;不得视为当前校准值:

Historical withdrawn item FIFO LIFO
Closed rate 97.3% 97.3%
Closed median 5.8 minutes 2.3 minutes
P90 88.3 minutes 52.1 minutes
KM median 6.3 minutes 2.5 minutes
Alive at 30s 92.1% 79.8%

旧 denominator 还报告 closed 库存生命周期 fill-to-flat median 11.2 分钟、P90 251.4 分钟。它们曾直观展示“30 秒以后仍有大量库存风险”,但后来 mixed-L2、queue identity、trade-side、merged clock 与 cross-day warmup 修复改变了订单和成交路径,因此这些 exact durations 必须重建。

这里有一个重要的证据治理原则:方法语义可以在数据身份失效后保留,数值却不能。FIFO/LIFO、censoring、lot versus 库存生命周期 与 terminal MTM 的区分不依赖某个具体 replay;43,183 fills 或 92.1% survival 则依赖完整 denominator,身份改变后必须撤回。

数据与因果边界

一个可用的 lifecycle panel 至少要绑定:exact order/fill identity、maker side、fill quantity、库存生命周期 identity、execution price、commission unit、因果可见 mid、reducing fills、terminal inventory/mark、replay boundary,以及 queue、L2、trade 与 clock identities。

固定 horizon markout 只能使用目标时刻已经存在的 historical book;不能用未来第一笔 trade 代替 midpoint。若精确目标没有 book observation,应记录 actual observation 和 age,按冻结规则 censor,而不是向未来搜索一条方便的价格。

lot attribution 可以读取后续 reducing fills来构造 outcome,但这些未来字段绝不能进入 $t_f$ 前的预测 feature。库存生命周期 terminal 也只能作为标签。预测 score 与动作触发必须停在 feature-ready cutoff 左侧。

从描述性标签到动作 estimand

观察到 $M_{30s}<0$ 或 $Y_c<0$,不等于已经证明取消 opening order 会改善结果。一个 action 会同时改变 fill probability、queue position、inventory birth、后续 adds、reducing path 与 库存生命周期 terminal。

动作 $a$ 的完整价值应更接近

并使用 paired full-path replay、随机化或其它可识别设计。30 秒 markout 可作为机制分量,却不能独自晋级 keep、cancel、widen、skip 或 re-center。

一个负 markout 对应两个相反动作反事实

BUY fill后30秒mid下跌,$M_{30s}<0$。若candidate在fill前widen,可能完全避开库存,动作有利;也可能只是把fill推迟到更低价格,随后反弹,candidate更有利;还可能错过低位被动成交,稍后以更高价格重新进入,candidate不利。

同一个observed label无法区分这些potential outcomes。需要在同一decision surface上生成baseline/candidate order lifecycle,并让两臂各自承担queue、fill、inventory与terminal。标签研究回答“发生了什么”,动作研究回答“另一种选择会怎样”。

三种时间权重会给出不同的“典型持有期”

按fill等权,每个成交贡献一次;按lot quantity加权,大额fill更重要;按inventory-time抽样,长寿库存生命周期占据更多权重。它们分别回答“随机一笔fill”“随机一BTC lot”“随机一个持仓时刻”的持续时间,不能共用一个平均数。

例如一个1秒小lot与一个1000秒大lot,fill等权中各占50%;在inventory-time风险里后者几乎支配全部暴露。报告应同时给median/quantiles、survival curve与BTC-hours,而不是只给closed lots mean。

库存生命周期 terminal mark 的选择

自然flat是最清楚的terminal;窗口末端仍有inventory时,需要用当时可见mark进行MTM并标right censor,不能虚构taker close。若库存生命周期跨日,daily PnL rollover不能切断经济身份;但按日统计不确定性时又要保留共同shock。

库存生命周期 value可写为

其中$q_{c,T}=0$时退化为closed value。mark source、timestamp与age必须记录,否则terminal difference可能来自不同价格观测而非策略。

Dynamic 库存生命周期 attribution

库存损失不仅取决于最初的成交质量,还取决于后续能否减仓,以及报价控制器是否真正改变了订单。历史机制审计因此分别考察短期不利成交、修复延迟和 floor/cap 等约束的实际作用。它是描述性归因,不是“跳过加仓”的两臂实验。

Dynamic 库存生命周期 中 add toxicity、repair failure 与控制器传导

图 1:一个 add fill 可以先产生短期 adverse markout,再通过更长的库存修复路径进入 库存生命周期 terminal。Regime、P3、cap、cooldown 与 reducing defense 影响报价,却不等于已经构造出“跳过 add”的反事实。

从历史归因到动作价值的证据阶梯

图 2:add/no-add 库存生命周期差异位于portfolio mechanism层。它能定位损失,但只有新的随机或配对action path才能到达uplift层;30秒markout、库存时长或controller状态都不能单独跨级。

研究问题:损失集中在哪里,机制是否真的在动

这项审计问两个描述性问题。第一,terminal loss 更集中在没有 add、发生 add、immediate toxic add、repair failure 还是二者混合的 库存生命周期?第二,配置中宣称的动态控制器在实际路径上是否有足够 variation,还是多数时间被 floor、cap、离散阶梯或其它 overlay 固定住?

对 库存生命周期 $c$,可观察 terminal outcome 为

令 $A_c=1$ 表示该 库存生命周期 至少发生一次 exposure-increasing add,则描述性差异为

$\Delta_{obs}$ 不是动作效应。是否发生 add 由市场路径、已有库存、baseline quote、queue、fill 和控制器共同选择,因此

这条不等式是全文最重要的边界。审计可以定位候选机制,不能替代随机化或 paired full-path replay。

Add/no-add 对比中的选择路径

发生add需要:库存生命周期已存在、baseline permission开放、quote激活、市场触达并完成fill。市场趋势与库存状态同时影响是否add以及terminal outcome。一个简化因果图是:

条件于 $AddFill=1$ 会选择出更容易触达、更长或更困难的库存生命周期。即使add本身没有因果伤害,add group也可能更差;反之,add也可能真增加风险。观察性差异无法区分。

因此100个add 库存生命周期与408个no-add 库存生命周期不是两臂实验。它们最适合回答“哪里集中损失、下一步动作面在哪”,不适合回答“删除100个add会省9.37 USDC”。

48小时窗口为何只能做机制定位

两天容易被单一趋势、周内时段与少数worst 库存生命周期主导。worst 20承担大部分loss本身就说明重尾;按库存生命周期 row做普通区间会低估共同市场冲击。

这个窗口仍有价值,因为它揭示controller是否binding、cooldown staircase与add/repair路径,可用于注册新问题。但稳定side ranking、参数最优值或长期loss share需要更多独立日期和修复后的denominator。

库存生命周期 分类:toxicity 与 repair 是两条不同路径

历史审计预先定义 immediate add toxicity 为 first-add 30s maker-signed markout 不高于 $-0.5$ bps,repair failure 为 first add 到 first reducing fill 超过 300 秒。它们是 diagnostic thresholds,不是 treatment rules。

四类路径分别是:

  • immediate toxicity only:add 后价格很快不利,但首次 reducing fill 未超过 repair 门;
  • repair failure only:短期 markout 未触发 toxicity 门,却长时间没有 reducing fill;
  • mixed:早期 adverse 与长时间 repair delay 同时存在;
  • other add:发生 add,但不属于前三类。

这一区分避免把所有损失都叫作“toxic fill”。早期方向错与库存长时间卡住会产生不同的动作设计:前者可能需要在 add decision 前改变 exposure,后者可能需要改善 reducing permission、quote geometry 或 lifecycle recovery。

冻结历史窗口:add loss 集中,但类别内部并非同号

公开的历史窗口结果为:

Group Closed 库存生命周期 Aggregate terminal PnL Mean PnL Median duration
No add 408 +0.3122 +0.0008 89.8s
At least one add 100 -9.3668 -0.0937 509.4s
Worst 20 20 -8.7043 -0.4352 689.8s

标签 no_add_net_positive 与 add_net_negative 只描述 aggregate sign,不表示每个 member 同号。100 个 add 库存生命周期 的细分为:

Add class 库存生命周期 Aggregate terminal PnL
Immediate toxicity only 43 -4.0939
Repair failure only 11 -1.6059
Mixed 5 -2.0747
Other add 41 -1.5923

immediate-toxicity 与 mixed 虽只占一部分 库存生命周期,却承担较大损失;repair-only 也明显为负。first-add 30s markout 平均约 $-0.82$ bps,说明早期 adverse selection 是机制的一部分,但 other-add 仍为负,说明 30 秒标签没有解释完整 terminal path。

历史窗口中 SHORT add 库存生命周期 的 early markout 与 terminal aggregate 看起来比 LONG 更差,但窗口只有两天。这是 unstable side diagnostic,不能建立 SELL-side action,更不能把短窗口 side ranking 外推为永久市场结构。

Regime 与 P3:缩放真的发生,floor 也确实介入

regime scale 的历史 库存生命周期 mean 约为 1.53x,说明它不是配置中的空变量。P3 pair-spread floor 在 sampled 库存生命周期 中约 28.9% binding,意味着 low-volatility tightening 经常被触达概率约束截断,但也没有永久把报价钉死。

可以把最终 pair spread 抽象为

当 floor binding 时,继续改变 regime 或基础 gamma 未必移动最终报价;只有 $d_{dynamic,t}$ 重新超过 floor,控制器才恢复 action range。研究 controller effect 时必须观察最终 quote geometry,而不是只看内部 parameter changed。

用局部导数理解“参数动了、报价没动”

若最终spread为 $d=\max(d{dynamic}(\theta),d{floor})$,则floor binding时:

即使内部参数 $\theta$、regime scale或kappa持续变化,执行价格对它没有局部敏感度。只有dynamic分支超过floor,导数才恢复。

同理,cap未binding时调高cap也有零action effect;spread cap碰撞时又可能把两个内部报价压成同一最终tick。机制审计必须沿“state → internal quote → floor/cap/rounding → final order”逐层记录,而不是把state variation当treatment strength。

28.9% floor binding 如何阅读

它说明约部分sampled时刻由P3 floor决定下界,不代表另外71.1%都由某一个dynamic参数独占控制;其它floor、tick rounding、inventory skew与safety overlay仍可能参与。比例也来自withdrawn historical denominator,不具当前calibration authority。

因此这项数字的正确用途是历史机制例子:某些内部参数在相当部分路径上无法移动final quote。它不是现在应降低P3 floor的依据,更不是P3 value的因果证据。

Kappa 与 cap:参数在变化,不代表报价受它控制

该实验中,深度缩放后的距离斜率在普通状态下接近 P3 触达概率的距离斜率,仅少量状态出现明显变化;多数库存生命周期的动作变化范围很小。这说明该实验中的深度缩放并未提供足够大的独立动作变化,不表示触达斜率已经成为成交强度估计。

dynamic cap 的 level 确实变化,历史窗口 mean 约 24.52 bps;但 sampled cap-hit rate 为 0%。因此 cap 是 safety ceiling,而不是当时损失路径中的 active treatment。调一个从未 binding 的 cap,不会自动改变 fill 或 库存生命周期。

这个例子揭示了 mechanism attribution 的必要性:配置文件里有参数,不等于数据里存在 treatment strength。研究动作前必须先证明 candidate 会改变最终 quote、fill 或 lifecycle,而不是只改变一个中间变量。

Cooldown:所谓 dynamic 可能只是离散 staircase

历史 sampled 库存生命周期 的 maximum cooldown 呈现清楚的 85 秒整数倍:85s 有 3 个、170s 有 61 个、255s 有 30 个、340s 有 8 个、425s 有 2 个。它是状态触发的 staircase,不是连续平滑控制器。

离散阶梯会产生两个后果。第一,两个略有不同的 states 可能落到同一 cooldown bucket,动作实际上相同。第二,跨过一个台阶会一次改变 85 秒 permission,远比 score 的微小变化更强。任何 cooldown action study 都必须冻结具体 transition,而不能把 score slope 当作 treatment size。

阶梯动作的边际效应集中在边界

如果连续score只在跨过阈值时把cooldown从85变170秒,那么绝大多数score小变化没有action difference,少数边界变化却一次改变85秒。模型若回归score与PnL,估计的是状态关联,不是这条离散jump的效果。

真正action estimand应比较同一个boundary opportunity上是否跨级,并追踪后续permission与库存生命周期。后来的state/recovery/variance-time项目正把不同release规则独立注册;它们不能由本篇staircase统计直接授权。

Reducing-side defense:想修复库存,先确认机制有 support

减少风险的 reducing quote 也会受到 common overlays、distance 与 pause 影响。历史审计中实际 defense pause 很稀少,inventory emergency quantity threshold 没有在冻结窗口触发;loss-based emergency 与 quantity emergency 又是两条不同机制,不能混成一个“防御开关”。

研究曾为 reducing repair release 预注册每侧最低 库存生命周期、active-day、strict-through interval 与 affected-negative-add rate。支持门未同时满足,因此该动作在读 action economics 前就关闭。touch 或 strict trade-through 也不能当作真实 queue fill counterfactual;一个更激进 reducing quote 是否成交仍需要 queue、latency 和 exact execution path。

后续应该转向 first baseline-eligible exposure-increasing add opportunity,因为这个决策点在 add fill 发生前、具有明确 baseline action,也更接近可识别的预防动作。

数据、时钟与撤回边界

historical live aggregate 描述当时实际系统发生过的 closed 库存生命周期;旧 Development replay 则依赖当时的 top-20 queue、q0.70 calibration、book/model identity。二者来源、transport 与 treatment 都不同,不能把 live association 与 replay counterfactual 拼成一个 causal estimate。

后来 normalized 100ms L2、trade-side、calendar、merged clock 与 queue identity 修复改变了 replay denominator。于是旧 Development add-toxicity、repair-delay、distance、cap-hit、库存生命周期 和 PnL exact values 被撤回。本文不复活这些数字,只保留公开状态仍允许的历史 actual-库存生命周期 aggregate 和 mechanism semantics。

features 必须在 quote decision 前 ready;first-add markout 与 库存生命周期 terminal 只能作 outcome。一个 fill 后才知道的 toxicity class 不能用来决定该 fill 前的动作。

从机制审计到 action research

一个可识别的下一步动作需要在 库存生命周期 第一个 baseline-eligible add decision 上冻结:

  • $A0$:执行 baseline add quote cycle;
  • $A1$:只跳过一个 add quote cycle;
  • BUY 与 SELL 分开;
  • 每个 库存生命周期 至多一次 50/50 assignment;
  • reducing quote、size、inventory limit 与 taker behavior 不变;
  • replay 完整 queue、latency、fill 与后续 库存生命周期 path。

reward 应从 decision 到 terminal,报告 库存生命周期 cost、repair time、tail 与 activity。这个动作后来属于 F09 action-uplift 研究,而不是本篇 descriptive audit 的结果。

后续action结果如何反过来校正机制直觉

one-cycle skip证明单次quote对fill路径杠杆太低;until-flat证明持久阻断能降风险却近似关掉参与;recovery-event在支持充分时伤害SELL价值;price penalty与aggressive repair分别改善库存proxy和修复速度,却没有terminal uplift。

这些结果不抹掉add/repair机制定位,而是说明从“损失集中”到“可控且有价值”之间有很长的识别链。机制文章应把后续阴性结果链接进叙述,而不能永远停在“下一步可能有效”的悬念。

描述性差异的 DAG 为什么不能省略

令$S$为市场/库存状态,$A$为是否发生add,$F$为后续fills,$Y$为terminal value。原策略根据$S$选择$A$,而$S$也直接影响$Y$:

观察到$E[Y\mid A=1]<E[Y\mid A=0]$同时包含动作效应与state selection。进一步按已fill、已closed或某个post-action 库存生命周期 type分层,还可能打开collider路径。机制审计可以定位损失集中在哪,却不能把条件均值直接翻译为skip uplift。

Binding rate 是 control authority 的局部地图

当P3 floor在28.9% decisions绑定时,某些上游参数变化不会传到最终quote;在未绑定区间,局部导数才非零。总体parameter movement与final action movement之间需要一张transmission table:input changed、raw quote changed、floor/cap bound、tick-rounded quote changed、order replaced、fill path changed。

这张表能解释为何动态$\kappa$或cap看起来波动很大,实际订单却很少不同。反过来,若final quote频繁不同但value不变,问题位于市场分离或fill/path层。mechanism attribution的价值就是指出控制链在哪一层失去authority。

First-add terminal loss

为了把损失定位到决策时刻,first-add 分析从每个库存生命周期中选取第一条后来确实产生加仓成交的订单决策,追踪决策、订单、成交和终局的完整身份链。与上一节的加仓/非加仓分组相比,它明确了收益归因的起点,但仍以基线后来成交为条件。

First-add decision 到 order、fill 与 库存生命周期 terminal 的精确身份链

图 1:特征在 decision cutoff 左侧冻结;order activation、add fill、库存路径和 terminal equity 位于右侧,只用于定义 eligibility 与 outcome。每个 库存生命周期 最多贡献一行。

First-add loss 在归因与动作阶梯中的位置

图 2:decision-to-terminal比30秒markout更完整,但仍是baseline-filled observational attribution。它先建立loss denominator;predictability与skip/widen action uplift还需后续独立证据。

为什么从 realized fill 倒推 decision 会出错

如果只在 fill tape 上找到第一笔 add,再向附近搜索最近 quote decision,很容易出现 nearest-time misjoin:同一时刻可能有 BUY/SELL、opener/add/reducing 多个 decision,order 还可能经历 replace、cancel、partial fill。错误 join 会把一个 库存生命周期 的 terminal loss贴到另一个 order state 上。

旧 exploratory subset 曾只能匹配一小部分 rows。正式 producer 禁止修补那个 subset,要求 exact native identity:

每个 eligible 库存生命周期 只取第一条完整链,不能因为后续还有更多 adds 就复制 terminal outcome。producer 必须输出 100% eligible rows;open records、identity breaks、native sequence failures 或 q90 parity failures均显式失败。

Nearest-time join 会制造怎样的假特征

假设同一毫秒策略同时更新BUY add与SELL reducing,随后只有BUY order在几毫秒后成交。若fill按最近timestamp连接,tie-break可能贴到SELL decision;模型看到的side、queue、role与inventory effect全部错位,但库存生命周期 terminal仍来自BUY路径。

更隐蔽的是replace:fill order id可能对应三次更早decision中的最后一次activation,而不是最接近fill的quote callback。exact chain要求每个transition有明确parent,不允许用时间距离猜测。

错误率即使很低,也可能集中在高频/高波动时段,恰好是loss较大的rows。仅检查总体match rate不能保证无偏;必须逐链验证role、side、quantity与库存生命周期 ownership。

每库存生命周期一行如何防止伪精度

一个长库存生命周期可能有十次adds,terminal loss只有一次。若把相同 $Y_c$ 复制十行,长且差的库存生命周期自动获得十倍权重,标准误又把十行当近似独立。first-add identity把每个库存生命周期最多保留一次,使cluster unit与经济终局更一致。

这并不表示后续adds无关;它们仍作为first-add之后的路径进入 $Y_i$。研究只是把预测/归因起点固定在第一次add decision,避免重复claim同一terminal。

Observational estimand:从 decision 前权益到 库存生命周期 terminal

对第 $i$ 个 first-add decision,主目标为

$V(t{decision}^{-})$ 是动作形成之前的策略权益,$V(T{库存生命周期})$ 是同一 库存生命周期 按冻结终局规则结束时的权益。这个 target 将 add fill 后的后续 adds、reducing fills、inventory duration、fees 与 terminal mark 全部保留在路径里,比 30 秒 markout 更接近风险问题。

但它仍是 prognostic attribution。面板只包含“baseline decision 后来确实生成 add fill”的 rows,因此

不等于

动作会改变 $F_i$ 本身,不能在 baseline-filled denominator 上直接估计 skip uplift。

面板:Grade A 是 primary,Grade B 只能 sensitivity

研究预注册 24 个 Grade-A primary Development 日和 16 个 Grade-B gap-censored sensitivity 日。两个 panel 不能 pooled 后声称获得更窄 primary interval,也不能借用已有 Validation 或 holdout 日期补数量。

最终 40/40 日完成,exact join 2,071 行:

Panel BUY rows SELL rows Role
Grade A 596 658 primary gate
Grade B 459 358 preregistered sensitivity

queue ahead 对 2,070 行可观察。唯一例外是一条 Grade-B BUY quote,距离 mid 896.5 ticks,其 queue identity 明确标为 unknown,没有按 zero impute。这个细节体现了 support contract:outside observed range 与 known-empty queue 完全不同。

feature-clock violation、open record、native sequence failure 与 q90 parity failure 都为零,因此阴性或负值结果不是来自明显的 join/clock 缺口。

时钟与因果边界

决策特征必须满足

individual trades 可以用于 exchange-time fill reconciliation,却不能伪装成 decision-visible taker flow。可交易的 flow feature 必须服从其 parent aggregate message 的 receive/feature-ready clock;child trade exchange timestamp 只属于 outcome/matching truth。

库存生命周期 terminal、first reducing fill、repair duration、future markout 与 terminal inventory 都在 decision 以后,只能用于 target 或 mechanism audit。producer 的职责是保留未来身份,不是把未来状态回填进 feature row。

100ms book resolution也不能被误解成 100ms action horizon。decision-to-terminal value 的终点由 库存生命周期 lifecycle 决定,可能远晚于 first-add fill。

主结果:两侧 primary mean 都稳定低于零

Panel Side Rows Mean USDC Day-clustered 95% interval
Grade A primary BUY 596 -0.04272 [-0.05342, -0.03175]
Grade A primary SELL 658 -0.05564 [-0.07047, -0.04066]
Grade B sensitivity BUY 459 -0.04664 [-0.06819, -0.02621]
Grade B sensitivity SELL 358 -0.03181 [-0.05136, -0.01178]

四个 interval 全部低于零,说明 negative mean 不是只由一个 side、一个 panel 或少数日期符号造成。Grade B 不能晋级 primary,却为“first-add denominator 平均负”提供方向性 replication。

这个结果比旧 add/no-add aggregate 更精确:它把起点放在 first-add decision 前,避免把 库存生命周期 birth 到该 decision 之前的权益变化算进 add attribution;同时仍保留 decision 之后完整 terminal path。

用规模感理解均值,但不能倒推被删除收益

Grade-A BUY/SELL均值约 -0.043/-0.056 USDC,说明在该baseline-filled分母里,每个first-add decision后的完整路径平均为负。将均值乘rows可得到该面板的描述性总量级,却不能说skip所有first adds会省下相同总额。

因为skip改变哪些库存生命周期继续、是否fill与terminal,candidate outcomes不是 $-Y_i$。甚至control下一笔add为负时,skip也可能让原有inventory更难repair。均值的用途是证明研究问题有经济尺度,不是直接构造action PnL。

日期聚类区间为什么比逐row t检验更可信

同日first-adds共享趋势、波动与策略初态。若某个单边日产生几十个负rows,逐row检验会把同一market shock重复计为独立证据。day bootstrap保留整日rows一起重采样,问“换一组日期,mean是否仍负”。

四个Grade/side区间全低于零,建立了稳定descriptive mean;它仍不修复filled-only selection,也不建立局部selector。这说明统计精度与因果问题是正交的:一个估计可以非常精确地回答观察性问题。

为什么稳定负 mean 仍然不能形成 selector

研究预先审计若干 decision-visible mechanism contrasts。Grade-A BUY 中,较高 queue ahead 与更差 value 相关,较高 refill/cancel ratio 与较不负 value 相关;这些方向没有在 Grade B 复制。其它 contrasts 要么 support 不足,要么日期聚类区间跨零。

若一个状态 $g(x_i)$ 真能定位可避免的坏 adds,需要同时满足:

且差异在 future chronological folds、side-specific support 与 clustered uncertainty 下稳定。全体平均为负不会自动保证某个 feature ranking 有这种 selectivity。

因此 F10 只把证据送入 F05 predictive identity:库存生命周期-state baseline 与 local microstructure model 做 chronological OOF 比较。后续 F05 的结果是局部增量没有稳定成立;两篇属于不同问题,不能因为 target 相同就把 provenance 混在一起。

Mean、selector 与 action 是三道门

第一道门检验 $\mathbb E[Y]<0$;第二道检验decision-visible $g(X)$是否挑出更负subgroup并超过库存生命周期-state baseline;第三道检验对该subgroup执行action的 $\mathbb E[Y(a)-Y(a_0)]>0$。逻辑关系不是蕴含链:

F10通过第一道,F05冻结local features未通过第二道,因而没有理由打开第三道。把三篇结果合并成“我们知道坏fill并能避开”会正好抹掉研究最重要的阴性边界。

Queue-ahead方向未复制说明了什么

Grade A中queue ahead与更差value相关,Grade B未复制。可能是source coverage、market regime、极端queue rows或真实effect漂移。结果不足以选择某个解释,更不足以定threshold。

如果根据Grade A定义high-queue skip,再用Grade B当确认,本来需要在看Grade B前预注册;这里mechanism contrasts属于同一diagnostic审计,不能事后升格。F05 chronological OOF正用更严格方式检查增量,结果仍阴性。

为什么“直接跳过所有 first add”也不成立

看到 BUY $-0.04272$、SELL $-0.05564$,最直觉的动作是禁止所有 first adds。但这是一个强 库存生命周期 policy,不是这项 diagnostic 的小修正。

全禁 first add 会改变 fill activity、库存上限利用、spread capture、库存生命周期 birth/death 与后续 reducing opportunity。它可能少亏,也可能通过丢失 favorable fills、延长已有库存或改变 side balance 产生新的成本。必须用明确 assignment 与完整 paired path评估:

First-add diagnostic 没有 behavior propensity,也没有 replay candidate arm,因此 $\Delta_{action}$ 未识别。

全禁动作还会改变库存生命周期定义本身

first-add有时使inventory从一层变两层;删除它后库存生命周期可能更早flat,也可能持续原库存更久。后续哪些fills叫add/reducing、何时birth/terminal都会变化。不能在candidate路径上沿用control 库存生命周期 id与flat time。

一个合格full-path实验应在untreated first-add opportunity随机化,给candidate独立order/inventory_lifecycle state,并从assignment前equity计到各自terminal。activity、fills、inventory-time与tail同时报告,防止动作退化为停止参与。

为什么 first-add 是好决策面,却未必是好action lever

它发生在进一步增加暴露之前、每库存生命周期最多一次,因果起点清楚,适合预测与随机化。但一笔quote是否最终fill仍受queue与未来flow影响;one-cycle skip后来显示这种短动作常有低fill leverage。

“决策面清楚”解决身份问题,不保证treatment strength。任何successor都应先在outcome-blind mechanics中报告从decision change到fill/path change的漏斗,再决定是否打开economics。

这些历史 Development 结果建立了 first-add 的负平均后续价值,没有得到稳定的局部选择器,也没有执行 skip/widen/cancel 的动作比较。Validation 与封存测试集未读。下一节检验局部特征能否超过仅使用库存生命周期状态的预测基线。

Observational mean 的可识别边界

first-add decision后的平均terminal loss回答“当前策略在这些已发生机会上的结果怎样”。它不等于do(skip)反事实,因为是否first-add由库存、市场与旧policy共同选择。形式上

即使对$X$建模,也需要positivity:相似状态下add与skip都要有支持。历史策略若几乎总add,skip outcome只能靠强模型外推;最安全方式是随机化或paired replay。

每 库存生命周期 一行牺牲了什么,又保护了什么

只取first-add row会丢掉库存生命周期内部许多时序细节,但避免把同一terminal value复制到几十个decision/fill rows造成伪精度。后续fills与状态仍可作为mediator diagnostics,在库存生命周期内汇总;它们不能被当作独立outcomes。

日期cluster再处理同日多个库存生命周期的共同shock。有效统计单位因此远少于原始ticks或fills,这会让interval变宽,却更接近真正可迁移的不确定性。稳定负mean仍有描述价值;局部selector未通过说明现有features没有把负值进一步分成可执行、跨日稳定的action region。

Decision-visible fill value

平均后续价值为负,不代表决策时能挑出其中最差的机会。预测实验将只使用库存生命周期状态的 M0,与加入局部盘口信息的 M1 比较;first-add 与 first-opener 是分开定义、训练和评价的两个角色。

决策时可见状态与 库存生命周期-terminal 目标的因果边界

图 1:模型只能读取决策线左侧已经 feature-ready 的状态;右侧成交、库存路径与 库存生命周期 terminal 只用于构造标签。观察到负标签不等于已经识别出一个可执行动作。

为什么“平均坏”与“能避开坏”是两回事

设第 $i$ 个决策发生在 $t_i$,当时的策略权益为 $E_i^{decision}$,同一 库存生命周期 最终终止或按冻结规则记账时的权益为 $E_i^{terminal}$。主目标是直接的 USDC 值:

如果 $\mathbb E[Y_i] < 0$,只能说明这类成交在该 Development 分母里平均较差。要把它变成选择器,还需要一个只使用 $t_i$ 前信息的函数 $f(x_i)$,并证明它挑出的高风险集合真的比其余集合更差,而且这种差异在日期聚类的不确定性下仍然存在。

研究因此比较两个模型:

真正的增量问题不是 $M1$ 能否在样本内给出漂亮排序,而是:

是否能在严格向前的 chronological OOF 中获得正的同时置信下界。高风险阈值也只能由每个 outer-train 的过去预测分布产生,不能看见 outer-test 的实际价值后再移动。

这套设计刻意不把 maker-signed 30 秒 markout 当成 USDC 动作价值。markout 可以描述成交后的局部价格方向,但它没有自动包含成交数量、费用、后续库存、减仓、库存生命周期 持续时间与终局记账。

两种决策角色与各自特征

首次开仓建立新的库存生命周期,首次加仓则在已有风险暴露上继续增加数量。两者面对的状态和后续减仓机会不同,不能混用训练分母。

First-add:已经有暴露以后,第一次继续增加库存

first-add 分支以每个 库存生命周期 的首个实际 exposure-increasing ADD 成交生成决策为单位。opener 与 reducing 行被排除;BUY 和 SELL 独立训练与报告。

它的 库存生命周期-state baseline 使用:

  • 决策前库存;
  • 库存生命周期 age;
  • 库存生命周期 已实现或记账价值;
  • 库存生命周期 MAE;
  • 已发生的 exposure-increasing fill 数;
  • 已发生的 reducing fill 数。

增量局部特征包括:

  • 报价到参考价的 tick 距离;
  • 可用时的 exact queue ahead,以及 queue 是否可用的显式指示;
  • 盘口数量加权中价偏移;
  • L2 refresh 与 cancel ratio;
  • local toxicity;
  • policy-visible parent aggTrade flow imbalance。

队列缺失不能被解释为“观测到零队列”。模型矩阵可以使用确定性占位值,但必须同时携带 unavailable 指示;否则结构性缺失会伪装成有利的空队列状态。

First-opener:从空仓进入一段新 库存生命周期 的第一次成交

first-opener 分支观察 exact native lifecycle 中的第一笔 opener fill。SELL 是冻结的主侧,BUY 只作描述性运输检查。

其目标仍然是:

但它是一个 fill-conditioned observational estimand:

它回答“已经成交的 opener 后来价值如何”,不回答:

后一个式子才是取消、延迟或放宽 opener 的动作效应,需要新的成对或随机 action identity。

数据、时钟与因果边界

两条分支都使用 exact lifecycle,而不是靠最近时间戳拼接订单与 库存生命周期。其公共证据边界包括:

  1. 决策特征必须在 decision 或 submit clock 前完成:$\text{feature-ready timestamp}\le t_i$。
  2. native 100ms L2 目标日要求完整的 previous-natural-day warmup;缺失 warmup 的目标日不能用更早日期悄悄补种。
  3. terminal target 来自同一订单与 库存生命周期 身份,不允许 nearest-time join,也不允许用 fallback mid 填补缺失的终局权益。
  4. Grade A 是主 Development 证据,Grade B 只作预注册 sensitivity;两者不能池化成更漂亮的样本量。
  5. 每个 outer fold 只用更早日期拟合、标准化、确定高风险分位数;test 日不反向参与阈值选择。
  6. Validation 与 family-specific sealed holdout 保持未读。

first-add 的冻结面板来自 24 个 Grade-A 与 16 个 Grade-B Development 日;正式 chronological OOF 覆盖 13 个 Grade-A 测试日和 6 个 Grade-B sensitivity 日。first-opener 的 native producer 完成 22 个 Grade-A 与 11 个 Grade-B Development 日,正式评估同样使用 13 个 Grade-A OOF 日与 6 个 Grade-B transport 日。

这些日期是历史 Development 证据,不是 prospective live confirmation。100ms 是盘口源分辨率,也不是动作持有时长。

研究链:先证明标签,再证明增量选择能力

完整链路是:

exact order/inventory_lifecycle identity → decision-time causal feature snapshot → direct decision-to-terminal USDC label → past-only 库存生命周期-state M0 → 库存生命周期 + local-microstructure M1 → chronological OOF loss and high-risk group → day/inventory_lifecycle clustered simultaneous intervals → prediction gate,而不是 action gate。

这个顺序很重要。如果连 direct terminal label 都不能精确绑定,后面的模型再复杂也只是拟合错位标签。如果局部模型没有超过 库存生命周期-state baseline,就不能因为某些成交平均为负而跳过预测证据,直接注册“阻止这些成交”的动作。

从负价值标签到动作价值的证据阶梯

图 2:一笔成交的 realized label、决策前可预测性、某张报价的条件价值与改变报价的动作 uplift 是四个不同命题。前一层可以为真而后一层失败;越过任何一层,都会把观察性相关误写成可执行因果结论。

四个容易混在一起的 estimand

把四层分别写成式子,会比“预测坏成交”这句口号清楚得多。第一层是成交后才能完整观察的 realized label:

第二层是在 baseline policy 下、并且条件于这笔订单最终成交后的预测问题:

第三层是某个报价动作 $a$ 本身的条件价值:

第四层才是动作研究真正关心的 uplift:

$m(x)$ 的分母已经经过 $F=1$ 选择,而 $Q$ 与 $\tau$ 必须同时容纳“不成交、成交变晚、成交量改变、库存路径改变”这些结果。即使 $m(x)$ 准确地指出某类已成交订单平均亏损,也完全可能出现 $\tau(x,\text{cancel})<0$:取消它以后,策略也许丢掉了更便宜的减仓机会,或者稍后在更差价格重新进入。

这也是为什么本文不把 AUC、rank correlation 或 high-risk bucket 的均值直接称为“可省下的 PnL”。它们最多回答第二层;动作权限至少要穿过第四层。

一条完整的合成路径:同一个坏标签可以对应相反动作价值

考虑一个纯示意的 BUY first-add 决策。决策前策略已经持有 $0.001$ BTC 多仓,当前 BUY add 报价为 100.00,SELL reducing 报价为 100.04。随后 BUY add 在 100.00 成交,十秒后中价跌到 99.96,30 秒 maker-signed markout 为负;库存生命周期 最终在 100.02 附近减仓,计入费用后该次 decision-to-terminal 标签为 $-0.01$ USDC。

从 realized label 看,它当然是一笔“坏成交”。但若反事实动作是取消这张 BUY add,未来可能至少有两条路径:

路径 baseline candidate:取消 BUY add 动作差值
A:价格继续下跌 100.00 成交后承担下跌 没有新增库存 candidate 较好
B:价格短跌后急升 100.00 成交并在 100.04 减仓 稍后在 100.03 追入或完全错过修复 candidate 较差

历史只实现其中一条。仅凭 baseline 下观察到的 $Y_i^{fill}<0$,无法同时知道取消后的路径。模型若只学习“跌前的盘口长什么样”,仍然没有识别取消会怎样改变后续订单、队列和库存。

再看 first-opener。空仓时一个 SELL opener 成交后市场上涨,标签为负;抑制 opener 看似自然。然而 opener 也创建了后续 reducing BUY 的角色与 permission。删除 opener 不只是删除一笔坏 SELL fill,它会删除整个 库存生命周期,连同后面所有可能的修复 fill。动作对比必须重放这棵路径树,而不是从历史 PnL 里减掉 opener 那一行。

为什么 库存生命周期-state baseline 是一道必要的科学门

库存方向、库存生命周期 age、此前 add/reducing 次数和已有 MAE,本身就能解释大量 terminal value 差异。一个已经持续很久、库存很深、历史 MAE 很大的 库存生命周期,其下一笔 add 更容易落入负终局,并不需要盘口特征提供任何新信息。

因此 $M0$ 不是“故意做弱的 baseline”,而是对已有风险状态的最小调整。局部盘口模型只有在同样 inventory burden 下仍能区分价值,才可能回答“现在这张订单是否格外危险”。如果直接拿 $M1$ 与常数均值比较,模型很可能只是重新发现:库存越深,终局越差。

用残差语言表达,真正需要预测的是:

其中 $C_i$ 是 库存生命周期 state。局部状态 $Z_i$ 必须对 $R_i$ 提供稳定的未来日期解释力。F05 的结果说明,冻结 $Z_i$ 没有做到这一点;这比“模型总体 MSE 不错”更接近动作研究所需的问题。

日期聚类为什么会推翻逐成交显著性

同一天的许多 first-add 并不独立。它们共享波动 regime、行情趋势、撮合负载、库存初态和同一套策略参数。一场单边行情可能同时制造几十个负标签。如果把每笔 fill 当独立样本,标准误大约按 $1/\sqrt n$ 缩小,却没有承认真正的独立冲击单位更接近“日”。

因此本文中的区间以日期或 库存生命周期 cluster 为基本重采样单位,并对两侧、多个指标和高风险选择同时修正。这个设计牺牲了表面上的显著性,却避免把“一天里重复发生的同一个市场故事”冒充成几十次独立确认。

什么结果才会推翻这次阴性结论

重开研究不能只换树模型或移动分位数。至少应出现一种新的、事先可陈述的识别增量:例如 exact queue-ahead 的更高覆盖、可因果对齐的跨 venue 冲击、订单角色更细的状态转移,或直接成对生成 suppress/keep 两条完整 replay 路径。

一个合格 successor 应在结果未读前冻结:决策单位、可见特征、M0、候选动作、终局、日期切分、最小支持与同时区间。然后它需要同时证明三件事:局部信息超过 库存生命周期 baseline;选择集合在未来日期仍有方向;动作 replay 的 $\tau$ 而不是 realized label 获得正经济下界。只满足第一件,仍然只是预测研究。

First-add 结果:负平均值存在,局部增量不存在

Grade-A 主 OOF 包含 327 个 BUY 与 346 个 SELL 库存生命周期;Grade-B sensitivity 包含 172 个 BUY 与 154 个 SELL 库存生命周期。

Side MSE improvement,M0 minus local 预测高风险组平均 USDC familywise interval 支持
BUY -0.70865 -0.04115 [-0.11369, 0.03795] 否
SELL -0.000986 -0.05798 [-0.14776, 0.01086] 否

两侧预测高风险组的点估计都为负,但同时区间跨过零。更关键的是,局部模型没有以正下界改进 库存生命周期-state baseline;BUY 的冻结损失比较甚至明显更差。

因此,这个分支支持“first-add 平均存在负 downstream value”,但不支持“这些局部字段能可靠定位可避免的负价值子集”。

First-opener 结果:SELL 平均负值明确,选择器方向却没有成立

corrected Grade-A native OOF 的核心结果是:

Panel Side OOF rows 平均 terminal value,USDC simultaneous interval local MSE improvement 支持
Grade A SELL 2,330 -0.007151 [-0.014335, -0.000496] -0.0000782 否
Grade B SELL 1,254 -0.008095 [-0.020291, -0.000857] -0.0001753 否
Grade A BUY 2,228 -0.011994 [-0.018521, -0.004809] +0.0000008 否
Grade B BUY 1,287 -0.007831 [-0.018774, +0.000719] -0.0000264 否

Grade-A SELL 的平均值区间完全低于零,因此“已成交 first-opener 平均有负后续价值”得到支持。然而冻结模型挑出的 SELL 高风险组,平均值为 $-0.002960$ USDC,区间仍跨零;selected-minus-complement 的点估计还是正的,意味着被称为“高风险”的组在点估计上反而没有更差。

这不是调一个 threshold 就能修复的问题。模型没有建立出稳定的 conditional selection,继续换高风险分位数、目标时长或模型容量,会是在已经读过的 Development 上追逐噪声。

局部模型没有稳定超过库存状态基线,也未可靠选出更差子集。这限定的是历史特征、模型和角色组合,不是“盘口没有信息”的普遍结论。两个预测实验都止于 Development,Validation 与封存测试未读;它们没有提供取消、放宽或抑制订单的收益估计。

Filled-only prediction 的选择方程

令$F=1$表示订单最终成交,$Y$表示成交后的terminal value。只在fills上拟合得到的是

而动作需要比较

$F$同时受quote distance、queue、market path与原策略影响,是动作后的变量。一个feature可以很好地排序已成交样本中的$Y$,却无法告诉我们取消后哪个fill消失、哪个库存生命周期改道,也无法给未成交路径赋值。若候选动作改变$F$,训练和部署面对的条件总体已经不同。

这也解释“负平均fill value”为什么不直接支持skip。删掉一次负fill可能避免adverse selection,也可能留下更久的库存、错过repair或让下一张单失去queue。动作收益包含被删fill之外的完整路径差:

不能用$-Y\mid F=1$替代。

预测如何进入实际报价动作

预测到动作还隔着一条执行链。下面先介绍新 Tardis 的风险加宽实验,再分析另一个独立的历史实验:只解除一次既有 BUY soft-widen。前者增加报价距离,后者把已放宽的报价向内收回,不能把两者视为同一处理。

新 Tardis:风险预测怎样进入加宽动作

新 Tardis 实验拟合了真实双侧十头模型,并用固定的 F05RiskWidenPolicy 将预测风险映射为报价加宽。模型经过独立重载,动作消费者在一个完整开发账户上与匹配参照比较,净结果更差。这是一个明确的风险分数到报价动作的负结果,不是直接净动作价值模型的评价,也不足以概括整个 F05。

其中,订单生命周期成交概率、成交条件 markout(bps)、成交条件不利概率和成交且不利的联合概率是不同量。机会级预期 maker markout 仍是价格变化的期望,不是完整账户的 USDC 净 PnL;后者还受数量、费用、资金费和库存路径影响。实验保持已确定的风险阈值与加宽规则,而不是在账户结果之后再寻找更好的阈值。方法及公开状态见新 Tardis F05 主报告。

历史 BUY soft-widen:解除一次放宽

历史 soft-widen 在特定 BUY 风险状态下将报价外移。对应的动作实验不是重新训练这个风险分类器,而是在预先抽中的决策点将一次报价的 multiplier 上限设为 1.0,随后恢复原规则,比较直到自然日终 MTM 的完整路径。

BUY soft-widen 单次解除的 K 线与报价双路径

图 1:candidate 只在冻结决策点把 BUY quote 从 widened level 拉回 multiplier 1.0;下一个普通 quote decision 立刻回归相同 baseline。未来完整路径可能相同,也可能因为一次 fill 差异发生分叉。

为什么旧的 filled-only 模型不能决定动作

设 $F=1$ 表示 baseline BUY order 最终成交。旧问题近似为:

这可以训练一个 fill-quality ranking,但它把分母限制在 baseline 已经成交的样本中。若 candidate 把报价向内移动,它不仅可能改变成交后的 value,还会改变:

  • 是否 activation;
  • 何时进入 queue;
  • 是否 fill、partial fill 或 cancel;
  • 后续 inventory 与 cooldown;
  • 库存生命周期 是否提前出现或延后结束;
  • 当日终点的 remaining inventory 与 MTM。

因此动作所需的目标是:

其中 $T$ 是冻结的自然日终 MTM 记账点。两个 forks 在 $t$ 前路径完全相同,只有该次 BUY quote decision 不同;动作以后都回到 $\pi_0$。

这个差分自动消去 pre-assignment PnL:

剩余 delta 来自该次 quote 改动引起的 activation、queue、fill、inventory 和后续顺序路径差异,而不是重复计算历史收益。

动作合同:只改一次,只改 BUY,只改 exposure-increasing quote

冻结 candidate 可以写成:

只有在 baseline 已存在 $m_{BUY}>1.0$ 的 soft-widen 时,动作才有资格进入 opportunity census。

动作边界如下:

  • side 固定为 BUY;
  • SELL quote 不直接改变;
  • reducing quote 不改变;
  • opener 与 add 分开拟合、分开过门;
  • assignment unit 是一个预冻结 canonical 10s quote decision;
  • action duration 只有一个 quote decision;
  • 下一次决策起恢复当前 baseline;
  • order size、inventory limit 与其它安全边界不改变;
  • queue、fill、inventory、cooldown、库存生命周期 和日终路径都在两个 forks 中重新生成。

“单次”很关键。若 candidate 在后续每个决策持续解除 soft-widen,它会成为 repeated policy,改变 action rate、库存生命周期 birth/death 与库存分布,不能继承 one-shot 结果。

数据、抽样与 chronological OOF

Development panel 含 40 个冻结历史日。outcome-blind census 找到 142,891 个 baseline-eligible、exposure-increasing BUY decisions,且这些决策已有 multiplier $>1.0$。

为了在全路径 forks 的计算预算内保持日期与 role 覆盖,研究在结果未读前按稳定 hash 每日每 role 抽 12 个机会:

Role 每日样本 总 forks
opener 12 480
add 12 480
合计 24 960

稳定 hash 只使用日期、decision timestamp、side 与 role,不能看未来 value。

直接价值模型是固定 Ridge,$\alpha=10$,不做 hyperparameter search。它读取冻结的 causal features,包括 toxicity、direction/return/volatility heads、inventory units、baseline quote distance、已有 spread multiplier、BBO spread、盘口数量加权中价、L2 imbalance/refresh/cancel、短期价格变化、taker imbalance 与 VPIN。

chronological OOF 使用 16 个初始 train 日,随后四个各 6 日的未来 test block。每一折只用过去拟合 scaler 与 Ridge。候选阈值冻结为:

不允许看见 test delta 后再调整阈值、role pool 或 feature set。

时钟与因果边界

研究把四种时间分开:

  1. Decision clock:canonical 10s opportunity 的 quote decision timestamp。
  2. Feature-ready clock:所有模型输入完成可见的时间,必须不晚于 decision。
  3. Exchange lifecycle clock:activation、GTX、fill、cancel request 与 ACK 的发生顺序。
  4. Economic ownership clock:从 target decision 开始,到自然日终 MTM 结束。

十秒不是预测未来十秒的固定 horizon,也不是 candidate 强制存活十秒。它只是选择一个可重复的 quote-decision cadence。订单生命周期可以短于或长于十秒,终局 delta 仍由完整当日路径决定。

两 arms 必须使用相同市场路径、初始状态与随机机制;candidate 只能改变目标 quote。若 replay 因 action 分叉产生不同后续 fills 与 inventory,这是 estimand 的一部分,不是需要“修正掉”的噪声。

从 fill-quality 线索到单次动作价值

图 2:旧模型停在“已成交样本后来好不好”;本研究把问题推进到“同一决策若释放一次 soft-widen,完整路径相对 baseline 改变多少”。机械动作、路径分叉与经济增益必须分别过门。

One-shot intervention 的递归定义

把策略状态记为 $St$,市场事件为 $M{t:t+1}$,基线策略为 $\pi_0$。两条 replay 在目标决策前共享同一历史:

baseline 执行 $a_t^{(0)}=\pi_0(S_t)$;candidate 只在这一点执行 $a_t^{(1)}=\phi(a_t^{(0)})$,其中 $\phi$ 把 BUY soft-widen multiplier 截到 1.0。之后两者都恢复同一个策略函数:

注意“恢复同一函数”不等于“恢复同一动作”。如果目标报价制造了不同 fill,$S{t+1}^{(1)}\ne S{t+1}^{(0)}$,同一个 $\pi_0$ 也会输出不同后续订单。正是这条状态递归,使 full-path delta 同时包含直接成交价、未来库存角色和 库存生命周期 终点。

一条从 K 线到终局的合成算例

设目标时刻 BBO 为 100.00/100.02,baseline 因 soft-widen 把 BUY 放在 99.87,candidate 将它拉回 100.00。之后有三种典型情况:

  1. 市场最低只到 100.01:两臂都不成交,terminal delta 为零。
  2. 市场打到 100.00 后继续跌到 99.80:candidate 新增 BUY fill 并承担下跌,delta 为负。
  3. 市场打到 100.00 后反弹到 100.06:candidate 先成交、再由 reducing SELL 修复,delta 可能为正。

报价移动 13 ticks 只证明价格几何改变;真正的 treatment strength 是第二、第三类 path-changing cases 的频率与价值。F05 观察到的非零 terminal path 只有 opener 20/480、add 15/480,说明多数历史市场轨迹根本没有穿过两张报价之间的狭窄区域,或者虽穿过却没有改变最终撮合与库存路径。

这也解释一个反直觉现象:一张报价可以移动很多 ticks,却没有改变 fill count。两个订单可能仍各成交一次,但成交时间与价格不同;也可能目标订单不成交、稍后的 reprice 成交,导致总数相同而 terminal value 不同。因此研究同时检查 target mechanics、订单身份、path delta 和总 fill count,不能只看其中一个。

路径稀疏会制造怎样的学习问题

当 $D=0$ 时,所有候选特征对应的标签都恰好为零;当 $D=1$ 时,少数 delta 可能正负幅度很大。于是 direct-value learning 实际同时面对两个子问题:

总体价值是 $p_D(x)m_D(x)$。一个模型若只会预测“行情是否会触及 inward quote”,可能提高 $p_D$ 排序,却不能判断分叉后 $m_D$ 的符号;一个只在非零样本上训练的模型又会丢失行动分母,产生选择偏差。冻结 Ridge 直接学习 unconditional delta,虽然保守,却忠实于 action value。

样本中正路径更少:opener 的非零路径为 5 正、15 负,add 为 4 正、11 负。任何复杂模型都很容易围绕这 9 条正路径形成脆弱规则。chronological OOF 的意义就是要求规则先在过去形成,再面对尚未见过的日期;不能让同一条正 库存生命周期 同时参与特征选择和效果展示。

机械验证:不是 no-op

960 个 forks 全部:

  • 到达精确 target decision;
  • 保留冻结 role 与 policy permission;
  • 产生与 baseline 不同的可执行 BUY price;
  • 完成 mechanics accounting。

报价向内移动幅度为:

Role Forks 平均 inward ticks 中位数 范围
opener 480 15.35 13 7–98
add 480 14.86 13 7–81

抽样 Python/C++ mechanics parity 对一个 opener 和一个 add 完全一致,包括 target、role、permission、multiplier 与 effective price。相关合同测试通过。

这证明 candidate 真正改变了报价几何,不是“模型输出了 action,但执行价格没有动”的伪实验。

为什么价格移动很大,终局路径却很少改变

动作的 terminal nonzero support 很稀疏:

Role 非零 terminal paths 比例 正 delta 负 delta
opener 20 / 480 4.17% 5 15
add 15 / 480 3.13% 4 11

所有 960 个 forks 的总 fill count 都与 baseline 相同。这并不意味着 action 没有效果:同样的 fill count 可能对应不同成交时点、价格、订单身份与后续 库存生命周期 path。但它说明绝大多数 one-decision quote change 没有改变最终可见的顺序路径。

如果记 $D_i=1$ 表示 candidate 与 baseline 的 terminal path 不同,则估计对象可以分解为:

这里 $\Pr(D=1)$ 只有约 3%–4%。少数分叉的绝对 delta 可能很大,因此 unconditional mean 很容易被几条路径支配;这也是为什么研究需要按 UTC 日 bootstrap、winsorized sensitivity 与正日比例,而不能只看总和。

Direct-value OOF 结果

冻结 selector 在未来 OOF 的表现是:

Role OOF selected 平均 USDC/action 95% UTC-day CI USDC/OOF day 95% UTC-day CI 正日
opener 92 / 288 -0.00003478 [-0.00009626, +0.00000217] -0.0001333 [-0.0003500, +0.0000083] 1 / 24
add 187 / 288 -0.00003636 [-0.00007202, -0.00000656] -0.0002833 [-0.0005708, -0.0000500] 0 / 24

两个 role 都有足够 mechanics 与 selected-row support,却都失败经济门:

  • opener 的区间跨零,且只有 1/24 OOF 日为正;
  • add 的平均值和日总值区间都完全低于零;
  • 预测与实际 value 的相关系数为 opener $-0.0562$、add $-0.0272$,方向几乎没有可用关系。

全 480 actions/role 的 unconditional point estimate 被少数大 forks 拉成正值,但日期聚类区间仍跨零。99% winsorized mean 则为:

这些 sensitivity 解释结果,却不能替换预注册 OOF gate。

为什么不能“再调一下旧阈值”

研究失败不是因为动作没有触发,也不是因为报价只移动了半个 tick。动作平均移动约 15 ticks,mechanics 很明确。

真正失败的是:

  1. path-changing events 稀少;
  2. 局部 causal features 没有识别出其中有利的 continuation;
  3. OOF selector 选中的动作平均为负;
  4. role-specific 日期方向没有稳定性。

旧 filled-only classifier 的 score threshold 研究的是另一个分母。把它重新调到一个让 backtest 好看的值,不能补齐 direct action contrast。把 one-shot action 改成多次持续 release 也会创建新的 intervention duration 与 sequential feedback,不能继承本结果。

无条件均值为正,为什么 selector 仍然可以为负

全体 forks 的 point estimate 被少数大路径拉成正值,而 OOF selector 选择的集合为负,这两者不矛盾。无条件均值回答“每个机会都 release 会怎样”;selector 回答“模型认为值得 release 的机会怎样”。若模型排序方向错误,它可能系统性避开少数正路径、选中更多负路径。

形式上,设 $G(x)=1$ 为模型选中:

总体略正不要求第一项为正。研究权限取决于预注册 selector 的 OOF 值,而不是在读完结果后改成“全做”或重命名目标。

这次结果排除了哪些替代解释

mechanics parity 与 960/960 exact target 排除了“动作没有执行”;报价中位数移动 13 ticks 排除了“杠杆太弱到无法观察”;完整 paired path 排除了 pre-action PnL 污染;日期聚类区间排除了逐 action 伪独立;opener/add 分开则避免角色池化造成 Simpson reversal。

仍未排除的是另一种 intervention duration、另一种 BUY 状态表示、持续多决策 release,或完全不同的动作如 farther/skip/re-center。它们会改变 treatment、风险集与后续反馈,必须各自注册,不能把本项目的阴性结论外推成普遍定理。

One-shot 与 repeated policy 的数学边界

one-shot intervention只在冻结decision $t_0$把baseline quote改成soft-widen/release,之后两arms都回到同一baseline rule,但各自从已经分叉的state继续:

它估计一次局部改变的总路径效应。repeated policy则在每个未来eligible decision继续按selector动作,既改变state distribution也改变后续eligibility。两者可能反号,所以one-shot适合发现,不能直接当长期policy value。

为什么报价移动很多、有效路径仍然少

quote-changed只说明理论或提交价格不同。要改变terminal outcome,还需订单实际激活、在撤换前走到有差异的queue/fill状态,并让这次差异影响库存生命周期。若两价位同处一个tick、都未触达、都在ACK前撤销或后续迅速被相同repair覆盖,最终path不变。

可以把effective leverage写成漏斗:

每一项都小于1,故大幅quote movement与稀少terminal differences可以同时成立。学习器真正看到的正负action labels数量远小于decision rows;这也是时间外selector容易被少数日支配的原因。

结论:损失可被描述,不代表已找到有收益的动作

这些实验区分了三个问题。第一,30 秒 markout 只能描述早期 adverse selection,不能替代 库存生命周期 terminal。第二,first-add 在历史上平均为负,但 decision-visible state 没有识别出稳定、跨日可执行的负价值 subset。第三,历史单次解除 soft-widen 虽然改变了报价,时间外选择器仍选中了平均负价值动作;独立的新 Tardis risk-to-widen 开发账户比较也为负。由此不能跳到“所有 first-add 都应该关闭”,更不能把 filled-only classifier 当作 policy。

未来研究若要继续,必须从 assignment 前定义 intervention,保留未成交与取消路径,并让 action-specific activation、fill、inventory continuation 和 terminal value 共同进入评估。只有预测谁会成交、谁的 markout 较差或哪些历史 库存生命周期 较亏,都不足以授权 quote action。

公开方法与实验报告

各报告分别保留自己的数据、动作、日期和撤回范围。


NarrowGate 成交质量与动作选择:Markout、Quote EV 和 E/C 实验
https://xiao-nanbei.github.io/2026/08/29/NarrowGate-Decision-Visible-Negative-Fill-Value-Research/
作者
Xuan Tan
发布于
2026年8月29日
许可协议