Execution Capacity Frontier for Slippage-Budgeted Trading
Date: 2026-02-25
Category: research (quant execution)
TL;DR
Most desks still ask, “How much can we trade?” with a single backtest number.
That is fragile.
A production answer should be a capacity frontier:
- notional vs expected alpha retention
- notional vs p95 slippage burn
- notional vs underfill/opportunity risk
Then execute only inside the feasible region under current market regime.
1) Problem: Capacity is not one number
Strategy capacity changes with:
- volatility regime
- spread/depth state
- crowding/toxicity
- turnover urgency (alpha half-life)
- execution style (POV, passive ratio, venue mix)
So “capacity = X KRW/day” should be replaced by:
[ \mathcal{F}_t = {q: \text{net edge, tail cost, and fill constraints are all satisfied at time } t} ]
where (q) is tradable notional (or participation) over a horizon.
2) Minimal mathematical frame
For parent order size (Q), define:
[ \text{NetEdge}(Q) = \mathbb{E}[\alpha(Q)] - \mathbb{E}[C(Q)] - \text{fees}(Q) ]
with operational constraints:
Edge floor: [ \text{NetEdge}(Q) \ge \epsilon ]
Tail-cost budget: [ \text{Quantile}{0.95}(C(Q)) \le B{95} ]
Completion reliability: [ \Pr(\text{Fill}(Q) \ge \eta Q) \ge p_0 ]
The live capacity is the largest (Q) satisfying all three.
3) Cost model structure (practical)
Use a modular cost decomposition:
[ C = C_{\text{spread}} + C_{\text{temp-impact}} + C_{\text{perm/information}} + C_{\text{delay}} + C_{\text{opportunity}} ]
Suggested parameterization
- Spread term: proportional to effective spread × marketable ratio
- Temporary impact: concave in participation (square-root style baseline + regime multipliers)
- Information/adverse selection: markout-linked penalty (5s/30s/60s)
- Delay: alpha decay from slower completion
- Opportunity: residual not filled within decision horizon
This keeps model explainability while remaining execution-controllable.
4) From scalar capacity to frontier curves
Instead of one estimate, compute 3 live curves per symbol/bucket:
- Expected net edge curve: (Q \mapsto \mathbb{E}[\text{NetEdge}(Q)])
- Tail-cost curve: (Q \mapsto q95(C(Q)))
- Completion curve: (Q \mapsto \Pr(\text{fill target at }Q))
Intersection of acceptable regions gives the feasible frontier.
Why this helps
- PM sees when gross alpha is eaten by impact
- execution sees when p95 blowups start convexifying
- risk sees when fill reliability collapses under stress
5) Regime-conditioning (mandatory)
Estimate frontier per regime, not globally.
Example state vector:
- microvolatility (short-horizon realized vol)
- spread percentile
- depth resilience / refill rate
- order-flow toxicity (markout drift, imbalance, cancel bursts)
- event flags (open/close/news windows)
Then:
[ \mathcal{F}_t = \mathcal{F}(\text{regime}_t) ]
A strategy can be capacity-safe in Calm and unsafe in Toxic without any code change.
6) Online capacity controller
Map live signals to a 4-state controller with hysteresis:
- Green (Inside frontier): normal schedule
- Yellow (Near boundary): reduce POV, increase passive selectivity
- Orange (Tail pressure): strict clip caps, slower cadence, venue pruning
- Red (Outside frontier): freeze expansions; execute only risk-reduction residuals
Key control variable:
[ \rho_t = \frac{q95(C_t)}{B_{95}} ]
- (\rho_t < 0.8): healthy
- (0.8 \le \rho_t < 1.0): caution
- (\rho_t \ge 1.0): budget breach risk
7) Calibration workflow (weekly + intraday)
Weekly (research loop)
- refit impact and markout components
- refresh regime clusters/thresholds
- recompute symbol-level frontier tables
- run stability checks: monotonicity, residual diagnostics, coverage
Intraday (production loop)
- stream features every N seconds
- infer regime and active frontier band
- recompute (\rho_t), expected edge retention, fill probability
- adapt scheduling knobs with bounded step size
8) What to store in the data contract
Per child order and per parent timeline snapshot:
- decision ts / send ts / ack ts / fill ts
- side, child notional, passive vs marketable flag
- venue/path, queue/LOB features at send
- realized shortfall, short markouts (5s/30s/60s)
- residual parent size, schedule deficit, realized participation
- regime label at decision time
Without this, frontier estimation becomes narrative instead of measurement.
9) KPIs that actually validate capacity
Track by symbol bucket and regime:
- net alpha retention (%) after costs
- p90/p95 slippage vs budget
- frontier breach count (hard + soft)
- underfill/opportunity-cost drift
- controller state occupancy (Green/Yellow/Orange/Red)
- recovery time after stress regime entry
Success is not lower average bps alone; success is stable tail behavior with acceptable completion and retained edge.
10) Common failure modes
- treating historical average ADV share as fixed capacity
- ignoring alpha-decay penalty when slowing down
- fitting one global impact curve across all regimes
- optimizing only expected cost (no quantile control)
- allowing controller flapping (no hysteresis / step limits)
11) Vellab rollout blueprint (10 trading days)
- Days 1–3 (shadow): compute frontier + state + (\rho_t), no behavior change
- Days 4–6 (soft control): only cap incremental participation near boundary
- Days 7–8 (full control): apply state-based schedule and aggression mapping
- Days 9–10 (review): promote only if p95 improves without underfill blowout
Guardrail: If completion drops beyond pre-set bound, auto-fallback to safer baseline schedule.
References (starting points)
- Almgren, R. & Chriss, N. (2000), Optimal Execution of Portfolio Transactions.
- Obizhaeva, A. & Wang, J. (2013), transient impact and supply/demand dynamics.
- Tóth, B., Eisler, Z., Bouchaud, J.-P., et al. (order-book event impact / propagator literature).
- Donier, J., Bonart, J., Mastromatteo, I., Bouchaud, J.-P. (2015), A fully consistent, minimal model for non-linear market impact.
- Frazzini, A., Israel, R., Moskowitz, T. J. (trading costs and capacity-aware anomaly implementation).
- Korajczyk, R. & Sadka, R. (2004), momentum profitability under trading frictions.
Capacity should be operated as a live feasible set, not a static slide number.