B Binance · The world's largest crypto exchangeBinance Sign up → AD OKX OKX · A leading global crypto exchangeOKX Sign up → AD
oco.kr.
📚 All keywords › 📊 Chart Analysis, Properly From the Start › How to Read Backtest Results: What to Check Before Returns
🧪

How to Read Backtest Results: What to Check Before Returns

Maximum drawdown, costs, look-ahead bias and overfitting: the things to check before you trust the numbers a backtest gives you.

📚 Chart Analysis, Properly From the Start · 31/52· ⏱ About 13min read ·Information updated 2026-10-07
📋 Key facts4
Key
A record of what following the rules would have done in the past, not a forecast
First
Check max drawdown, trade count and results versus holding before the return
Costs
Around 0.1% per fill in fees; the more often you trade, the more they eat into results
Pitfalls
Look-ahead bias, overfitting, survivorship bias, a single bull run

The question a backtest answers

A backtest applies a fixed set of trading rules to past prices exactly as written. The question it answers is "what would have happened if I had followed these rules back then," not "will it keep working." So before looking at any single number in the results table, ask how close that number is to chance. This site's Crypto Strategy Backtester runs six rules on real historical Binance candles and shows the results side by side with simply holding. The reason people overtrust backtests is simple. A smoothly rising curve is persuasive, and whoever built it usually kept only the settings that turned out well. Fixing a reading order reduces this trap. Check in turn whether the rule is written down precisely, how fill timing and costs were handled, how it compares with holding, whether there are enough trades, and whether it holds when the period is split up. If a rule is vague, like "buy on a decent dip," the test cannot even be run.

The numbers in the results table

Total return grows with the length of the period, so results over different periods are compared by annualized return (CAGR). A high win rate can still lose money if one losing trade is large, and a low win rate can still make money if the winning trades are large. That is why the win rate only means something when read with the payoff ratio. Market exposure is the share of time a position was held. A rule with 30% exposure sat in cash for the other 70%, so keep that difference in mind when comparing its return and drawdown with holding. A rule that is slow to take losses and quick to take profits raises its win rate at the expense of its payoff ratio, and looking only at the win rate makes this trait seem like a strength. A profit factor below 1 means a loss even before costs, and one just above 1 is easily flipped by costs and slippage. A rule with low exposure will naturally have smaller drawdowns, so that alone does not show the rule is good.

  • CAGR = (final equity ÷ starting equity)^(1 ÷ years) − 1
  • MDD: the deepest drop from the running peak
  • Win rate: winning trades ÷ closed trades
  • Payoff ratio: average win ÷ average loss
  • Profit factor: total profit of winning trades ÷ total loss of losing trades
  • Market exposure: bars spent in a position ÷ all bars
  • Average holding period: the average number of bars each position was held

Compare with holding, and include costs

A rule's result only means something when compared with buying and simply holding over the same period. In a period when the coin rose sharply, most buying rules make a profit. Costs have to go in too. Binance's default spot fee is 0.1% per fill, and on top of that comes slippage, where an order fills at a worse price than expected. If you buy and sell your whole balance each time, 200 fills at 0.1% each cost about 18% of your capital, and at 0.15% each about 26%. The example in the figure has only 49 fills, yet its final equity of 168 before costs, above holding (165), drops to 157, below holding, once 0.15% is subtracted per fill. You can compare against buying in installments with the Crypto DCA Simulator. The cost arithmetic is simple: 0.999 multiplied 200 times is about 0.819, and 0.9985 multiplied 200 times is about 0.741. The shorter the holding period of a rule, the more fills it makes and the larger this effect becomes, and on thinly traded coins or in fast markets slippage can be far larger than 0.05%. When comparing with holding, match the period, the starting capital and the cost assumptions.

Equity curveNo costsBuy & holdWith costs
Illustration: equity curves (starting at 100) from applying the rule "buy at the next bar's open when the close moves above the 5-bar moving average, sell when it moves below" to 240 bars of randomly generated prices (picked from several generated series). Subtracting 0.15% per fill (0.1% fee + 0.05% slippage) across 49 fills turns a final value that was above holding into one below it.

Look at maximum drawdown (MDD) first

Maximum drawdown is the deepest percentage your equity fell from its peak up to that point. Even with the same final return, a curve that dropped 35% along the way and one that dropped 10% are entirely different experiences. Losses and recoveries are asymmetric: after losing 20% you need a 25% gain to get back to even, after 35% about 54%, and after 50% a full 100%. Also look at how long it took to get back above the old peak. In the figure's example, the MDD of the buy-and-hold curve was 35%, while the rule's curve with costs had an MDD of 11% over the same period. Drawdown comes before return because whether a person could actually follow the curve depends on it. In the middle of a drawdown you cannot tell whether the rule is broken or just resting, and that is exactly where many people abandon it. The MDD in a backtest comes from one past path, so it is safer to assume future drawdowns can be deeper.

RecoveredPeakMDD -35%Buy-and-hold max drawdown
Illustration: the "Buy & hold" curve from the figure above. The deepest drop from the running peak is the maximum drawdown (MDD), here -35%. How long it took to get back above the peak is worth checking too.

Look-ahead bias: information you did not have yet

Look-ahead bias is the mistake of basing a decision on information that could not have been known at that moment. The most common form is to judge a signal on a bar's close and assume the trade filled at that same close. The close is only known once the bar has ended, so if you decide on a closed bar's close, the fill has to be set at the next bar's open. This site's backtester does exactly that. Two other mistakes of the same kind are assuming you know a day's high and low when that day begins, and using a swing high at the bar where it formed even though it is only confirmed once the bars to its right have closed. A common illusion is reading results that look too good as skill. If the win rate is abnormally high or there are almost no losing trades, suspect look-ahead bias first. Check in turn whether the indicator calculation includes values from after that bar (for example, values scaled to the high and low of the whole period), whether the signal bar and the fill bar are the same, and whether the bar timestamps in the data mark the open or the close.

