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.
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.
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.
How to read a backtest table
- Find the trade count. If it is under a few hundred, everything else on the row is provisional.
- 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.
- Check that costs were included. If the tool does not say, they were not.
- Ask how the horizon was chosen. If the answer is "the one that worked", the result was selected, not measured.
- Then, and only then, look at the average.