Backtest Transaction Costs: When Does Turnover Erase Alpha?
Test your assumptions
Cost sensitivity
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.
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 turnover | 1 bps | 5 bps | 10 bps | 25 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.