Skip to content

Implementation Shortfall: Perold's Fundamental Measure of Execution Cost

What should execution cost be measured against? Perold's answer: the price at the moment of decision. The math, the component decomposition, the fundamental disagreement with VWAP, and a numerical example worked all the way through.

7 of 12 ~14 min

If you only learn one execution metric in your career, learn implementation shortfall (IS). Every other benchmark — VWAP, TWAP, close — is a proxy. IS is the real thing.

Behind that claim sits a more basic question: when you say a trade “cost” something, cost relative to what price? The choice of yardstick is not a technicality; it determines what you are actually measuring. André Perold’s 1988 answer was: the price at the moment of decision. The reason will be clear in a minute. His definition is still the standard measure of trading cost — Harris discusses it in Trading and Exchanges, Ch. 21, Berkowitz, Logue, and Noser (1988) produced the first empirical estimates, and every institutional TCA report you will ever read uses it in some form.

The Basic Idea

Suppose you decide to buy 10,000 shares of Apple at 10:00 AM, when the price is $100.00. By the time your order is fully executed — say, over the next 4 hours — the average fill price is $100.20, and the close is $100.30.

What did the trade cost you, all-in?

The naive answer: $0.20 per share, because you paid $100.20 instead of $100.00.

That’s not quite right — or rather, it’s right in a way that hides the interesting part. Even if you could have traded the whole block at 10:00 (you couldn’t; you’d have lifted the offer and paid the spread), the price would still have drifted to $100.30 by the close. Part of that $0.20 is just the market moving during your execution. Not your fault. The naive answer lumps “cost you caused” together with “market happened to move.”

Perold’s definition settles the accounting:

IS = the cost of your actual fills relative to the price at the moment of decision.

You decided at 10:00 AM at $100.00 (the decision price); your fills averaged $100.20; your IS is $0.20 per share. Note that this number deliberately includes both the spread you paid and the price movement during execution — including movement driven by market-wide news that had nothing to do with your trading. You might object: why should the market's own drift count against me? Because you identified alpha at $100.00 and ended up owning the position at $100.20. From the portfolio’s point of view, every basis point lost in between is real, whoever caused it. The decision price is the price at which the alpha was identified, which makes it the one honest benchmark — that is Perold’s insight. The average price during execution, or the day’s VWAP, each hide part of the bill.

Of course, “how much was lost in total” and “who lost it” are two different questions. IS pins down the total first, then does the attribution.

Taking IS Apart

Total IS decomposes into four components. First, spread cost: the difference between your fill price and the midprice at the moment of the fill — what you paid the dealer for immediacy. Second, market impact cost: the part of the midprice’s move away from the decision-time midprice that your own trading caused. Third, timing cost (also called alpha decay cost): the part of the drift between decision price and execution-period midprices that was not your doing — the market walking on its own. Fourth, opportunity cost: the cost of not finishing. You meant to buy 10,000 and filled 8,000; the missing 2,000 have their own bill, settled separately below.

The first three cover the executed portion. For a fully completed buy, with PdP_d the decision price, Pfill,iP_{\text{fill},i} the fill prices, MtiM_{t_i} the midprice at each fill, and qiq_i the size of fill ii, per-share IS is:

IS=∑iqi(Pfill,i−Mti)⏟spread + impact+∑iqi(Mti−Pd)⏟timing (incl. impact drift)∑iqi\text{IS} = \frac{\underbrace{\sum_i q_i (P_{\text{fill},i} - M_{t_i})}_{\text{spread + impact}} + \underbrace{\sum_i q_i (M_{t_i} - P_d)}_{\text{timing (incl. impact drift)}}}{\sum_i q_i}

(This equation is often written with the normalization dropped; both sums need to be divided by total filled quantity or the units don’t match.) The first bracket captures how far your fills sat above the mid; the second captures how far the mid drifted from the decision price — a mixture of market drift and your own impact, and separating those two requires an impact model, as the worked example below makes concrete. For a sell, all signs flip.

Decision Price, Arrival Price, Order Price

We keep saying “the moment of decision” — but when did the decision actually happen? There are three candidates, routinely conflated in practice.

