Skip to content

Transaction Cost Analysis: Knowing What You Actually Paid

Price is not cost. TCA is the accounting that strips luck out of execution: budget before, steer during, audit after — three checkpoints on one ledger.

12 of 12 ~13 min

Most traders think they know what they paid to execute. They’re wrong.

You sent a buy order for 50,000 shares. The market was at $100.00 when you decided to buy; you got filled at $100.07. Seven cents of slippage, right? No — that’s only the visible cost. The real ledger also carries the spread you crossed, the impact your order had on the book, and the opportunity cost of the shares you never got because you were too slow. Transaction cost analysis (TCA) is the discipline of measuring all of it and attributing each piece to its cause. Its value is the difference between two states: believing your broker is doing a great job, and discovering that 40% of your costs are leaking out somewhere else entirely.

Harris, in Trading and Exchanges (2003, Ch. 19-24), makes the point every execution trader eventually learns the hard way: price is not cost. The price you see is a function of when you look. Cost only exists relative to a counterfactual — the price at the moment you decided, the average price over the working interval, or some other yardstick that strips out luck. That sentence is this article’s through-line. TCA’s three checkpoints, its four cost components, every benchmark and every pitfall — all of them are different faces of the one question: how do you strip the luck out? By the end, you should be able to pick up a TCA report and tell whether the numbers are speaking the truth or being gamed.

One Ledger, Three Checkpoints

TCA happens at three points in an order’s life, answering three different questions. Pre-trade TCA runs before you send the order, estimating what the execution will cost given the stock, the size, the volatility, and the venue mix — the budgeting step, answering “should I do this?” Real-time (intraday) TCA runs while the order is alive, telling you whether it’s tracking its benchmark and whether to lean on the gas or back off — answering “should I keep doing this?” Post-trade TCA runs after completion, attributing realized cost to spread, impact, timing, and opportunity, and feeding the answer back into the next budget — answering “did I do this well?”

Most shops only do the post-trade piece well. The execution trader who only reads last week’s report is steering with the rearview mirror. The ones who also budget properly are the ones who don’t get fired when a senior PM asks why the desk missed by 20 bps.

Cost Splits Into Four Pieces

This is where most TCA reports go wrong: they conflate components, or measure them badly. Start with the total. You decide to buy at time t0t_0 when the mid is P0P_0, and complete the order at average price Pˉ\bar{P} over [t0,t1][t_0, t_1]:

Cost=Pˉ−P0\text{Cost} = \bar{P} - P_0

That’s the simple version; the interesting part is the decomposition. Perold (1988) introduced the right framework in his implementation shortfall paper: split the cost into the pieces the trader can control and the pieces they can’t. Take the four components in turn.

Spread Cost

Cross the bid-ask spread to take liquidity and you pay the half-spread immediately. If the stock is quoted 100.00/100.00 / 100.02 and you buy at the offer, that 1 cent went to the market maker:

Spread cost=Ask−Bid2\text{Spread cost} = \frac{\text{Ask} - \text{Bid}}{2}

For a market order it’s unavoidable. For a limit order filled passively, you earn the spread instead (sell at the ask, buy at the bid) — at the price of taking on timing risk. Strictly speaking, spread cost isn’t a “cost” in the economic sense; it’s a transfer payment to whoever provided immediacy. But for measuring execution you still separate it from impact, because it characterizes your algo’s style: an algo that takes liquidity aggressively pays it every time, an algo that posts passively collects it.

One measurement detail: Harris (2003, Ch. 14) notes that for liquid US large-caps the quoted spread often looks artificially tight, while the effective spread — your actual transaction price versus the mid at the moment of the trade — is wider, especially in fast markets. Use effective spread in your TCA, not quoted.

Market Impact

The cost your order imposes on the price by existing. Hit the offer with a 50,000-share buy and the offer lifts; the next one sits 5 cents higher. Those 5 cents — the price move caused by your order — are impact.

The workhorse in practice is the square-root impact model, an empirical regularity with theoretical support:

I=σQV⋅ηI = \sigma \sqrt{\frac{Q}{V}} \cdot \eta

where σ\sigma is daily volatility, QQ is order size, VV is the day’s volume, and η\eta is a scaling constant (typically fit between 0.1 and 0.5 for liquid names). It says impact grows with size at a decreasing rate, which is what the data shows.

Impact takes one more cut: temporary impact decays within minutes to hours; permanent impact is a level shift that doesn’t revert — the decomposition at the heart of the Almgren and Chriss (2000) line of work. Empirical studies generally find the temporary piece is the larger one, but the exact ratio moves around with the stock, the day, and the measurement method — don’t treat any fixed percentage as gospel. The cut matters for attribution: if your fill is 8 cents worse than arrival but 5 of those cents are temporary impact that decays by the close, your paper cost is 8 cents while your economic cost may be 3. Most traders ignore the distinction and overpay attention to short-term impact noise.

Timing Cost (Delay Cost)

