Auction Imbalance Drift Slippage Playbook (Practical)
Why this matters
If your strategy participates in the close (or open), the biggest hidden execution tax is often imbalance drift in the final minutes: the indicative auction price and imbalance size can move quickly, and passive assumptions from continuous trading stop working.
This note turns that into an operational control loop.
1) Core idea
Treat auction execution as a separate microstructure regime with its own state machine.
- Continuous-book intuition (spread, queue, rebate) is not enough.
- Auction fill certainty can be high, but price uncertainty can spike late.
- You need to manage price drift risk vs underfill risk explicitly.
2) Data contract (minimum)
For each auction-participating order, log:
symbol,date,side,target_qtydecision_ts,submit_ts,cancel_ts(if any)auction_print_px,auction_print_qty- Indicative stream snapshots (e.g. every 1s/5s):
indicative_px_timbalance_side_t(buy/sell/none)imbalance_qty_tmatched_qty_t
- Continuous market context:
spread_t,lit_depth_t,realized_vol_1m_t
- Outcome:
filled_qty_auction- residual qty + post-auction completion path
Without this, you cannot separate drift damage from participation policy mistakes.
3) Metrics that actually matter
3.1 Imbalance Drift Score (IDS)
A simple normalized drift measure in the final window (e.g. last 10 min):
IDS = |I_t - I_anchor| / ADV
I_t: current signed imbalance quantity (buy=+, sell=-)I_anchor: imbalance at window start (or rolling baseline)- Use ADV-normalization for cross-symbol comparability.
3.2 Indicative Price Velocity (IPV)
IPV = |P_ind(t) - P_ind(t-Δ)| / (Δ * tick)
High IPV means auction price discovery is unstable right now.
3.3 Auction Shock Index (ASI)
ASI = w1*z(IDS) + w2*z(IPV) + w3*z(realized_vol_1m)
Use robust z-score (median/MAD), clip extremes, and calibrate by symbol bucket.
4) Regime controller
State A: Stable
- Condition:
ASI < T1 - Policy:
- normal participation schedule
- minimal intervention
State B: Drift-Watch
- Condition:
T1 <= ASI < T2 - Policy:
- tighten max participation delta per minute
- increase snapshot frequency
- pre-stage residual completion logic
State C: Drift-Shock
- Condition:
ASI >= T2 - Policy:
- cap incremental auction participation (avoid chasing unstable print)
- enforce residual budget guardrail
- optional symbol-level kill switch if expected slippage budget breach
Use hysteresis for transitions (T1_down < T1, T2_down < T2) to prevent flip-flopping.
5) Residual handling (where hidden losses happen)
If auction underfills or shock state persists, residual handling must be pre-committed:
- Define residual completion windows (e.g. +5m, +15m)
- Define fallback styles by regime:
- low stress: passive catch-up
- medium stress: mixed passive/aggressive
- high stress: bounded aggression with hard slippage cap
- Track residual attribution separately from auction attribution.
Most teams blend these and lose diagnostic power.
6) Calibration loop (weekly)
- Refit
ASIweights by symbol-liquidity bucket. - Re-estimate
T1/T2from quantiles of historical stress windows. - Evaluate:
- p50/p95 auction slippage
- residual slippage
- underfill rate
- policy intervention frequency
- Reject updates that improve mean but worsen p95 too much.
Objective is not prettier averages; it is tail containment with acceptable opportunity cost.
7) Guardrails checklist
- Separate auction and residual slippage in reporting
- Enforce max expected-cost budget before adding risk
- Use stale-snapshot cutoff (do not trust old indicative states)
- Hysteresis enabled in regime transitions
- Symbol-level hard stop for repeated shock windows
8) Common failure modes
Treating auction like normal LOB execution
- Fix: dedicated regime/state machine.
Optimizing average bps only
- Fix: optimize p95 and budget-breach frequency.
No residual policy pre-commitment
- Fix: explicit fallback tree with time + cost limits.
One global threshold for all symbols
- Fix: bucketed calibration by liquidity/volatility profile.
TL;DR
Auction participation is not “set and forget.” Use imbalance + indicative-price drift as a live stress signal, run a 3-state controller, and separate auction vs residual attribution. That alone usually removes a large chunk of avoidable tail slippage around open/close windows.