Overfitting: the more you try, the more likely you are to pick luck

Try dozens of settings such as periods and multipliers, and one of them will produce a good result by chance. The moment you pick that setting, the results table reflects the act of picking rather than the skill of the rule. The figure above was made that way. We generated several random price series and picked one that suited the explanation, and even though these were random prices, where a rule for timing buys and sells has no reason to work, the result was a curve that looked better than holding before costs. To check for this, see whether values next to the chosen setting also do similarly well, and whether the result holds over other periods and on other coins. Each condition you add makes the rule fit the past better, because each one gets tuned to dodge a particular losing stretch. That is why the period used to choose settings is often kept separate from the period used to test them. You set the parameters on the earlier stretch, then run the rule once on the later stretch you have not touched. If you change the settings after seeing the later results, that stretch is no longer a test either.

Survivorship bias and dependence on market regime

If you test the past using only coins that trade today, the coins that vanished or were delisted in the meantime drop out, and a sample made only of survivors flatters the results. Choosing "today's top coins by market cap" as your universe has the same problem, since it amounts to picking coins while already knowing they rose sharply in the meantime. This course's own statistics were also measured on 10 large coins that are still around, so they share this limitation. Market regime matters too. Across all 29,746 daily bars of those 10 coins (from each coin's listing date to September 2026), the return from a bar's close to the close 20 bars later averaged +4.62%, but the median was +0.15% and the share that rose was 50.4%. In other words, a small number of large rallies pulled the average up, and the result can change a great deal depending on whether those few fall inside the test period. Split the period into segments to check that the result does not hinge on a single bull run. When splitting the period, look at rising, falling and sideways stretches separately, and note where the rule made money and where it lost.

With few trades, the numbers are unstable

With only ten or so closed trades, the win rate and profit factor swing widely on a few chance outcomes. In this course's measurements, golden crosses on Binance BTC daily candles (the SMA50 crossing above the SMA200) happened only 9 times from August 2017 to September 2026. Five bars later price was higher in 1 of 9 cases (11.1%), and twenty bars later in 6 of 8 (75.0%). The figures for all bars were 53.1% and 53.7% respectively. The same signal looks like its opposite just by changing when you measure. With a small sample, hold off on conclusions whether the result looks good or bad; the next step is to raise the trade count by extending the period or adding coins. Winning 7 of 10 trades and winning 70 of 100 give the same win rate but carry very different weight. The chance of getting heads 7 or more times in 10 coin flips is about 17%, which is not rare.

What even a good backtest does not tell you

Even a backtest that avoids every pitfall shows only one path the past happened to take. When the character of the market changes, a rule that worked well may stop working for a while, and in real trading it is harder than you would expect to stick to the rule through a string of losses. It is more accurate to see a backtest as a tool that shows a rule's character in advance: how often it trades and how deep its drawdowns go. If you want to test your own eye, the Chart Prediction Quiz lets you compare your hit rate with a random-guess baseline. So the job after reading a results table is not to work out how much you would make, but to ask whether you could actually sit through those drawdowns and losing streaks, and whether the cost assumptions match your own trading conditions. Setting a record of actually following the same rule for a few months next to the backtest shows where the gaps from costs, fills and psychology come from.

What looks different in crypto and stocks

Even with the same rule, the assumptions behind a results table break in different ways depending on the market. Crypto trades 24 hours a day, so there are almost no gaps between daily bars, but with stocks, news released after the regular session is priced in all at once at the next day's open, creating gaps. The assumption "fill at the next bar's open" is the same, but for stocks that open can differ sharply from the previous close, and a stop often fills not at the stop price but at the gapped open. Korean stocks have a daily price limit (±30%), and on days locked at the upper or lower limit you cannot trade at the price you want, yet backtests usually count those days as filled. US stocks have no per-stock daily limit but do have mechanisms that briefly halt trading during sharp moves. Costs differ too: Korean stocks carry a transaction tax on sales, so round-trip costs are calculated differently from crypto, where you pay only fees. Survivorship bias also takes a different shape. Testing the past with today's index members or today's large US tech stocks drops the names that left in the meantime, and picking long-surviving large caps such as Samsung Electronics or SK Hynix tends to flatter results. Also check whether the stock data is adjusted for splits and dividends.

A practical checklist

When you get a results table, going through it in the order below means less gets missed. When watching the same rule on a live chart, check one more thing. A backtest uses only closed bars, but the last bar on screen is still forming, so its close, moving average and RSI change with every update. A signal that lights up intrabar often switches off when the bar closes, so to compare on the same terms as the backtest, count only signals after the bar has closed. A backtester's results are calculated with every past bar already closed, so the signals you saw on screen and the signal count in the results table can look different. Counting a forming bar as a signal includes signals that could never actually have been filled. The list below doubles as the order for reading a results table.

  • Is the rule written down precisely (entry, exit and stop conditions)?
  • Are the signal bar and the fill bar different (decide on the close, fill at the next bar's open)?
  • Were fees and slippage applied to every fill?
  • Was it compared with holding over the same period, allowing for the difference in exposure?
  • Could you actually sit through the MDD and the recovery time?
  • Are there enough closed trades, and does the result hold when the period is split?
  • Do neighboring values of the chosen setting, and other coins or stocks, give similar results?
  • Was the live comparison made only with signals from closed bars?

🧰 Related tools

Check it live

🔗 More in this category

🌍 Search the web for this

Each button runs this keyword on that search engine