The decision price (PdP_d) is the price when the portfolio manager decided to buy or sell — the “true” benchmark, the price at which alpha was identified. The arrival price (PaP_a) is the price when the order reached the trading desk; communication latency can make it differ. The order price (PoP_o) is the price when the parent order was placed with the broker.

For a long-only fund that decides at 9:30 AM with the order reaching the trader at 9:35 AM, PdP_d is the 9:30 price and PaP_a the 9:35 price. If the volatile open moved the price 5 bps in those five minutes, that is 5 bps of cost the trader could not possibly avoid — but the fund still paid it, so it belongs in IS.

In practice most TCA reports use the arrival price as the benchmark, for a mundane reason: decision-time data is hard to capture. The implicit assumption is decision price ≈ arrival price. For slow fundamental strategies that roughly holds; for fast-moving strategies it systematically understates cost. When reading a TCA report, asking which price it anchors to matters more than the numbers themselves. Relatedly: anchoring to the wrong decision moment is the single most common IS mistake — benchmark to when the decision was actually made, not to when someone remembers making it.

What the Numbers Look Like

A typical IS report for a US large-cap: decision price $100.00, average fill $100.18, total IS $0.18 per share, i.e. 18 bps. Decomposed: spread cost 1 bp (you paid the half-spread on average), market impact 8 bps (your trades moved the price), timing cost 9 bps (the price drifted while you worked the order).

Pause on those numbers. Your “true” cost is 18 bps even though the spread was only 1 bp. Anyone judging execution quality by spread alone is underestimating cost by an order of magnitude. And the largest single component (9 bps) is market drift — you can’t control its direction, but you can control how long you stay exposed to it.

For a smaller, less liquid name the same decomposition might read: spread 5 bps, impact 30 bps, timing 15 bps, 50 bps all-in. On a $1M trade, 50 bps is $5,000. Substantial.

IS vs VWAP: Where They Disagree

VWAP is the most common alternative to IS, so it deserves a head-to-head. IS measures cost against the decision price; VWAP measures cost against the day’s volume-weighted average price. These are not measurements of the same thing:

AspectISVWAP
BenchmarkDecision priceDay’s VWAP
What it measuresCost of the tradeCost vs average participant
Can algo game it?No (benchmark fixed)Yes (herd with others)
Best forAlpha-driven tradesPassive flow
Standard forHedge fundsLong-only funds

The load-bearing row is “can it be gamed.” The VWAP benchmark is jointly produced by everyone’s trading that day, yours included; a VWAP algo can “beat VWAP” simply by moving with the herd, which says nothing about whether you saved money. A concrete trap: suppose you buy over the day at VWAP − 5 bps. The day opens at $100, trades in a $99–$101 range, closes at $101.50. Your average fill is, say, $100.20; the decision price was $100.00 at the open. IS is 20 bps. You “beat VWAP” by 5 bps and lost 20 bps to IS at the same time.

No mystery about why: you failed to capture the day’s price appreciation. You traded at average prices instead of front-loading. A pure IS perspective says you should have bought at or near $100.00, accepted higher impact, and captured the alpha of the move to $101.50. The VWAP lens is completely blind to this — which is exactly why alpha-driven trading should not be scored against VWAP.

Perold’s Original Framework

Back to the 1988 formulation. Perold framed IS as a ledger of paper against reality:

IS=Paper return−Actual return\text{IS} = \text{Paper return} - \text{Actual return}

The paper return is what your portfolio would have earned if you could trade instantly at decision prices with no cost; the actual return is what it really earned, all execution and opportunity costs included. Whatever paper exceeds reality by is your IS loss. The virtue of this framing is that it is complete by construction: every form of execution friction — spread and impact on the executed portion, delay between decision and first fill, moves missed on the unexecuted portion — lands automatically in the gap between paper and actual. Nothing can hide. Perold used the framework to show that for high-turnover active managers, IS can compound to several percent of portfolio return per year — the exact figure varies with turnover and market conditions, but the magnitude is enough to consume many strategies’ paper alpha. Low-turnover long-only mutual funds pay far less.

The Modern Computation: One Formula Plus an Opportunity Charge

The standard formula in modern TCA operationalizes Perold directly:

