How to measure a trading strategy's performance - the five numbers and the one that decides

Win rate, average R, profit factor, drawdown and trade count each answer one question and dodge another. The lower bound answers the question that matters - is this real - and it is the one most tools leave out.

3 min read

Backtestingmetricsbacktestingevidence

Also available in Bahasa Indonesia

A trading strategy produces a list of results. Measuring its performance means turning that list into a verdict without lying to yourself in the process. Five numbers are conventionally used. Each answers one question and quietly dodges another. A sixth answers the question the other five leave open.

1. Win rate

The share of trades that closed above zero.

Answers: how often was it right? Dodges: by how much. A 45% win rate with wins twice the size of losses is a good strategy. A 65% win rate with losses three times the size of wins is a slow way to lose money. Win rate alone cannot tell them apart.

2. Average R

The mean result per trade, in units of the risk taken.

Answers: what does one trade expect to make, in a unit that does not depend on account size or price? Dodges: how many trades that expectation rests on. +0.4R over 40 trades and +0.1R over 2,000 are both "average R", and the first is the weaker strategy.

What an R-multiple is →

3. Profit factor

Gross profit divided by gross loss.

Answers: did the wins outweigh the losses, in total? Dodges: the sample size, entirely - the ratio hides the count - and the distribution. One huge win and ninety-nine small losses can produce the same 1.5 as a hundred steady trades.

What profit factor is →

4. Maximum drawdown

The deepest fall from a peak, measured in R.

Answers: how bad did it get, on the way to the result? Dodges: whether that is bad. A 12R drawdown over 2,000 trades is an ordinary rough patch; the same 12R over 40 trades means the strategy spent most of its life underwater.

5. Trade count

How many trades the other four rest on.

Answers: the question all four dodge. Dodges: nothing - but it is not a performance figure on its own, and it is the one most often left off the table, precisely because it is the one that makes the table look worse.

The sixth: the lower bound

Take the average R and the variation between trades. Ask: given this many trades and this much spread, what is the worst average the data is still consistent with at 99% confidence?

That is the lower bound. It combines the average with the count in one figure. On a small sample it sits far below the average, because a small sample cannot rule out that it got lucky. On a large sample it sits close, because luck has had its chances.


strategy            average    lower bound   trades
squeeze_breakout    +0.1545R   +0.0296R        390
confluence          +0.1033R   +0.0605R      2,810
downtrend_rally     +0.0398R   −0.0612R        440

Sort by average and squeeze_breakout wins. Sort by lower bound and confluence wins - because 2,810 trades of +0.10R is a stronger claim than 390 trades of +0.15R. And downtrend_rally, with a positive average, has a lower bound below zero: the data has not ruled out that it loses money.

This is the number the NusaTerminal automation engine reads before it is allowed to trade a strategy. Not the average, not the profit factor, not the win rate. If the lower bound is not above zero, the engine refuses, and it says which strategies it would accept instead.

Why most backtests lie →

How to read a backtest table

  1. Find the trade count. If it is under a few hundred, everything else on the row is provisional.
  2. Read the lower bound, or if the tool does not give one, mentally widen the average by the sample: forty trades means the true figure could be half or double.
  3. Check that costs were included. If the tool does not say, they were not.
  4. Ask how the horizon was chosen. If the answer is "the one that worked", the result was selected, not measured.
  5. Then, and only then, look at the average.

Crypto strategy backtesting in NusaTerminal →

← Backtesting