Almgren-Chriss Optimal Execution: The Mean-Variance Framework for Trading Trajectories
Trade fast and pay impact, or trade slow and carry risk — Almgren-Chriss (2000) turns that trade-off into a solvable mean-variance problem. The full derivation, a numerical example worked to the end, and where the model breaks.
Suppose you have to sell 1,000,000 shares of Apple over the next 4 hours. Sell fast, and your own orders hammer the price — impact cost eats you. Sell slow, and you sit on a large inventory exposed to every tick of volatility — one bad headline and you take a bath. Somewhere between the two extremes there is an optimal trajectory. What does it look like?
This is the Almgren-Chriss problem (Almgren and Chriss, 2000). It’s the workhorse model of institutional execution, and Harris devotes space to it (Harris, Trading and Exchanges, Ch. 19). The basic version assumes linear temporary and permanent impact, and the answer turns out to be a smooth curve between “trade everything immediately” and “spread uniformly” — with the entire trade-off compressed into one dimensionless number. The derivation follows.
The Setup
You have a parent order of size shares to execute over horizon . Let be the number of shares remaining at time , with and . The trading rate is , the number of shares sold per unit time.
Before we can price the trajectory, we need to say how your trading moves the price. Almgren-Chriss split the impact in two. The first piece goes into the midprice and stays there:
Specifically:
where is the permanent impact coefficient, is the time step, and is a standard normal shock. The more you have sold, the lower the midprice sits — permanently.
The second piece bites only at the moment you trade: your execution price is worse than the mid by
where is the temporary impact coefficient — the surcharge for demanding liquidity right now. Stop trading and it vanishes. This permanent/temporary split is the foundation of the whole model; we’ll see shortly that it single-handedly determines the direction of the optimization.
With prices in hand, revenue is just the sum over fills:
What we care about is the shortfall relative to a no-impact benchmark:
The random terms have zero mean, so in expectation two clean pieces remain:
The first term is the temporary impact cost — note it is a sum of squared rates, so the same quantity traded faster is punished harder. The second is the permanent impact cost — it depends only on total size , not on how you schedule the trades. That difference is about to matter.
Cost has a second dimension. The random walk in means every share you haven’t yet sold is carrying price risk:
where is the remaining inventory. The larger and longer-held the inventory, the bigger the variance. At this point the fast/slow tension is fully written down in math: punishes speed, punishes slowness.
The Optimization
Almgren-Chriss fold the two dimensions into one mean-variance objective:
where is the risk-aversion parameter: higher fears variance, lower cares about expected cost. Substituting:
subject to (you must execute everything) and .
Here the permanent-impact term does us a favor: is a constant given , independent of the trajectory, so we drop it. Read that again, because it’s a real insight: permanent impact is paid the moment you decide to trade the size; no scheduling cleverness can touch it. All the optimization can manage is the balance between temporary impact and risk. The problem reduces to:
subject to .
The Discrete-Time Solution
The cleanest route is to work in the inventory variables (with ; the endpoints , absorb the constraint automatically). The objective becomes:
Each interior appears in exactly three places: , , and its own variance term. Differentiate with respect to and set to zero:
Rearranged:
The left side is a discrete second derivative. The equation says the optimal inventory curve must bend, everywhere, in proportion to the inventory still held — the more you’re carrying, the harder you should be accelerating out of it. Linear difference equations of this type have solutions built from ; imposing the two boundary conditions gives:
where is pinned down by:
The per-period trade sizes follow:
This is the standard Almgren-Chriss discrete solution. Notice that every parameter — risk aversion , volatility , temporary impact — enters the answer only through the single combination . That is not a coincidence; it is the entire next section.
The Continuous-Time Limit
As the formulas get cleaner. Inventory and rate:
with . Boundary conditions check on sight: and . Inventory declines smoothly from to 0, and the curve is convex — front-loaded — whenever .
When , and the trajectory degenerates into pure exponential decay, giving the commonly used approximation:
(An approximation for large , not the exact solution — exactly, .) Both limits behave: for small , — uniform trading; for large , , which can dwarf ; and for very large (extreme risk aversion), — execute everything immediately, the market-order limit.
Three Regimes
So the whole problem compresses into one dimensionless number, , and it referees the fast/slow dispute.
Low (low risk aversion, low volatility, expensive temporary impact): , near-uniform. You’re not afraid to hold inventory, so you sell slowly and save impact; the cost is almost entirely temporary impact.
High (high risk aversion, high volatility, cheap temporary impact): strongly front-loaded, most of the volume goes out at the start. You are deliberately overpaying temporary impact — under a squared penalty, speed is expensive — in exchange for collapsing inventory risk quickly. This is buying certainty with cash.
Intermediate : a smooth curve between the two. Institutional execution lives here most of the time. The boundary between regimes sits roughly around .
A Worked Numerical Example
Let’s push numbers through — and step on a trap almost everyone steps on, deliberately.
You’re selling shares, hours = 14400 seconds, seconds (1-minute bars). Daily vol , temporary impact (per share per second), permanent impact (per share), risk aversion .
The trap is units. Feed the daily vol 0.02 straight into the formula:
and you get — an absurdly extreme front-load, effectively “liquidate in half a minute.” The error: is in seconds while is daily. Variance scales linearly in time: per-second variance is (a 6.5-hour trading day), so per-second and per-second variance is .
Redo it with consistent units: ; divided by , , so per second. Hence — the intermediate regime, gently front-loaded. Same parameters, one unit slip, and the conclusion flips from “work it calmly over 4 hours” to “dump it in 30 seconds.” Checking that , , and share consistent units is the first sanity check whenever you use this model.
Plug into the exact solution for the endpoint rates (, ):
Initial rate: shares/sec. The uniform rate would be shares/sec, so you start at roughly 2× uniform. End rate: shares/sec, about 0.6× uniform. The trajectory glides from 136 down to 41 shares/sec.
Here’s a check that appears to fail: averaging the endpoints, shares/sec, times 14400 seconds gives shares — almost 30% more than . That’s correct, and it does not mean the math is wrong: is convex, so averaging the endpoints systematically overestimates the area under the curve. The exact trajectory integrates to by construction, and the true average rate is exactly 69 shares/sec.
Expected Cost
Expected cost returns to the two pieces:
For our example, estimate the temporary term with an RMS rate of about 80 shares/sec: , times gives about dollars. The permanent term: dollars.
Three orders of magnitude apart — this order’s cost is almost all permanent impact. On a 1M-share sale of a $100 stock ($100M notional), 92 of temporary impact and the following variance.
Variance of cost: . With averaging around shares over the horizon, ; times the per-second variance , that’s a variance of (dollars squared), i.e. a standard deviation of dollars. So the execution’s cost swings about (one sigma) around its expectation. The ratio of expected cost to its standard deviation is — the balance point the mean-variance objective settles at for .
The Risk-Adjusted Frontier
Sweep across its range and the optimal trajectories trace out a frontier. is pure cost minimization: spread the trades over as long a horizon as possible, minimize temporary impact, let the variance fall where it may. is pure variance minimization: execute immediately, market order, swallow the impact. Intermediate interpolates smoothly. The frontier is convex: each increment of buys a variance reduction (you finish faster) at the price of higher expected cost (you pay more impact) — the same geometry as the efficient frontier in portfolio theory. Harris Ch. 19 has the visual; Hasbrouck (2007) has the formal treatment.
Python Implementation
A simple Almgren-Chriss simulator:
import numpy as np
def almgren_chriss_trajectory(Q, T, sigma, eta, lam, n_periods=100):
"""
Compute optimal Almgren-Chriss trajectory.
Q: total shares to execute
T: horizon (seconds)
sigma: per-second volatility (decimal)
eta: temporary impact coefficient
lam: risk aversion
Returns: arrays of (t, inventory x(t), rate v(t))
"""
tau = T / n_periods
kappa = np.sqrt(lam * sigma**2 / eta)
t = np.linspace(0, T, n_periods + 1)
x = Q * np.sinh(kappa * (T - t)) / np.sinh(kappa * T)
v = -np.diff(x) / tau # trading rate per period
return t, x, v
# Example: 1M shares over 4 hours
t, x, v = almgren_chriss_trajectory(
Q=1_000_000, T=14400, sigma=1.3e-4, eta=1e-6, lam=1e-6, n_periods=240
)
print(f"Initial rate: {v[0]:.1f} shares/sec")
print(f"Final rate: {v[-1]:.1f} shares/sec")
print(f"Avg rate: {v.mean():.1f} shares/sec (target: {1e6/14400:.1f})")
For reasonable parameters, the initial rate lands around twice the average and the final rate below it — the same front-loaded curve we computed by hand. Note that sigma takes per-second volatility: the units trap lives in code, too.
Permanent vs Temporary: Why the Split Is the Contribution
Back to the model’s foundation. Almgren-Chriss’s real contribution is not the sinh curve — it’s splitting impact into two types and spelling out what each implies. Permanent impact (): the price moves because of your trade and stays moved; stop trading and it does not come back. This is the “information” component — the same object as Kyle’s lambda. Temporary impact (): the price is pushed down while you trade and rebounds when you stop. This is the “liquidity” component, the transient cost of demanding immediacy.
Empirically the two look very different. Permanent impact is small but persistent — on liquid US equities, single-digit basis points or below, varying with liquidity and size. Temporary impact is larger but reverts: several to a dozen-odd basis points while you trade, mostly dissipating within minutes. Treat these as orders of magnitude, not constants — they drift with market conditions themselves.
The split directly determines the optimization. If impact were purely permanent, the schedule wouldn’t matter (only total size does) and you’d simply trade slowly to avoid extra friction. If purely temporary, the squared penalty says uniform trading is optimal. Only the mixture makes Almgren-Chriss non-trivial. Harris Ch. 13 discusses the same distinction in the dealer context; Hasbrouck’s information share (article 5) measures precisely the permanent component.
One common misconception, corrected in passing: “all impact eventually reverts.” No. Empirically, the price impact of a metaorder (a large institutional trade) is roughly half permanent, half temporary: the permanent half is information reaching the price, the temporary half is the liquidity toll. Also note that Almgren-Chriss models both as linear while real impact is concave (the square-root law, article 8) — so the model’s should be read as the average permanent impact per unit traded, not the marginal.
Where the Model Breaks
That linearity assumption is the biggest of five failure points. Real impact is concave, so the linear model overestimates the marginal impact of large orders — the larger the order, the worse the overestimate. Second, the model assumes you have no alpha, that you’re a purely passive executor; if you hold private information, the optimal trajectory should be more front-loaded, grabbing the position before the alpha decays (Almgren 2003 is exactly the extension that adds drift). Third, , , are treated as constants; in reality all three drift with market conditions. Fourth, the model assumes your orders always fill — in reality limit orders can sit in the queue and miss (article 1). Fifth, no cross-impact: a large equity trade moves correlated ETFs, options, and futures, and the model is blind to all of it.
So the institutional recipe is: Almgren-Chriss as the skeleton, with real execution algos patching each of these five gaps. The extension literature grew along exactly these seams: Almgren (2003) adds alpha and nonlinear impact; Almgren, Thum, Hauptmann, and Li (2005) estimate the impact parameters from real market data; Huberman and Stanzl (2004) prove that permanent impact must be linear or price-manipulation quasi-arbitrage appears — an unexpected defense of the linearity assumption; Predoiu, Shaikhet, and Shreve (2011) re-solve optimal execution for general limit-order-book shapes; Cartea, Jaimungal, and Penalva (2015) give the modern textbook-chapter treatment. For practitioners, the base model plus calibration goes a long way; the extensions are for theorists and very-large-order desks.
There’s also an implementation-level choice: the discrete version carries explicitly; the continuous version is the limit. Continuous formulas are clean and good for intuition, but your actual trading intervals are discrete (every minute, every 5 minutes), so the discrete version is the more honest one. Implement discrete, think continuous.
How Arithmion Implements This
arithmion.execution.AlmgrenChriss provides closed-form continuous and discrete trajectories, calibration of from execution data, mean-variance frontier visualization, and a multi-asset extension with a cross-impact matrix. It’s the workhorse of Arithmion’s execution simulator, and most institutional execution algos run some variant of it internally.
The most consequential number in the calibration is . It has no “correct” value, only a value that matches your situation. A mandate with a long horizon and tolerance for swings argues for low ; decaying alpha also argues for low — trade faster and capture it; fear of a downturn and a need to cut exposure argues for high . Desk risk budgets press in too: a team coming off a drawdown will typically raise , paying up in execution cost for a tighter distribution of outcomes. In practice is set by the desk’s mandate and recalibrated periodically; Arithmion’s AdaptiveAlmgrenChriss adjusts it in real time from volatility and inventory levels.
The whole model in one sentence: permanent impact was paid the moment you decided to trade the size; everything else is using the single dial to choose where you stand between temporary impact and inventory risk.
References
- Harris, L. Trading and Exchanges: Market Microstructure for Practitioners. Oxford University Press, 2003. Ch. 13 (dealers), Ch. 19 (liquidity). ISBN: 978-0-19-514470-3.
- Almgren, R., Chriss, N. “Optimal Execution of Portfolio Transactions.” Journal of Risk, 3(2), 2000. (Working paper version, 1999.)
- Almgren, R. “Optimal Execution with Nonlinear Impact Functions and Trading-Enhanced Risk.” Applied Mathematical Finance, 10(1), 2003.
- Almgren, R., Thum, C., Hauptmann, E., Li, H. “Direct Estimation of Equity Market Impact.” Risk, 2005.
- Cartea, A., Jaimungal, S., Penalva, J. Algorithmic and High-Frequency Trading. Cambridge University Press, 2015.
- Hasbrouck, J. Empirical Market Microstructure. Oxford University Press, 2007. ISBN: 978-0-19-518115-9 (hardcover) / 978-0-19-539320-0 (paperback).