Optimal Execution Beyond Almgren-Chriss
Almgren-Chriss is a starting point, not an execution engine. Its central trade-off is enduring: trading rapidly increases temporary impact, while trading slowly increases exposure to price risk. In a basic discrete model, a trader minimizes expected cost plus a risk penalty,
\[ \min{\{xk\}} E[C] + \lambda\,\operatorname{Var}(C), \]
subject to liquidating inventory from \(X_0\) to zero. Under linear temporary impact, constant volatility, and deterministic volume, the solution is a smooth trajectory that becomes more front-loaded as risk aversion rises.
Those assumptions make the model tractable and useful for baselines. Production execution needs to adapt when liquidity, signal, volatility, and fill quality change inside the order.
What the static solution leaves out
The original framework represents permanent and temporary impact with simple functions and treats price noise as exogenous. It does not know whether the spread just widened, the offer queue vanished, a passive order is likely to fill adversely, or an alpha signal is decaying.
| Missing state | Why it matters | Practical extension |
|---|---|---|
| Intraday volume curve | Liquidity is seasonal | Forecast volume and participation |
| Stochastic impact | Cost rises in stressed markets | Regime-dependent coefficients |
| Alpha/urgency | Waiting can lose information value | Signal-decay penalty |
| Book state | Immediate trading quality varies | Spread, depth, OFI features |
| Passive fills | Participation is not guaranteed | Queue and markout model |
| Constraints | Limits are operational | Hard caps and kill switches |
The goal is not to replace theory with a black box. Keep a transparent objective, but make its inputs conditional and guard decisions against model error.
A state-dependent control objective
At decision time \(t\), choose aggressive volume \(at\), passive volume \(pt\), and remaining inventory \(x_t\). A stylized one-step value function is
\[ Jt(xt,st)=\min{at,pt} E[c(at,pt;st)+J{t+1}(x{t+1},s{t+1})]
- \gamma x{t+1}^2\sigmat^2\Delta t,
\]
where \(s_t\) includes volume forecast, spread, depth, volatility, order-flow imbalance, and alpha. The passive action must include both fill probability and conditional adverse selection. This turns the control from “follow a curve” into “choose the least costly route to satisfy a completion constraint.”
def target_participation(remaining, forecast_volume, minutes_left,
base=0.08, urgency=0.0, max_rate=0.20):
required = remaining / max(forecast_volume, 1.0)
rate = base + 0.5 * urgency + 0.5 * required / max(minutes_left, 1)
return min(max_rate, max(0.0, rate))
This is deliberately a guardrail, not an optimizer. Its inputs should be point-in-time forecasts, and every override must be logged with state and reason.
Incorporate alpha and benchmark risk correctly
For a buy with decaying positive alpha, delay has an expected opportunity cost; for a sell, the sign reverses. Estimate alpha decay separately from execution impact:
\[ E[\alpha{t+h}\mid st], \]
then translate it into an urgency term. Do not infer alpha from the same realized price move used to score execution. That double counts market drift and can teach the policy to chase noise.
Arrival-price execution has especially strong benchmark risk: a schedule that reduces expected impact by waiting can look good on average but expose the client to a wide cost distribution. Use expected shortfall or completion probability alongside variance, particularly near a hard deadline.
Passive and venue decisions
Static models assume every planned share trades at its intended rate. In reality, passive orders may not fill, and fills can be toxic. Estimate expected passive value as
\[ p{\rm fill}(st)\,[\text{spread capture}+\text{rebate}-\text{markout loss}] -(1-p_{\rm fill})\,\text{fallback cost}. \]
The queue and adverse-selection terms may favor crossing in a thin, fast-moving market even if the displayed spread is wide. Conversely, a deep, stable queue can justify patient posting. Venue choice adds fee schedules, hidden-liquidity probability, and information leakage. These are empirical inputs, not constants copied from a broker rulebook.
Architecture for safe adaptation
Separate the system into a pre-trade estimator, a real-time state service, a policy, and an immutable execution ledger. The policy receives validated features and outputs bounded child orders; it must not silently recompute historical data or bypass risk limits.
| Layer | Responsibility | Essential control |
|---|---|---|
| Forecast | Volume, volatility, impact, alpha | Point-in-time versioning |
| State | Book, fills, market status | Sequence/gap detection |
| Policy | Rate, aggression, venue | Hard exposure limits |
| Router | Submit/cancel/replace | Idempotent order IDs |
| TCA | Attribute realized cost | Benchmark and clock audit |
Backtest with realistic latency, queue assumptions, rejects, partial fills, and auctions. Compare adaptive policy against a simple TWAP or VWAP baseline from execution algorithms, segmented by regime. A complex optimizer that cannot beat a robust baseline after fees is not ready.
Key takeaways
- Almgren-Chriss clarifies the impact-risk trade-off but assumes deterministic liquidity and certain execution.
- Production policies should condition impact, risk, and urgency on current market state.
- Treat passive fills as stochastic outcomes with markout risk, not as free participation.
- Enforce hard completion, participation, and exposure constraints outside the learned or optimized policy.
- Measure improvements against simple schedules using auditable, point-in-time TCA.
