Market-by-Price Compression & Queue-Position Illusion Slippage Playbook

2026-03-24 ยท finance

Market-by-Price Compression & Queue-Position Illusion Slippage Playbook

Date: 2026-03-24
Category: research
Scope: How MBP-only visibility creates queue-position illusion and systematic slippage underestimation

Why this matters

A lot of live execution stacks still consume Market by Price (MBP) only:

That is fine for coarse analytics, but dangerous for queue-sensitive execution.

If your model assumes queue progress from MBP deltas alone, you can easily over-credit your own priority. The model believes you are "near the front" more often than reality, so it overestimates passive fills, underestimates timeout/repost churn, and underprices adverse selection when urgency kicks in.

This is a microstructure observability mismatch: decision logic needs queue-granular truth, but features only provide compressed depth.


Failure mechanism (operator timeline)

  1. Router places passive child order at best bid/ask.
  2. Feature engine infers queue-ahead from MBP level size.
  3. Same-level cancels/adds from other participants are not fully attributable under MBP aggregation.
  4. Inferred queue-ahead decays faster than true queue-ahead (phantom progress).
  5. Fill hazard model predicts high near-term fill probability.
  6. Order times out; strategy escalates aggression/reprice.
  7. Realized implementation shortfall worsens vs model forecast.

This appears like "sudden liquidity deterioration" but is often state-estimation error.


Extend slippage decomposition with observability term

[ IS = IS_{spread} + IS_{impact} + IS_{timing} + IS_{fees} + \underbrace{IS_{obs}}_{\text{MBP queue-observability tax}} ]

Operational uplift model:

[ IS_{obs,t} \approx a,QAE_t + b,PHR_t + c,FHCG_t + d,RBS_t + e,QUR_t ]

Where:


Core production metrics

1) Queue-Ahead Estimation Error (QAE)

With occasional ground truth windows (MBO sample or private queue telemetry):

[ QAE = E\left[\left|\hat q_{ahead} - q_{ahead}^{true}\right|\right] ]

Track by symbol, venue, and session regime.

2) Phantom-Progress Rate (PHR)

Fraction of inferred queue reductions not followed by fills/crossing-consistent executions:

[ PHR = \frac{#{\Delta \hat q_{ahead}<0\ \land\ \text{no supporting execution evidence}}}{#{\Delta \hat q_{ahead}<0}} ]

High PHR means your model is "seeing" progress that does not exist.

3) Fill-Hazard Calibration Gap (FHCG)

[ FHCG = E\left[\hat P(\text{fill in }h\mid x) - \mathbf{1}_{\text{fill in }h}\right] ]

Measure not only globally, but conditioned on high queue uncertainty.

4) Repost Burst Score (RBS)

[ RBS = \frac{\text{cancel+repost events per minute}}{\text{passive orders resting}} ]

A practical symptom metric: queue illusion usually manifests as repeated timeout/repost loops.

5) Queue-Uncertainty Ratio (QUR)

If queue state is estimated with posterior variance (\sigma_q^2):

[ QUR = \frac{\sigma_q}{\hat q_{ahead}+\epsilon} ]

Use QUR to penalize passive edge estimates when confidence is weak.


Modeling architecture

Stage 1: latent queue-state filter (MBP-compatible)

Use a state-space model for (q_{ahead}):

Output: posterior (p(q_{ahead,t}\mid \mathcal{F}_t)), not just point estimate.

Stage 2: uncertainty-aware fill hazard

Predict near-term fill probability with uncertainty features:

[ \hat \lambda_{fill}(t) = f\big(\hat q_{ahead},\ \sigma_q,\ imbalance,\ spread,\ event\ intensity\big) ]

Hazard should degrade as (\sigma_q) rises, even if (\hat q_{ahead}) looks favorable.

Stage 3: slippage tail model with observability conditioning

Estimate q95/q99 slippage with:

Key interaction to monitor:

[ \Delta IS \sim \beta_1,urgency + \beta_2,QUR + \beta_3,(urgency\times QUR) ]

Large positive (\beta_3) indicates urgency decisions are fragile under queue ambiguity.


Live controller states

GREEN โ€” QUEUE_SIGNAL_TRUSTED

Action: normal passive participation and standard timeout.

YELLOW โ€” AMBIGUOUS_QUEUE

Action:

ORANGE โ€” QUEUE_ILLUSION_ACTIVE

Action:

RED โ€” SAFE_DEGRADE

Action:

Use hysteresis + minimum dwell time to avoid thrashing.


Engineering mitigations

  1. Dual-feed calibration windows (MBO + MBP)
    Even if production stays MBP, periodic MBO sampling is enough to estimate QAE/PHR drift.

  2. Venue-specific queue priors
    Cancel intensity and amend semantics differ by venue; one global prior is usually wrong.

  3. Posterior-first APIs
    Expose (\hat q_{ahead}) and (\sigma_q) together. Never let downstream logic consume queue point estimates alone.

  4. Conservative queue-credit policy
    For high-QUR states, discount estimated progress by policy (e.g., only 30โ€“50% credit).

  5. Tail-focused promotion gates
    New model version must improve q95/q99 slippage in high-QUR buckets, not just average IS.


Validation protocol

  1. Build paired dataset (MBP production features + sampled MBO truth windows).
  2. Estimate QAE/PHR by symbol-liquidity bucket and session segment.
  3. Compare baseline fill model vs uncertainty-aware hazard model.
  4. Canary uncertainty-penalized routing on limited flow.
  5. Promote only if:
    • tail slippage decreases in high-QUR windows,
    • completion rate is stable,
    • repost bursts decrease.

Practical observability checklist

Success criterion: less tail damage during queue-ambiguous periods without major completion loss.


Pseudocode sketch

# latent queue inference from MBP events + prints
q_posterior = queue_filter.update(mbp_event, trade_event)
q_mean = q_posterior.mean
q_std = q_posterior.std
qur = q_std / max(q_mean, 1e-3)

# uncertainty-aware fill hazard
fill_hazard = fill_model.predict(
    q_mean=q_mean,
    q_std=q_std,
    imbalance=imbalance,
    spread=spread,
    event_rate=event_rate,
)

# tail risk estimate
slip_q95 = tail_model.predict_q95(
    urgency=urgency,
    fill_hazard=fill_hazard,
    qur=qur,
    microburst=microburst_score,
)

# conservative queue credit under ambiguity
queue_credit = max(0.0, 1.0 - gamma * qur)
edge = passive_edge_estimate * queue_credit

score = edge - alpha * slip_q95
route(score)

Bottom line

MBP-only stacks often treat queue position like a known state, but it is usually a latent, noisy estimate.

When that uncertainty is ignored, passive execution looks better in backtests than in live trading, and the gap shows up as timeout churn plus tail slippage.

Treat queue confidence as a first-class risk variable, and make routing conservative whenever queue observability is weak.


References