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 stateWhy it mattersPractical extension
Intraday volume curveLiquidity is seasonalForecast volume and participation
Stochastic impactCost rises in stressed marketsRegime-dependent coefficients
Alpha/urgencyWaiting can lose information valueSignal-decay penalty
Book stateImmediate trading quality variesSpread, depth, OFI features
Passive fillsParticipation is not guaranteedQueue and markout model
ConstraintsLimits are operationalHard 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.

LayerResponsibilityEssential control
ForecastVolume, volatility, impact, alphaPoint-in-time versioning
StateBook, fills, market statusSequence/gap detection
PolicyRate, aggression, venueHard exposure limits
RouterSubmit/cancel/replaceIdempotent order IDs
TCAAttribute realized costBenchmark 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.
#optimal execution #Almgren Chriss #market impact #execution #Python