Dark-Pool Midpoint Toxicity & Markout Slippage Playbook
Date: 2026-03-05
Category: research
Domain: finance / execution / market microstructure / dark liquidity
Why this matters
Midpoint dark execution is often treated as “free spread improvement.”
That is incomplete.
A midpoint fill can still be expensive when:
- the reference quote is stale,
- contra flow is informed,
- or your order is repeatedly pinged before adverse moves.
So the right question is not “did I get midpoint?” but:
“Did midpoint save more than post-trade markout cost?”
Core cost decomposition
For a buy child order (sell is symmetric), define effective dark cost in bps:
[ C_{dark} = C_{arrival\to fill} + C_{markout} + C_{opportunity} - S_{midpoint} ]
Where:
- (S_{midpoint}): half-spread savings vs crossing lit touch,
- (C_{markout}): adverse price move after fill (signed markout),
- (C_{arrival\to fill}): drift while waiting for dark fill,
- (C_{opportunity}): residual urgency cost if fill probability is low.
Dark routing is only beneficial when expected savings exceed toxicity + waiting costs.
1) Markout ladder as primary toxicity lens
Track signed markout at multiple horizons:
[ M_{\tau} = side \cdot \frac{P_{\tau}-P_{fill}}{P_{fill}} \times 10^4 ]
- (side=+1) for buys, (-1) for sells,
- (\tau) ladder: 10ms, 100ms, 1s, 5s, 30s (venue-dependent).
Interpretation:
- positive (M_{\tau}): favorable post-fill drift,
- negative (M_{\tau}): adverse selection.
Use both median and tail (p10/p5) markouts; means alone hide toxic bursts.
2) Midpoint Toxicity Score (MTS)
Build a compact routing feature:
[ MTS = a_1\tilde{M}{100ms} + a_2\tilde{M}{1s} + a_3\tilde{M}{5s} + a_4\tilde{Q}{stale} + a_5\tilde{J}_{micro} ]
Suggested normalized components:
- (\tilde{M}_{\tau}): z-scored signed markouts by symbol/time bucket,
- (\tilde{Q}_{stale}): stale-reference proxy (quote age / update lag / crossed-feed disagreement),
- (\tilde{J}_{micro}): micro-jump risk proxy (short-horizon realized variance, imbalance shocks).
Calibrate by:
- symbol liquidity bucket,
- session phase (open/mid/close),
- volatility regime.
Do not pool all names into one global MTS model.
3) Dark-vs-lit expected cost switch
At each decision point, compare:
[ \mathbb{E}[C|dark] = p_f\cdot C_{dark,fill} + (1-p_f)\cdot C_{dark,miss} ]
[ \mathbb{E}[C|lit] = C_{lit,now} ]
Route dark only when:
[ \mathbb{E}[C|dark] + \delta < \mathbb{E}[C|lit] ]
- (p_f): near-term dark fill probability,
- (\delta): safety margin for model error / stale-state risk.
This avoids the common anti-pattern: “always try dark first” regardless of toxicity regime.
4) Execution state machine
STATE A — DARK_FAVORABLE
Trigger: MTS low toxicity + stable fill probability.
- prioritize midpoint dark slices,
- keep lit fallback with moderate timeout,
- monitor 100ms/1s markout drift.
STATE B — DARK_GUARDED
Trigger: mild toxicity deterioration or weaker fill odds.
- reduce dark child size,
- shorten dark timeout,
- pre-arm lit continuation path.
STATE C — DARK_TOXIC
Trigger: sustained negative near-touch markouts / stale quote indicators.
- sharply reduce dark exposure,
- shift to lit/taker or protected displayed liquidity,
- tighten max wait budget.
STATE D — DISLOCATED
Trigger: severe quote-staleness bursts, jumpy microstructure, unstable fill quality.
- enter safe mode: minimal dark probing,
- use deterministic fallback schedule,
- require human review for large residuals.
Use hysteresis to prevent state flapping.
5) Data contract (minimum viable)
- fill-level timestamps with sub-millisecond consistency where possible,
- reference NBBO/mid snapshots around fill event,
- quote-age and feed-sequence integrity markers,
- venue/strategy tags (midpoint peg type, conditional logic, min quantity),
- child-order lifecycle (submit/ack/fill/cancel/timeout),
- post-fill markouts by horizon ladder,
- urgency context (residual size, deadline, alpha decay proxy).
If clock sync is weak, toxicity attribution is mostly noise.
6) Validation protocol
Offline
- segment by regime (volatility, spread, quote-age quality),
- evaluate p50/p90/p95 shortfall and p10 markout,
- include missed-fill opportunity cost, not just filled dark trades.
Shadow
- run route decision model in parallel without changing live routing,
- compare model-implied route with realized outcomes,
- monitor false-toxic and false-safe rates.
Canary
- low notional + tight guardrails,
- automatic rollback triggers:
- p95 shortfall degradation,
- near-touch markout tail worsening,
- excessive residual carry from dark timeouts.
7) Frequent failure modes
Midpoint fill-rate worship
High fill rate can coexist with poor markouts.Single-horizon toxicity metric
100ms may look fine while 1s/5s are strongly adverse.Ignoring quote staleness
Midpoint quality depends on reference freshness.No opportunity-cost accounting
Dark misses are not free when alpha decays.No regime segmentation
One threshold for all symbols/sessions fails in production.
8) Minimal implementation checklist
- Build markout ladder (10ms→30s) for every dark fill
- Add MTS feature pipeline with quote-staleness inputs
- Estimate dark fill probability and missed-fill cost jointly
- Deploy dark-vs-lit expected-cost switch with safety margin (\delta)
- Add state machine + hysteresis + rollback triggers
- Monitor p95 shortfall + p10 markout + timeout carry together
References to review
- Zhu, H. (2014), Do Dark Pools Harm Price Discovery? (Review of Financial Studies).
- Shkilko, A. & Sokolov, K. (2023), Sharks in the Dark: Quantifying HFT Dark Pool Latency Arbitrage (Journal of Economic Behavior & Organization).
- Venue-level midpoint / markout methodology notes (e.g., near-touch markout conventions) for implementation details.
Midpoint is a price level, not a quality guarantee. In dark routing, markout-aware regime control is the difference between hidden alpha and hidden tax.