The price drift between deciding to trade and starting to trade. Decision at 10:00 with the stock at $100.00; first child order at 10:15 with the stock at $100.10 — that’s 10 cents of timing cost before a single share traded. Once the order is live, this piece is out of the trader’s hands; it’s the market’s verdict on waiting. But the decision to wait was the trader’s, and that’s exactly where post-trade TCA earns its keep. Perold (1988) calls this the “opportunity cost of waiting” and books it as its own line item. A good report tells you, per minute of delay, how much the market moved against you.

Opportunity Cost

The shares you didn’t trade. Tasked with 50,000, you bought 30,000 before the price ran away; the missing 20,000 carry the opportunity cost — the price move on shares you never got. It’s the trickiest component because it needs a counterfactual: the standard approach assumes you’d have filled at the VWAP over the remainder of the horizon. If the unfilled period’s VWAP is $100.50 against your $100.07 fill price, you “saved” 43 cents per unfilled share by not chasing — but you also don’t have the position, and net of strategy alpha that’s a loss.

Opportunity cost hurts most in fast markets. A one-hour buy order that misses 20% of its target in a stock up 5% on good news will show up with a glaring opportunity-cost line, and a senior PM will want to know why you didn’t just finish the order.

Pre-Trade TCA: The Budget

With the four components in hand, budgeting means estimating them before the order goes out. Take a stock with average daily volume VV, daily volatility σ\sigma, and spread ss; an order of size QQ to complete in time TT:

C^(Q,T)=s2+ησQV+λσTTday\hat{C}(Q, T) = \frac{s}{2} + \eta \sigma \sqrt{\frac{Q}{V}} + \lambda \sigma \sqrt{\frac{T}{T_{\text{day}}}}

Spread, impact, and timing/volatility risk — the cost of market exposure over the working horizon. That’s the estimate for a passive execution; go more aggressive (shorter horizon, higher participation) and the impact term rises while the timing term falls. Optimal execution theory, Almgren-Chriss included, is the search for the schedule minimizing the expected sum of those two.

In practice, pre-trade models are calibrated on the firm’s own history: feed in ten thousand past executions and fit η\eta and λ\lambda by least squares against realized cost. Most shops have something like this sitting on a server; few traders use it. The ones who do have a real edge — when the PM asks “I want to buy $5M of XYZ, what will it cost?”, the trader answers in seconds, with a confidence interval, and the PM can decide on the spot whether the cost is worth the alpha.

Real-Time TCA: The Steering Wheel

While the order works, real-time TCA holds it against a benchmark — most commonly interval VWAP, the average traded price over the parent order’s working interval so far. Thirty minutes in and tracking 2 bps behind interval VWAP: fine. Thirty minutes in and 12 bps behind: something’s wrong — the algo is too aggressive, the stock is trending against you, or liquidity dried up.

The reading has to turn into action. Modern execution algos have knobs — participation cap, aggression level, dark-vs-lit mix — and real-time TCA tells you which to turn:

def should_speed_up(realized_bps, vwap_bps, threshold=5):
    """Decide whether to increase participation rate."""
    slippage = realized_bps - vwap_bps
    if slippage > threshold:
        return True   # we're lagging, push harder
    return False

A toy — real implementations factor in volatility, time remaining, and the unfilled size. But that’s the point: real-time TCA gives you a number, and you need a rule that turns the number into an action.

The danger is overfitting. Adjust the algo every 30 seconds off short-window benchmarks and you’ll chase noise and make things worse. Experienced traders set the algo in the morning, glance twice an hour, and intervene only on structural change — a news event, a liquidity drop, a price gap.

Post-Trade TCA: The Audit

The next morning, post-trade TCA delivers the verdict: for every order worked yesterday, the cost against every benchmark the shop cares about. The standard decomposition:

ComponentDefinitionExample value
Spread costHalf-spread at time of fill+1.2 bps
Impact costPrice move attributable to order+3.4 bps
Timing costPrice drift during the order-0.8 bps
Opportunity costCost of unfilled portion+0.5 bps
TotalSum of components+4.3 bps

In an honest report the components sum to the realized shortfall against arrival. When they don’t, somebody is double-counting or hiding something. Harris (2003, Ch. 21) insists the buy-side reconcile its TCA against the broker’s at least quarterly — brokers have an incentive to compute costs in ways that flatter their algos, the buy-side has an incentive to compute them in ways that flatter their PMs, and the truth lives in between.

The benchmark itself has to be chosen deliberately. The big four each answer one question: arrival price (the mid when the parent order was sent) is the headline “what did I pay”; VWAP is “did I beat the market”; TWAP stands in for VWAP when volume is unpredictable; and implementation shortfall — Perold’s measure — is the total cost from decision to completion, opportunity cost included. Every yardstick carries a built-in bias: arrival punishes slow execution, VWAP rewards trading with volume and punishes the trader who had a strong view and finished early, TWAP ignores the volume profile entirely. Most shops run arrival for the headline and interval VWAP for the algo benchmark. Benchmark a TWAP algo against VWAP and of course it loses — the two aren’t even tracking the same thing.

