AnyLearn
All lessons
Businessadvanced

Measuring Execution Honestly

Execution costs are small numbers buried in large noise, so distinguishing a good desk from a lucky one takes more data than most institutions have. This lesson covers what transaction cost analysis can establish, the reversion test that detects information leakage, and what happens to any measure once people are paid on it.

Updated · AI-authored, review-gated · how lessons are made

Not signed in: your progress and quiz score won't be saved.
Progress1 / 8

The signal is small and the noise is not

Transaction cost analysis looks like an accounting exercise and is really a statistical one, which is why so much of it is unreliable.

The quantity being measured is a cost of perhaps 10 to 30 basis points. The noise it sits in is the instrument's price movement over the execution window, which for a liquid equity over a few hours is routinely 50 to 100 basis points.

So a single order tells you essentially nothing. The realised cost is dominated by whether the price happened to move while you traded, and that is close to a coin flip.

This has a consequence people resist: you cannot evaluate an execution from its outcome. A trade that finished at a great price in a falling market and a trade that finished badly in a rising one may have been executed identically well. Judging either from the number is judging the market's behaviour, not the desk's.

Only averages over many orders carry information, and the number required is larger than intuition suggests.

Full lesson text

All 8 steps on one page, for reading, reference, and search.

Show

1. The signal is small and the noise is not

Transaction cost analysis looks like an accounting exercise and is really a statistical one, which is why so much of it is unreliable.

The quantity being measured is a cost of perhaps 10 to 30 basis points. The noise it sits in is the instrument's price movement over the execution window, which for a liquid equity over a few hours is routinely 50 to 100 basis points.

So a single order tells you essentially nothing. The realised cost is dominated by whether the price happened to move while you traded, and that is close to a coin flip.

This has a consequence people resist: you cannot evaluate an execution from its outcome. A trade that finished at a great price in a falling market and a trade that finished badly in a rising one may have been executed identically well. Judging either from the number is judging the market's behaviour, not the desk's.

Only averages over many orders carry information, and the number required is larger than intuition suggests.

2. How many orders it takes

The sample size follows from the standard error of a mean, and the arithmetic is worth doing once because the answer is uncomfortable.

import math

def orders_needed(effect_bps, noise_bps, z=1.96):
    """Orders required to detect an effect of this size at ~95% confidence."""
    return math.ceil((z * noise_bps / effect_bps) ** 2)

orders_needed(effect_bps=5, noise_bps=60)    # 554
orders_needed(effect_bps=2, noise_bps=60)    # 3458
orders_needed(effect_bps=5, noise_bps=100)   # 1537

To establish that one algorithm is 5 basis points better than another, against 60 basis points of noise, takes over 500 orders per algorithm, executed under comparable conditions.

Most institutions do not have that. A desk trading a few hundred orders a year, across instruments with different liquidity and in different market regimes, cannot resolve a 5 basis point difference at all. Its quarterly TCA report is reporting noise.

This is the same problem the lesson Selection Bias and the Deflated Sharpe Ratio treats for strategies. Comparing several brokers or algorithms and picking the best one selects on a noisy measurement, and the winner's apparent advantage is mostly the maximum of a set of random draws.

3. Normalising before comparing

Raw average cost is not comparable across orders, because the drivers of cost differ enormously between them. Comparing a desk's average this quarter to last quarter is mostly comparing the orders it happened to receive.

The standard fix is a pre-trade estimate: a model predicting what an order should cost, given its size relative to volume, the instrument's volatility, the spread and the intended horizon. Performance is then the difference between realised and predicted cost, not the realised cost itself.

That normalisation changes what is being asked. Instead of "was this cheap?" the question becomes "was this cheaper than an order like it should have been?", which is answerable and is the thing a desk actually controls.

It also creates an obvious incentive problem worth naming. If the same organisation builds the pre-trade model and is measured against it, a conservative model makes everyone look good. Serious programmes keep the estimate independent of the desk, and calibrate it on realised outcomes rather than on judgement.

A pre-trade model that is never wrong is not accurate; it is uncalibrated in the same way as a risk model with no breaches.

4. The reversion test

One measurement is unusually informative because it separates two costs that look identical in the total.

After a fill, watch the price for a defined interval. Two patterns are possible and they mean opposite things.

If the price reverts toward where it was, the move was temporary impact: liquidity was consumed and then replenished. That is a cost of demanding immediacy, and it responds to trading more slowly.

If the price continues in the direction of the trade, the move was permanent. Either the order carried information, or, more often, someone inferred the order's existence and traded ahead of the remainder.

def reversion(fills, mid_at_fill, mid_later):
    """Positive means the price came back: temporary impact.
    Negative means it kept going: leakage or genuine information."""
    signed = [(m0 - m1) if side == "buy" else (m1 - m0)
              for (side, _), m0, m1 in zip(fills, mid_at_fill, mid_later)]
    return sum(signed) / len(signed)

A desk whose fills show consistent post-fill continuation is leaking. That is actionable in a way a total cost number is not: reduce display size, randomise timing, spread across more venues.

5. Attributing the shortfall to a decision

The three components have three different owners, and reporting only the total makes it impossible to act on.

The delay component is usually organisational: how long between a decision and an order reaching a venue. It is often the easiest to reduce and the least examined, because no trading decision produced it.

The execution component is the trader's and the algorithm's, and it is the one everybody measures.

The opportunity component belongs to whoever chose the urgency, which is normally the portfolio manager rather than the desk. A high opportunity cost means orders are being worked too patiently for the signal behind them.

Splitting the number this way changes conversations. A desk defending a poor total when the loss was delay and opportunity cost is defending someone else's decision, and the fix lies outside its control.

