Backtest Transaction Costs: When Does Turnover Erase Alpha?

A strategy can look excellent before execution and ordinary after it. This calculator turns annual traded notional and an all-in cost assumption into annual return drag, net alpha, and break-even thresholds.

Test your assumptions

Enter percentage points before the trading friction modeled here. This is an assumption, not a forecast.
A value of 12 means total one-way traded notional over a year equals 12 times strategy capital.
Enter basis points per dollar traded. Depending on the strategy, this assumption can combine commissions, spread, slippage, fees, and market impact.

Cost sensitivity

1.20%Annual modeled cost drag
1.80%Gross alpha minus modeled friction
30×Turnover that consumes the entered gross alpha
25 bpsCost per traded dollar that consumes the entered gross alpha

At 12× annual turnover and 10 bps per dollar traded, modeled friction subtracts 1.20 percentage points per year. A positive result after this subtraction is not evidence that the strategy will earn positive live alpha; it only survives this one implementation assumption.

Turnover matters more than trade count

A strategy that trades every day can still have modest turnover if each order is small. A strategy that trades only once a month can have high turnover if it replaces most of the portfolio each time. That is why this analysis starts with dollars traded relative to capital, not the number of tickets.

Annual cost drag (%) = annual one-way turnover × cost in basis points ÷ 100
Net alpha (%) = gross alpha − annual cost drag
Break-even turnover = gross alpha × 100 ÷ cost in basis points

A portfolio with 3× annual turnover and 10 bps of friction loses about 0.30 percentage points per year to that assumption. At 12× turnover, the same 10 bps becomes 1.20 points. At 52× turnover, it becomes 5.20 points.

The formula is intentionally simple and transparent. Real execution can be less cooperative because spread, slippage, and market impact can change with order size, volatility, liquidity, time of day, venue, and urgency.

How quickly cost drag grows

The table holds everything else constant and varies annual one-way turnover and assumed friction per dollar traded. Values are annual percentage-point drag before financing, borrow, taxes, or nonlinear capacity effects.

Annual turnover1 bps5 bps10 bps25 bps
1×0.01%0.05%0.10%0.25%
3×0.03%0.15%0.30%0.75%
6×0.06%0.30%0.60%1.50%
12×0.12%0.60%1.20%3.00%
24×0.24%1.20%2.40%6.00%
52×0.52%2.60%5.20%13.00%

What should go into the basis-point assumption?

For a basic backtest, the entered friction should represent the costs that scale reasonably with traded notional: commissions, exchange or regulatory fees where relevant, bid/ask spread, slippage, and a defensible allowance for market impact. A liquid index future traded patiently and a small-cap stock traded aggressively should not share the same assumption merely because both are “one trade.”

Some costs need separate treatment. Short borrow, financing, futures rolls, option decay, taxes, and capacity constraints are not naturally summarized by one constant basis-point number. Market impact also becomes nonlinear when order size is large relative to available liquidity. A strategy that survives a 10 bps linear stress test can still fail a realistic capacity test.

This is why a backtest should be rerun across worse execution assumptions rather than report one optimistic net-return line. If a small change in friction erases most of the result, the implementation margin is thin.

Use the result as a stress test, not a profitability claim

The calculator does not estimate whether the gross alpha itself is real. It does not address look-ahead bias, survivorship bias, overfitting, regime change, or parameter selection. It only answers how much of an assumed gross edge is consumed by a stated amount of trading.

For the broader research process, read the algorithmic trading guide and the backtesting reference. If you are implementing a simulator, the Node.js backtesting tutorial shows the mechanics of building one.

Download the CSV sensitivity grid or JSON version for reuse.

Further reading