Fill-Time × Markout Copula Slippage Playbook
TL;DR
A common execution mistake is modeling these separately:
- Will my passive child fill (and when)?
- If it fills, will post-fill markout hurt me?
In live markets, they are strongly coupled: the fills that come easiest are often the most toxic.
A practical upgrade is to build a joint model:
- marginal A: fill-time survival,
- marginal B: post-fill markout distribution,
- coupling: a copula that captures tail dependence.
Then route by joint tail risk (not average fill or average markout alone).
1) Why independent models underprice slippage tails
Typical stack in production:
- model fill probability from queue position + imbalance,
- model markout from short-horizon drift features,
- add expected values.
Failure mode:
- a child gets fast fill in a toxic moment,
- short-horizon drift continues against inventory,
- repeated across slices,
- parent-order p95/p99 explodes while average metrics look “fine.”
Root cause: negative dependence between “easy fill” and “good post-fill outcome” is ignored.
2) Joint-variable framing
For each candidate child order at decision time (t):
- (T): time-to-fill (censored at decision horizon (H)),
- (M): signed post-fill markout (e.g., 5s/30s, in bps; bad direction positive cost),
- (X_t): feature vector (queue rank, depth slope, imbalance, cancel burst, microprice drift, volatility, session state).
Instead of modeling (T) and (M) independently, estimate
[ F_{T,M\mid X}(u,v\mid X_t) ]
via Sklar decomposition:
[ F_{T,M\mid X}(u,v\mid X_t)=C_{\theta(X_t)}\big(F_{T\mid X}(u\mid X_t),F_{M\mid X}(v\mid X_t)\big) ]
where (C_{\theta}) is a copula (Gaussian, t, Clayton, Gumbel, etc.).
3) Marginal A: fill-time survival (with censoring)
Passive children are naturally right-censored (many never fill before timeout).
Use discrete-time hazard or Cox/AFT-style survival:
[ h_k(X_t)=P(T\in(k,k+\Delta]\mid T>k, X_t) ]
[ S(k\mid X_t)=\prod_{j\le k}(1-h_j(X_t)) ]
Operational outputs:
- (P(T\le H\mid X_t)=1-S(H\mid X_t)),
- quantiles of fill delay (q50/q90),
- urgency-adjusted expected wait.
Key features:
- queue position percentile,
- same-side cancel rate ahead of queue,
- opposite-side trade intensity,
- touch stability / spread state,
- latency bucket (ACK + queue update freshness).
4) Marginal B: markout distribution (not mean-only)
Model (M\mid X_t, T\le H) with quantiles or heavy-tail likelihood (Student-t).
Example multi-quantile head:
- (\hat q_{0.5}(M)), (\hat q_{0.9}(M)), (\hat q_{0.95}(M))
for multiple horizons (5s/30s/120s).
Why quantiles matter:
- mean markout can look harmless,
- tail markout drives slippage incidents and kill-switch events.
5) Copula choice and interpretation
The copula captures dependence after removing marginal effects.
Practical guidance:
- t-copula: symmetric tail dependence, robust default,
- Clayton: stronger lower-tail dependence (useful when “fast fill + bad markout” clusters),
- Gumbel: upper-tail dependence,
- Gaussian: simple baseline but may miss tail co-moves.
Condition (\theta) on regime features (volatility, cancellation stress, auction proximity) so dependence is state-aware.
6) Joint execution objective
For a buy parent, define child expected cost:
[ \mathcal{J}(a_t)= E\big[c_{\text{fill}}(T,M,a_t)\cdot\mathbf{1}{T\le H}\mid X_t\big] +E\big[c{\text{miss}}(a_t)\cdot\mathbf{1}_{T>H}\mid X_t\big] ]
with tail constraint:
[ \mathrm{CVaR}_{95}(\text{child cost}\mid X_t)\le B_t ]
where (B_t) is remaining slippage budget per child/parent state.
Interpretation:
- fast fill is only good if conditional toxicity is acceptable,
- waiting is only good if miss/urgency penalty is tolerable,
- action should minimize joint cost under tail budget.
7) Action policy mapping (deployable)
Candidate actions: {join, improve, midpoint, take_small, pause}.
At each step:
- score each action with joint (\mathcal{J}(a_t)),
- reject actions violating CVaR budget,
- apply hysteresis and minimum dwell time,
- execute best feasible action.
Example controller states:
- GREEN: join/improve allowed,
- AMBER: cap passive size, shorter timeouts,
- RED: avoid passive at touch, bounded aggression,
- SAFE: pause or minimal probing only.
Transition triggers should include copula-tail diagnostics, not just spread/depth.
8) Calibration protocol (anti-self-deception)
- Chronological split only.
- Fit survival marginal with censoring-aware loss.
- Fit markout quantiles on filled subset (with selection correction if needed).
- Fit copula on PIT-transformed residuals.
- Validate by regime buckets (symbol, TOD, volatility, participation).
- Replay baseline vs copula-policy event-by-event.
Required diagnostics:
- survival calibration (Brier / integrated calibration index),
- quantile coverage error for markout,
- copula tail-dependence stability by regime,
- action churn / flip rate,
- parent-level mean + q90/q95 + deadline miss.
9) Online monitoring metrics
Track these in production:
fill_markout_tail_corr: rolling dependence proxy,joint_tail_breach_rate: realized cost > predicted q95,copula_param_drift: (\theta_t) drift with CUSUM/Page-Hinkley,policy_reject_rate: fraction blocked by CVaR budget,panic_take_ratio: late aggressive fallback frequency.
If joint-tail breach rate rises, downgrade to safer controller state and tighten participation.
10) Minimal implementation blueprint
Data contract (per decision)
- order metadata: parent id, side, residual qty, deadline,
- market snapshot/features,
- survival outputs: fill CDF / hazard,
- markout quantiles,
- copula parameter + joint risk score,
- chosen action + rejected-action reasons,
- realized outcomes and attribution.
Runtime loop
- Build features.
- Infer marginals (F_T, F_M).
- Infer copula (\theta) and joint tails.
- Compute feasible actions under budget.
- Send child.
- Log full tuple for TCA + retraining.
Safety rails
- hard max aggression and max child notional,
- fallback policy if model entropy/drift alarm trips,
- hard timeout near parent deadline,
- data-quality gate (stale book / dropped feed).
11) Expected impact
Typical outcomes when deployed carefully:
- lower p95/p99 slippage under toxic bursts,
- fewer “filled quickly then instantly underwater” episodes,
- reduced late panic crossing,
- better explainability in post-trade reviews (dependence-driven decisions).
What it will not do:
- eliminate all adverse selection,
- replace venue/rule-specific microstructure logic,
- remove need for strong latency discipline.
Closing
Execution quality is not a one-dimensional fill problem.
When fill timing and post-fill toxicity co-move, independent models systematically understate risk. A copula-based joint framework gives a practical path to price that dependence explicitly and route with tail-aware discipline.
References
- Sklar, A. (1959). Fonctions de répartition à n dimensions et leurs marges. Université Paris 8.
- Nelsen, R. B. (2006). An Introduction to Copulas (2nd ed.). Springer.
- Joe, H. (2014). Dependence Modeling with Copulas. CRC Press.
- Mounjid, O., et al. (2018). Limit Order Strategic Placement with Adverse Selection Risk and the Role of Latency. arXiv:1610.00261. https://arxiv.org/abs/1610.00261
- Albers, J., et al. (2025). The Market Maker’s Dilemma: Navigating the Fill Probability vs. Post-Fill Returns Trade-Off. arXiv:2502.18625. https://arxiv.org/abs/2502.18625
- Cartea, Á., Jaimungal, S., & Penalva, J. (2015). Algorithmic and High-Frequency Trading. Cambridge University Press.