IS=Pavg fill−PdecisionPdecision⋅sign\text{IS} = \frac{P_{\text{avg fill}} - P_{\text{decision}}}{P_{\text{decision}}} \cdot \text{sign}

with sign +1 for buys and −1 for sells. Under this convention IS > 0 always means cost: paying more than the decision price on a buy, receiving less on a sell. Pick a sign convention and never switch — mixed conventions across buys and sells are the second most common TCA reporting error.

Multiply by parent-order size for dollar IS:

IS$=Q⋅Pavg fill−PdPd⋅sign\text{IS}_{\$} = Q \cdot \frac{P_{\text{avg fill}} - P_d}{P_d} \cdot \text{sign}

For partial fills, weight by filled quantity. But computing IS on the filled portion alone is not enough — the unfilled remainder keeps its own account. You decided to buy 10,000 shares and got 8,000, perhaps because the price ran away; the missing 2,000 carry an opportunity cost of:

Opportunity cost=Qmissed⋅(Pclose−Pd)/Pd⋅sign\text{Opportunity cost} = Q_{\text{missed}} \cdot (P_{\text{close}} - P_d) / P_d \cdot \text{sign}

For a buy with the price running up, opportunity cost is positive — you lost the move. For a sell with the price running down, likewise positive. Work one through: you bought 8,000 at an average of $100.20 and book the missed 2,000 at the $100.50 close. Executed: 8,000 × (100.20−100.20 − 100.00) = $1,600. Missed: 2,000 × ($100.50 − 100.00)=100.00) = 1,000. Total IS: $2,600 — which is 26 bps on the full 10,000 shares. The 20% of shares you missed contributed nearly 40% of the total cost.

That arithmetic explains the central tension in execution: trade aggressively and you pay impact but keep opportunity cost low; trade passively and you save impact but bleed opportunity cost. A strategy that fills 50% of its orders looks great if you only score the filled half — the opportunity cost is simply hidden. Hence the rule: always compute IS on the full parent order, unfilled portion included. For how to solve the trade-off optimally, Almgren-Chriss (article 9) is the formal framework.

A Numerical Example, Worked All the Way Through

Suppose you decide at 10:00 AM to buy 50,000 shares of MSFT at $410.00. Your algo executes over 90 minutes:

TimeSharesFill PriceMid at Fill
10:055,000$410.10$410.08
10:155,000$410.15$410.12
10:3010,000$410.20$410.18
10:5015,000$410.35$410.32
11:0015,000$410.50$410.48

The volume-weighted average fill is $410.32. Total IS falls out immediately: ($410.32 − 410.00)/410.00) / 410.00 = +7.8 bps.

Now decompose along the formula above. Spread cost is the volume-weighted average of (fill − mid): (0.02×5,000 + 0.03×5,000 + 0.02×10,000 + 0.03×15,000 + 0.02×15,000) / 50,000 = $0.024 per share, which over $410 is about 0.6 bps. The rest is midprice drift: the volume-weighted average mid is about $410.296, which sits $0.296 above the $410.00 decision price — about 7.2 bps. The pieces sum: 0.6 + 7.2 = 7.8 bps, matching the total exactly. They must — the decomposition is just the same price difference sliced a different way.

The hard step comes last. Of those 7.2 bps of drift, how much was your own impact and how much was the market going where it was going anyway? You cannot read that off the fill record — it requires comparing the realized price path to the path you would have observed without your trading. In a backtest the counterfactual path is available by construction; in production you need an impact model. If the model says impact was 4 bps, then timing cost is the remaining 3.2 bps. Spread and the total are hard numbers; the boundary between impact and timing is model-supplied. Keep that distinction in mind whenever you read a TCA report.

IS Looks Completely Different Across Strategies

StrategyTypical IS (bps)Notes
High-frequency market-making1–5Reversing positions quickly
Equity stat arb5–15Fast, alpha-rich signals
Long-short equity15–30Slower signals, larger orders
Long-only fundamental30–100Less urgency, larger sizes
Pension rebalancing50–200Massive size, low urgency
Index inclusion/rebalance100–500Forced trades, very large size