The quality bar for a post-trade report is simple: can a trader read it once and say what to change tomorrow? Good reports decompose cleanly and sum to the total, match benchmarks to strategies, compare against the right peer group (small-cap algo against small-cap algo, not the whole universe), and flag outlier days instead of burying them. Bad reports have equally stable tells: an “implementation shortfall” with no opportunity-cost line (you can’t call it that — it’s Perold’s definition), costs quoted only as a percentage of notional with no dollar figure (5 bps on 1Mis1M is 500; on 100Mit′s100M it's 50,000 — not the same), and monthly averages with no distribution (meaningless when some trades run +50 bps and others -10).

A Worked Example

Say you get an order at 10:00 to buy 100,000 shares of XYZ. The 10:00 mid is $50.00, quoted $49.99 / $50.01. You work it for 30 minutes with a VWAP algo and fill 95,000 shares at an average of $50.06. Interval VWAP over 10:00-10:30 is $50.04, the mid at 10:30 sits near $50.04, VWAP over the remainder of the day is $50.12, and the stock closes at $50.08.

ComponentCalculationCost (bps)
Spread cost~half-spread × 95,000 shares+0.5
Impact costFills vs. concurrent mid+3.4
Timing cost(50.04−50.04 - 50.00) × 95,000 = $3,800+7.6
Opportunity cost(50.12−50.12 - 50.04) × 5,000 = $400+0.8
Arrival shortfall(50.06−50.06 - 50.00) × 95,000 + (50.04−50.04 - 50.00) × 5,000 = $5,900+11.8

The components sum to 0.5 + 3.4 + 7.6 + 0.8 = 12.3 bps against a realized 11.8 — a 0.5 bp discrepancy from rounding plus the fact that timing and impact tangle at every fill and were never perfectly separable. That gap is nothing to stress over. A 3 bp gap would be something to investigate.

The headline readings: you paid 11.8 bps against arrival. Against interval VWAP, you paid 4 bps (50.06vs50.06 vs 50.04). Against the $50.08 close, you came out 4 bps ahead. Which one counts? The PM’s mandate decides: if the alpha was generated at the 10:00 decision, arrival shortfall is the truth; if it’s generated intraday and exact timing doesn’t matter, VWAP is fine.

The Ways a Report Lies

The same machinery can be made to tell the wrong story. A few versions every desk has seen.

Confusing benchmark with cost. Filling 3 bps worse than VWAP sounds bad — but if VWAP sat far above arrival because the stock ripped on news, those 3 bps can still be a win. You paid arrival plus 3 while the market paid arrival plus 8. Benchmark is not cost.

Ignoring opportunity cost. “I filled 90% of the order at 1 bp under VWAP” — hiding that the unfilled 10% ran away and cost the strategy 30 bps of alpha. Don’t let them.

Apples to oranges. A small-cap algo against a large-cap benchmark, an aggressive algo against a passive benchmark, a momentum strategy’s cost against a market maker’s. None of it means anything.

Trusting the broker’s TCA without reconciling. Brokers compute on their own fills, their own timestamps, their own models. Sometimes fine, sometimes not. Reconcile quarterly.

And then there are three situations where nobody gamed the numbers but the environment makes them lie anyway. Earnings mornings: the spread blows out from 2 cents to 20, volatility triples, the stock gaps 5% at the open, and anything worked that morning looks awful against arrival — that’s earnings volatility, not the algo’s fault; filter those days or compare against an earnings-day peer set. News shocks, same story: a buy order landing 30 seconds before a Fed announcement reads as a 50 bp disaster the trader could not have foreseen. Don’t punish them. The third is the easiest to miss: the algo was the wrong choice. The PM picked an ill-suited algo for a low-volume name, the stock drifted all day, and the report says the algo failed — what failed was the selection. TCA should feed back into algo choice, not just execution within an algo. Which is why TCA needs context: a number on a page means nothing without the day, the stock, the strategy, and the algo behind it.

Closing the Loop

Running an execution desk, all of this ultimately chains into one cycle. Before each parent order goes out, the pre-trade estimate lands in the OMS, with a flag to the PM when it crosses a threshold. While the order lives, real-time TCA tracks arrival and interval VWAP, with intervention rules that don’t chase noise. The next morning, the post-trade report decomposes into the four components and sums to the total. Quarterly, you reconcile with the brokers. And then — the stitch that closes the loop — post-trade data recalibrates the pre-trade model: predicted 5 bps and realized 8, fit that stock’s η\eta higher; realized 3, fit it lower.

Once the loop is closed, the three checkpoints stop being three isolated reports and become one ledger kept continuously through budgeting, steering, and audit. Round by round, the luck gets stripped out. What remains is your execution.

References

  • Harris, L. (2003). Trading and Exchanges: Market Microstructure for Practitioners. Oxford University Press. Ch. 19-24. ISBN: 978-0-19-514470-3.
  • Perold, A. F. (1988). “The Implementation Shortfall: Paper Versus Reality.” Journal of Portfolio Management, 14(3), 4-9.
  • Almgren, R., & Chriss, N. (2000). “Optimal Execution of Portfolio Transactions.” Journal of Risk, 3(2), 5-39.
  • Bertsimas, D., & Lo, A. W. (1998). “Optimal Control of Execution Costs.” Journal of Financial Markets, 1(1), 1-50.