Phase E.0 Task 5c. Ran phase_e_fit_fill_model on the ES.FUT 2024-Q1 MBP-10
+ trade tape (5.2M trades, 3.9M MBP-10 events, 500K snapshots accumulated
at snapshot_interval=50 over a ~24-minute window). Total runtime ~80s.
Empirical fill rates within 60s window:
- bid_l1: 4.97% (matches L1 maker-side activity in trending market)
- ask_l1: 71.34% (high — most 60s windows see an aggressive buy)
Fitted L1 cloglog coefficients (all 5 features):
BID L1: β_0=-0.213 β_spread=-2.064 β_imbal=-0.099 β_ofi=-0.006 β_logτ=-0.286
ASK L1: β_0=+0.016 β_spread=-40.336 β_imbal=+0.041 β_ofi=+0.652 β_logτ=-0.055
Sanity (sign checks all pass):
- β_spread < 0 both sides (wider spread → fewer fills) ✓
- bid β_imbal < 0 (more bid stack → harder to get hit by sell) ✓
- ask β_ofi > 0 (buying pressure correlates with ask fills) ✓
- β_logτ < 0 both sides (quieter markets → slower execution) ✓
L1-only limitation: as documented in the binary header, the parser only
populates levels[0]; L2/L3 in the JSON are L1 with β_0 -= ln(L+1) attenuation.
Default --out-path bumped to config/ml/phase_e_fill_coeffs.json so future
re-runs land in the same committed location.