Queue-Reactive Microprice + Propagator Slippage Controller Playbook

2026-02-25 · finance

Queue-Reactive Microprice + Propagator Slippage Controller Playbook

Date: 2026-02-25 (KST)

TL;DR

Classic slippage models answer "how expensive was execution" but often miss "how the book state is about to change before my next child order".

This playbook combines:

  1. Queue-reactive order-book dynamics (state-dependent event intensities)
  2. Microprice drift nowcast (short-horizon direction from queue state transitions)
  3. Transient impact propagator (cost memory from your own recent aggression)

Then it runs a budget-aware controller that switches between Lean Passive -> Priority Join -> Controlled Cross.

Goal: cut tail slippage (p95) while preserving fill completion under fast microstructure regime shifts.


1) Why this stack is useful in live execution

If you only model spread/volatility/depth at snapshot time, two gaps remain:

A practical live controller should answer both:


2) Model architecture (execution-ready)

2.1 Queue-reactive state model

Discretize local LOB state at decision time t:

For each event type e (limit add, cancel, market buy, market sell), estimate state-conditional intensity:

lambda_e(t) = f_e(Qb, Qa, I, S, tod, vol_bin)

Practical estimators:

This is the queue-reactive layer inspired by Huang–Lehalle–Rosenbaum style Markov queueing view.

2.2 Microprice drift nowcast

Define microprice:

m_t = (a_t * Qb + b_t * Qa) / (Qb + Qa)

Estimate short-horizon drift probability over horizon h (e.g., 250ms~2s):

p_up = P(mid_{t+h} > mid_t | state_t)

Use either:

Convert to drift score:

drift = 2 * p_up - 1 (range [-1, 1])

Interpretation for buy execution:

2.3 Transient impact memory (propagator)

Track your own signed child-order flow u_k at timestamps t_k.

Impact memory term:

I_mem(t) = sum_k G(t - t_k) * u_k

Use a decaying kernel (single or multi-exponential):

G(dt) = sum_j w_j * exp(-rho_j * dt)

This captures "recent aggression is not free" and prevents over-crossing during short-term impact overhang.

2.4 Slippage quantile head

Predict quantiles directly (q50, q90, q95) with features:

For buy side example:

q95_live = q95_base + a1*max(0, drift) + a2*I_mem + a3*pressure + a4*toxicity

Monotonic constraints help stability (drift+, I_mem, pressure non-decreasing).


3) Controller design: 3 execution modes

Mode A — Lean Passive

Use when:

Policy:

Mode B — Priority Join

Use when:

Policy:

Mode C — Controlled Cross

Use when:

Policy:

State transitions should use hysteresis to avoid mode flapping.


4) Data contract (minimal)

interface DecisionFeatures {
  ts: string
  symbol: string
  side: 'BUY' | 'SELL'
  spreadTicks: number
  qb: number
  qa: number
  imbalance: number
  microVol: number
  expectedDepletionMs: number
  fillHazard: number
  driftScore: number
  impactMemory: number
  schedulePressure: number
}

interface DecisionOutput {
  mode: 'LEAN_PASSIVE' | 'PRIORITY_JOIN' | 'CONTROLLED_CROSS'
  childQty: number
  priceOffsetTicks: number
  ttlMs: number
  aggressionCap: number
  reasonCodes: string[]
}

5) Calibration loop (daily + intraday)

5.1 Daily

  1. Refit queue-reactive intensities by liquidity bucket
  2. Refit drift nowcast (state transition or classifier)
  3. Refit propagator decay parameters by symbol bucket
  4. Refit quantile head with coverage objective (pinball + p95 breach penalty)

5.2 Intraday guarded updates


6) KRX/KIS practical adaptation notes


7) Monitoring checklist (what actually catches failures)

  1. q95 coverage by symbol bucket and regime (target around nominal)
  2. Mode mix drift (sudden Controlled Cross inflation = warning)
  3. Impact-memory breaches before/after cool-down trigger
  4. Passive miss streak distribution (delay risk)
  5. Implementation shortfall decomposition
    • spread/fees
    • delay drift
    • impact memory
    • residual unexplained

8) Failure modes and guardrails


9) Reference anchors


One-line takeaway

Don’t choose child-order aggression from static depth snapshots alone—combine queue-state transition risk + impact memory + remaining-time pressure and let the controller switch modes explicitly against a tail-slippage budget.