flowchart TD
A["Total implementation shortfall"] --> B["Delay before trading began"]
A --> C["Cost on shares that traded"]
A --> D["Opportunity cost on shares that did not"]
B --> E["Owned by the decision-to-order process"]
C --> F["Owned by the trader and algorithm"]
D --> G["Owned by whoever set the urgency"]

6. What happens once people are paid on it

Any measure used to evaluate people becomes a target, and execution benchmarks are unusually easy to hit without improving anything.

Measured against VWAP, a desk can concentrate trading in the part of the window where the price moved favourably. That is a directional bet dressed as execution quality, and it will average out to nothing while looking skilful in the periods it works.

Measured against arrival price, delay before the order arrives is free. Slow routing improves the score.

Measured on filled shares only, not completing is costless. The desk rests passively, fills the easy portion, and lets the rest expire.

Measured on spread capture, never crossing is optimal, regardless of what the order needed.

Each of these is a rational response to a specified objective, which is the point. The defence is not exhortation but measurement design: use implementation shortfall against the decision price, include unfilled quantity, and report the components separately so a gain in one is visible as a loss in another.

A benchmark that cannot be improved without genuinely improving execution is the only kind worth paying on.

7. The loop that makes it useful

Measurement only pays if it changes a decision, and that requires a closed loop rather than a report.

The working version has four stages. Estimate the cost before trading, from a model. Choose the schedule and algorithm using that estimate and the signal's urgency. Execute, recording the decision price, every fill, and the prices after each fill. Compare realised to estimated, attribute the difference to components, and feed the residuals back into the model.

The fourth stage is the one usually missing. Without it, the pre-trade model never improves, and the post-trade report is an archive rather than an instrument.

There is also a limit worth being honest about. Even a well-run loop resolves large differences slowly and small ones never. A programme that concludes broker A beats broker B by 2 basis points after 200 orders has concluded nothing, and acting on it is worse than not measuring, because it converts noise into a decision with switching costs attached.

The defensible use of TCA is to find gross problems, not to rank close competitors.

8. What a report should contain

MetricAnswersWatch for
Shortfall vs decision priceThe full cost of the ideaIt is shared, not the desk's alone
Realised minus pre-trade estimateWhether this order beat its expectationA conservative model flatters everyone
Fill rateWhether orders completeLow rates hide cost as opportunity
Post-fill reversionTemporary impact against leakageConsistent continuation means detection
Delay componentTime from decision to first fillUsually the cheapest thing to fix
Sample sizeWhether any of it is significantRarely reported, and usually too small

The last row is the one to insist on. A cost report without a sample size and a confidence interval is presenting a point estimate of a noisy quantity as though it were a measurement.

The honest summary of this cursus is that execution is a real discipline with a genuine optimisation at its centre, and that its results are much harder to verify than to produce. The schedule problem has a defensible answer. The question of whether your desk implements it well takes years of data to settle.

Which argues for spending effort on the parts that do not need statistics: reducing delay, avoiding benchmarks that reward the wrong behaviour, and not leaking the order in the first place.

Check your understanding

The lesson ends with a 5-question quiz. Take it in the player above to see your score.

  1. Why can a single order's realised cost not be used to evaluate an execution?
    • Because commissions are charged monthly rather than per order
    • Because the cost is small relative to the price movement during the window, so the outcome is dominated by what the market did
    • Because the decision price is unobservable
    • Because algorithms randomise their behaviour
  2. Roughly how many orders are needed to detect a 5 basis point improvement against 60 basis points of noise?
    • About 50
    • About 150
    • More than 500
    • About 20, if they are large enough
  3. What does consistent post-fill price continuation indicate?
    • Temporary impact that would be reduced by trading slower
    • That the pre-trade model is too conservative
    • That commissions are being under-reported
    • Permanent impact: either the order carried information or its existence was inferred and traded ahead of
  4. A desk is measured only on the average price of shares it filled. What behaviour does that reward?
    • Resting passively, filling the easy portion, and letting the rest expire
    • Crossing the spread to guarantee completion
    • Trading the entire order in the closing auction
    • Routing to the venue with the highest rebate
  5. Which stage of the measurement loop is most often missing?
    • Recording the decision price
    • Choosing an algorithm
    • Producing a post-trade report
    • Feeding the residuals back into the pre-trade model

Related lessons

Business
advanced

The Schedule Problem: Impact Against Timing Risk

Trading fast costs impact. Trading slowly exposes the order to drift. Neither can be minimised without worsening the other, so the schedule is an optimisation with a parameter that encodes urgency. This lesson builds that trade-off, derives the shape of the resulting trajectory, and identifies what the model cannot see.

8 steps·~12 min
Business
advanced

Implementation Shortfall: What an Order Really Costs

The cost of a trade is not the commission, and it is not the spread. It is the gap between the return the decision would have produced on paper and the return the account actually got. This lesson builds that measure, decomposes it into four sources, and shows why the largest component is often the trade nobody made.

8 steps·~12 min
Business
advanced

Algorithms and Placement: How Each Slice Reaches the Market

A schedule says how much to trade and when. It says nothing about how each slice is sent, and that choice determines much of the realised cost. This lesson covers the standard algorithm families and what each one's benchmark actually rewards, then the placement decisions underneath: passive against aggressive, displayed against hidden, and which venue.

8 steps·~12 min
AI
advanced

Building Something That Holds Up

Given that the tradable-signal path is narrow and hard to evidence, the systems worth building are the ones the first lesson identified: extraction at scale. This lesson covers the engineering that makes them survive audit, the evaluation that does not depend on returns, and the governance obligations that apply once a model touches a regulated process.

8 steps·~12 min