All articles
MethodologyJanuary 12, 20267 min read

Why most backtests lie

The five habits that turn a losing strategy into a beautiful equity curve, and the checks that expose each one.

A backtest is a claim about the past. Most claims fall apart for one of five reasons, and all five are easy to spot once you know their names.

1. Look-ahead bias

The strategy uses information that did not exist yet. The classic version is acting on a candle's close inside that candle. If a signal is confirmed at the close, the earliest honest fill is the next open.

A backtest that fills at the same close it measured is not optimistic. It is impossible.

2. Survivorship and symbol shopping

Testing twenty symbols and reporting the best one is not a result, it is a selection. If you tried twenty, the honest headline is the median of twenty.

3. Costs quietly omitted

Fees and slippage are charged on the traded notional, on both sides. A strategy averaging 0.3% per trade dies instantly at 0.1% per side. High-frequency rules are the ones this kills, which is exactly where curve-fitting is easiest.

4. Optimising and reporting the same data

Sweep forty parameter sets, keep the best, report its numbers — and you have reported the luckiest draw, not the expected one. The fix is unglamorous: pick the winner on a training window, then measure it once on candles the search never touched.

5. Drawdown measured on closed trades only

Closed-trade drawdown ignores what the position did while it was open. Your account felt the open loss even if the trade later closed green. Peak-to-trough on the equity curve is the number that matters.

The checklist

CheckWhat honest looks like
Fill timingSignal on close, fill at next open
CostsBoth sides, on actual notional
Sample sizeTrade count printed beside every rate
SelectionOut-of-sample measured once
DrawdownPeak-to-trough on equity, not closed trades

If a report will not tell you these five things, it is not telling you the result either.

Read next

Choosing a timeframe without fooling yourself

Continue

Want these checks applied to your own rules automatically?

Run a backtest