Fill-Hazard + Markout Coupled Slippage Controller Playbook
Date: 2026-02-25
Category: research (quant execution)
TL;DR
Most execution stacks model impact and fill probability separately, then wonder why live slippage tails explode.
Use a coupled controller: estimate (1) queue fill hazard, (2) adverse markout risk after fill, and (3) delay/opportunity cost if not filled, then choose passive vs aggressive action under a shared tail-budget.
1) Why this matters in production
For a buy order, passive quotes can look cheap in backtests but become expensive when:
- queue priority is poor (low fill odds)
- fill arrives only after microprice drifts up
- non-fill forces urgent catch-up later at worse prices
If we optimize for spread capture alone, we buy false comfort.
2) Core decomposition
At decision time (t), for action (a_t):
[ \mathbb{E}[C_t(a_t)] = C^{impact}_t(a_t) + p^{fill}_t(a_t),C^{markout}_t(a_t) + (1-p^{fill}_t(a_t)),C^{delay}_t(a_t) ]
Where:
- (C^{impact}): immediate crossing/temporary impact cost
- (p^{fill}): fill probability over horizon (\Delta)
- (C^{markout}): expected post-fill adverse movement (e.g., 5s/30s)
- (C^{delay}): expected cost of waiting and retrying later
Risk-aware execution objective:
[ \min_{a_t}; \mathbb{E}[C_t(a_t)] + \lambda,\mathrm{Var}(C_t(a_t)) \quad \text{s.t.} \quad \Pr(C_t(a_t)>B_t) \le \delta_t ]
- (B_t): remaining tail-budget slice
- (\delta_t): tolerated breach probability
3) Modeling block A — Fill hazard
Model queue fill as survival/hazard process:
[ h_t = \Pr(\text{fill in }[t,t+dt] \mid \text{not yet filled}, x_t) ]
Useful features:
- queue position estimate (shares ahead)
- same-side cancel rate (queue decay)
- opposite-side market order intensity (consuming flow)
- spread state, top-book depth, depth imbalance
- venue-specific latency + acknowledgement lag
Practical implementation:
- piecewise-exponential hazard model or discrete-time logistic hazard
- recalibrate per symbol bucket (ADV, spread regime, tick size)
- maintain online correction factor to absorb intraday drift
4) Modeling block B — Adverse markout
Estimate expected adverse move conditional on fill:
[ M_{t,h} = \mathbb{E}[\text{sign}(side)\cdot (mid_{t+h}-fill_t) \mid \text{fill at }t, x_t] ]
Horizon set (h): 5s / 30s / 120s (or strategy-specific).
Feature candidates:
- microprice-minus-mid dislocation
- short-term signed trade imbalance
- cancel burst intensity (fragility)
- spread widening speed
- local volatility shock flag
Heavy-tail handling:
- Student-t residuals or quantile models (q50/q90/q95)
- monitor calibration error by regime, not only global RMSE
5) Modeling block C — Delay/opportunity cost
When passive order misses, the parent schedule may become urgent.
Approximate delay cost:
[ C^{delay}_t \approx \alpha_t,\Delta t + \beta_t,\Delta POV + \gamma_t,\sigma_t\sqrt{\Delta t} ]
Interpretation:
- (\alpha_t): alpha decay (edge leakage)
- (\beta_t): convexity penalty for later catch-up aggression
- (\gamma_t): volatility-driven uncertainty tax
This prevents the classic error: “passive now, panic later”.
6) Decision policy (passive ↔ aggressive switch)
Compute two candidate costs each cycle:
- (J^{passive}_t): place/join queue
- (J^{aggr}_t): cross spread now (or partial cross)
Switch if:
[ J^{passive}_t - J^{aggr}_t > \theta_t ]
Dynamic threshold (\theta_t) should tighten when:
- remaining time-to-close is short
- tail-budget burn rate is high
- market enters fragility/toxicity regime
Recommended action space (small but effective):
- Passive join (price = best bid/ask)
- Passive improve by 1 tick (limited)
- Partial marketable + residual passive
- Full marketable slice with hard cap
7) Regime state machine
Use a 4-state controller:
- Green: normal liquidity, stable markout
- Yellow: rising toxicity or lower fill hazard
- Orange: fragile queue + widening spread
- Red: tail risk breach zone
State transitions from composite signal:
- hazard deterioration score
- markout q90/q95 jump
- delay-cost acceleration
- residual slippage budget burn
In Red:
- shrink child size
- restrict passive exposure duration
- tighten per-order max slippage guard
- allow temporary strategy throttle/pause
8) Vellab/KIS deployment blueprint
Data plane
- KIS quote/trade stream + order ack/fill logs
- local feature stream at 1–5s cadence
- event-time alignment (exchange timestamp priority)
Model services
fill-hazard-servicemarkout-forecast-serviceexecution-policy-servicerisk-sentinel(tail-budget + kill-switch ladder)
Storage / observability
- append-only event log for replay (fills, cancels, decisions)
- rolling calibration report (coverage, bias, drift)
- regime timeline dashboard (Green→Red transitions)
Must-have guards
- stale market data gate (fallback mode)
- missing ack/fill reconciliation watchdog
- per-symbol and portfolio-level throttle caps
- auto-downgrade when model confidence collapses
9) Validation protocol (before real capital scaling)
Do not ship from average bps improvements alone.
Track at least:
- mean/median slippage
- q90/q95/q99 slippage
- fill ratio + underfill ratio
- catch-up aggression frequency
- post-fill markout distribution by state
- tail-budget breach frequency
A/B setup:
- Baseline: existing impact-only or static policy
- Candidate: coupled hazard+markout controller
- Same universe, same notional buckets, same hard risk limits
Success condition (practical):
- q95 down, breach frequency down
- no material underfill blow-up
- stable performance across open/lunch/close regimes
10) Failure modes to watch
- Queue position mismeasurement → fake fill probabilities
- Label leakage in markout model → backtest mirage
- No latency accounting → stale control actions
- Tail budget ignored near close → forced panic execution
- Overcomplex policy → hard-to-debug behavior under stress
Keep policy interpretable; complexity should be in modeling, not hidden branching logic.
11) 10-day rollout plan
- Day 1–3: shadow mode (predict only, no control)
- Day 4–6: tiny-notional pilot + strict kill-switch rails
- Day 7–8: expand symbols in liquid buckets only
- Day 9–10: evaluate q95 + underfill + breach KPIs; gate scale-up
References (starting points)
- Almgren, R. & Chriss, N. (2000), Optimal Execution of Portfolio Transactions.
- Huang, W., Lehalle, C.-A., Rosenbaum, M. (2015), Simulating and Analyzing Order Book Data: The Queue-Reactive Model.
- Taranto, D. et al. (2016/2018), Propagator-family linear impact models.
- Stoikov, S. (2017), The Micro-Price: A High Frequency Estimator of Future Prices.
The practical edge is coupling: fill hazard + markout + delay cost in one control loop. That is where slippage tails usually hide.