The table hides a pattern that looks backwards at first: stronger alpha signals come with lower IS. The reason is that traders with strong signals genuinely care about every basis point — they willingly pay more impact for faster fills because the alpha visibly exceeds the cost. A hedge fund with strong signals might run IS of 10 bps, 8 of which is impact paid on purpose. A pension fund with weak or no signals does the opposite: it trades slowly to save impact, eats the opportunity cost in full, and lands at 50 bps and up.

Which also means IS numbers must never be compared across strategies. 30 bps is a disaster for a high-frequency book and a good outcome for a long-only one. Likewise, IS runs naturally higher in volatile regimes, so cross-period comparisons should be normalized by volatility. IS is a within-strategy, like-for-like measure.

The IS Frontier

The fast-versus-slow trade-off that keeps reappearing can be drawn as a frontier, in the same spirit as the Almgren-Chriss mean-variance frontier. For a given parent order, varying execution speed traces a curve in the (expected IS, variance of IS) plane: fast execution (say, 30 minutes) sits at the high-impact, low-variance, low-opportunity-cost end; slow execution (say, the full day) at the low-impact, high-variance, high-opportunity-cost end. The frontier is convex, and you pick your point on it according to your alpha strength and risk tolerance. Harris Ch. 21 has the conceptual diagram; Almgren-Chriss (article 9) is the formal treatment.

The Implementation in Arithmion

arithmion.tca.ImplementationShortfall computes total IS (in bps and dollars), the component decomposition (spread, impact, timing, opportunity), per-fill attribution, comparisons against VWAP/TWAP/close benchmarks, and slippage analysis. Sample report:

Implementation Shortfall Report
═══════════════════════════════════════════
Order:           BUY 100,000 AAPL
Decision time:   2025-06-15 09:30:00
Decision price:  $182.45
Filled:          100,000 shares
Avg fill price:  $182.78
Total IS:        +18 bps  ($33,000)

Component breakdown:
  Spread cost:        +2 bps
  Market impact:     +10 bps
  Timing cost:        +6 bps
  Opportunity cost:   0 bps

Benchmark comparison:
  vs Arrival:    +18 bps
  vs VWAP:       +11 bps
  vs Close:      -8 bps (you beat the close by 8 bps)

Arithmion can also generate period aggregates (daily, monthly, and so on) for performance review. If you are backtesting an execution algo in Arithmion, IS is the primary metric: track mean IS per parent order, its standard deviation, the component breakdown, slices by regime (volatility, time of day), and the comparison to the Almgren-Chriss optimum. That last one is a useful sanity check: if your backtested IS comes out significantly better than the Almgren-Chriss theoretical optimum, your model is wrong — either the assumptions are unrealistic or you are using information that would not have been available in real time.

When IS Is the Wrong Yardstick

IS rests on the premise that there was an alpha price at a moment of decision. Where that premise fails, IS fails with it. Passive index funds rebalance without alpha decisions; their IS is high but unavoidable, and tracking error versus the index is the better measure. For multi-day horizons, opportunity cost dominates everything and the decomposition has to change. For blocks and RFQ trades done against dealer quotes, a “decision price” simply doesn’t exist — benchmark against the quote you received. Outside those cases, for most active strategies executing intraday, IS is the right metric.

Perold’s paper is titled “Paper Versus Reality,” and those three words carry the whole subject: your backtest and your model portfolio are paper; IS is the width of the gap between paper and what actually happened. Harris Ch. 21 places it within the broader framework of liquidity measurement, Berkowitz-Logue-Noser (1988) first measured the width of that gap on NYSE data, and Kissell-Glantz-Malamut (2003) connected it to the engineering of optimal execution. Read on to Almgren-Chriss (article 9) for how to make the gap narrower.

References

  • Harris, L. Trading and Exchanges: Market Microstructure for Practitioners. Oxford University Press, 2003. Ch. 21 (liquidity and transaction-cost measurement). ISBN: 978-0-19-514470-3.
  • Perold, A. “The Implementation Shortfall: Paper Versus Reality.” Journal of Portfolio Management, 1988.
  • Berkowitz, S., Logue, D., Noser, J. “The Total Cost of Transactions on the NYSE.” Journal of Finance, 1988.
  • Kissell, R., Glantz, M., Malamut, R. “A Practical Framework for Estimating Transaction Costs and Developing Optimal Trading Portfolios.” Journal of Trading, 2003.