Skip to content
QuantWright

Reading results

A result shows what the strategy did on past data, how far that evidence can be trusted, and anything that does not add up.


The result

Every backtest produces a result card: the headline figures, the Honesty Score and a one-line verdict. The notes under it say what was measured, what was assumed, and what was not modelled. Ask about any figure in the chat and the answer is read from the stored run.

On stock, ETF, crypto and FX runs, under our market-data licence, the card does not show the equity and drawdown curves, the buy-and-hold return (it says only whether the strategy beat it), what each trade made, each month’s or year’s return, or the largest win and loss. Everything else is there: net return, drawdown, the ratios below, win rate, the trade list without its figures, and the checks. Where a figure below is withheld, it says so.

On a short test window the annualised figures (annual return, the annualised Sharpe and Sortino, Calmar, trades per year) are withheld rather than extrapolated from a span too short to annualise.

The tested period

The line under a result’s headline names the market, the bar size and the dates it tested, for example SPY · daily · 11 Oct 2018 – 28 Sep 2026 · 7.9 years. When the test is shorter than the depth or the dates you asked for, the reason is written beside the dates: the history starts later, or one run cannot hold that many bars.

Under the headline figures, each calendar year of the test shows the trades entered in it. A first or last year the test covers only part of is labelled with the date it starts or stops. Where a year’s own return is withheld, the card gives how many years were up and down and the median, best and worst, never which year.

The Period buttons on a result re-run the same code over the last 1, 2 or 5 years, Max, or two dates you pick. Max reaches up to 10 years on intraday bars, less where the data starts later or one run's limit comes first, and all daily history on daily bars. Max says how far it reaches before you press it, and so does any button whose period one run cannot hold. They send /period to the chat. Nothing is regenerated: the code, its parameter values and its costs stay the same, and the new card says which version’s code it ran.

Once the same strategy has run over more than one period, its newest result lists them side by side under This strategy across periods: each window’s net return, maximum drawdown, trades, win rate and Honesty grade, with a link to its card. Only runs of the same code, parameter values and costs are listed; a version the AI rewrote is a different strategy and is left out.

Returns and risk

Total return

Cumulative profit over the whole backtest, after costs, as a percent of starting capital.

Trades compounded

Every trade’s own return, chained one after another, as if each trade had used the whole account. Total return is what your account actually made. The two match only when every trade did use the whole account: if trades used part of it, the account’s return is smaller, and with leverage it is larger.

Annualized return

Total return turned into a one-year rate, so a result over two years and one over six months can be put side by side. When the test is shorter than a year the card says how many months it came from: the figure is that pace carried on for a year, not something the strategy did over a year.

Benchmark

Buy-and-hold of the same asset over the same window, from its first close to its last, on the same basis as the strategy: on a stock or ETF run whose card says total return, plus every dividend paid to the holder in cash on its ex-date; otherwise a price return — the bar your strategy has to beat to be worth the effort. On stock, ETF, crypto and FX runs the card says only whether the run beat it: the figure is withheld under our market-data licence.

Time in market

The share of the tested bars on which the strategy held a position, counting the bar each trade opened on through the bar it closed on — so it is one bar a trade more than the trades' bars held (fill to fill) added up. A strategy that is out of the market most of the time is not exposed to it, which matters when comparing it with buy-and-hold.

Max drawdown

The largest peak-to-trough drop in account value, measured on the account at each bar’s close: how far the account fell from a high before it reached its next low. A trade's worst move inside a bar can be deeper than this.

Longest drawdown

The longest stretch, in calendar time, from an equity peak until the account was back at it, on the same account curve as the max drawdown. One still open at the end of the test runs to the last bar.

Average drawdown

The mean depth of the drawdowns on the account curve, each measured from its peak to its lowest point.

Average drawdown length

The mean length, in calendar time, of the drawdowns on the account curve, peak to recovery.

Sharpe ratio

Per-trade Sharpe, annualised: the mean of the per-trade net returns (on the traded price, after costs) divided by their standard deviation, times √(trades per year). Risk-free rate 0. It is not the textbook Sharpe on daily returns, so the usual rules of thumb for that one do not carry over: a strategy that trades often can print a large figure from a small edge per trade.

Sortino ratio

Like Sharpe, on the same per-trade basis (× √(trades per year), risk-free rate 0), but only downside deviation below zero counts against you — upside swings don't. Higher is better.

Calmar ratio

Annual return divided by worst drawdown. Higher means more reward per unit of pain; above ~1 is healthy.

Equity curve

Your account value over time. Smooth and rising is good; a flat stretch then one spike is a warning. Withheld on stock, ETF, crypto and FX runs under our market-data licence.

Monthly returns

Each cell is that calendar month's return. Scan it for consistency — a few huge months carrying everything is fragile. Withheld on stock, ETF, crypto and FX runs under our market-data licence: the card then shows how many months were up and down, and the median, best and worst, without saying which month.

Trade statistics

Trades

Number of completed round-trip trades. The product's trade-count bars are rules of thumb it chose, not results of a test: below 20 trades a run is flagged as a thin sample and a Monte Carlo is not read as a risk estimate; 30 is the usual minimum before a win rate or Sharpe is trusted, and the least a market-regime row is read on; the Honesty Score gives full trade-count credit at 100. More trades narrow the error on every statistic; none of these numbers makes a result true.

Win rate

Share of trades that made money. A high win rate with tiny wins and huge losses can still lose — read it alongside profit factor.

Profit factor (price)

The winning trades’ returns added up, divided by the losing trades’ returns added up — each trade’s return measured on its own traded price, after costs, not in dollars on the account. It matches the dollar ratio only when every position is the same size; above 1, the winners outweighed the losers trade for trade.

Profit factor (account $, after costs)

The winning trades’ dollars added up, divided by the losing trades’ dollars added up — each trade in account dollars after its commission and slippage. TradingView’s Strategy Tester reports its profit factor on money, on this basis. The gross profit and gross loss rows are before costs, so their ratio is not this figure.

Expectancy per trade

Average return per trade, measured on each trade’s traded price after costs. Positive means the trades made money on average over this test, which by itself does not show a real edge.

Average win

Mean return on the trades that won.

Average loss

Mean return on the trades that lost (shown negative). Winners should comfortably outweigh losers.

Largest win

The best single trade’s return, measured on its traded price after costs — the same basis as expectancy and the average win. Withheld on stock, ETF, crypto and FX runs under our market-data licence.

Largest loss

The worst single trade’s return, measured on its traded price after costs — the same basis as expectancy and the average loss. Withheld on stock, ETF, crypto and FX runs under our market-data licence.

Payoff ratio

Average win divided by the size of the average loss, both per-trade returns on the traded price. Read it with the win rate: a low win rate needs a high payoff ratio.

SQN

System Quality Number: √(number of trades) × the mean per-trade return ÷ its standard deviation, on the per-trade price returns after costs. Van Tharp’s original uses R-multiples, so the two are not the same scale.

Long / short

The trades split by side: how many, the share that made money, and the mean per-trade return on the traded price after costs.

Max consecutive wins

Longest winning streak — useful for keeping expectations grounded during a hot run.

Max consecutive losses

Longest losing streak. The real gut-check: could you keep trading the plan through it?

Trades per year

How often the strategy trades, annualized: the number of trades divided by the years from the first bar tested to the last, quiet stretches included. This drives how much commission and slippage you actually pay.

Holding period

How many bars each trade stayed open, from the bar it filled on to the bar it exited on — the count a rule like "after 7 trading days" uses, and the one the duration chart shows. Time held is the same trade in calendar time. It tells you whether this is scalping, swing, or position trading.

Trade distribution

Histogram of per-trade outcomes. A tight cluster is dependable; a few outliers carrying the result is fragile. On stock, ETF, crypto and FX runs the bars count the trades in each band of return, and no trade is named.

Terms and colours

The words on a result that are not metrics, and what its colours mean.

Colours on a result

Green is a gain in money (net return, a winning year); red is a loss or a drawdown (max drawdown, a losing year). Grey means zero or not measured. Amber is a note to read before trusting a figure. The coloured stripe and ring beside the verdict are different: they grade how much evidence backs the result, whatever it earned. Win rate and trade counts are never coloured: a high win rate is not profit.

Edge unverified

The headline while the result looks promising so far but a check is still to run, most often the held-out test. It does not mean the strategy failed, and it is not a sign that it works: the evidence is incomplete. It is about the evidence, not about profit.

Held-out test

A test on a stretch of history the strategy was not built or chosen on. A backtest always looks best on the years it was tuned on, so only years you kept out of sight can show whether the idea holds up on years it has not seen. /validate is not one: it re-splits the same trades.

Honesty cap

A ceiling on the Honesty Score. Some findings do not lower the score a little; they cap it, because the number would otherwise answer a different question. The usual one is grade C until a held-out test has run and every check on it is measured. The verdict names the cap whenever one applies.

bps (basis points)

A basis point is one hundredth of a percent: 1 bp is 0.01%, 100 bps is 1%. Trading costs are quoted this way because they are small: 5 bps of commission is 0.05% of the trade’s value.

MAE / MFE

How far a trade went against you (MAE, maximum adverse excursion) and in your favour (MFE, maximum favourable excursion) before it closed. If winners often dipped a long way first, a tight stop could have shaken them out. Withheld on stock, ETF, crypto and FX runs under our market-data licence.

The robustness check (/validate)

Robustness check (/validate)

The run’s own trades re-split many ways into training and test folds across its history (CPCV), with a gap between them so nothing leaks across. Nothing is re-fitted on the training folds and every trade lands in some test fold, so this shows how steady the fixed strategy is across stretches of its history. It is not walk-forward optimisation and not a test on data the strategy has never seen.

CPCV (cross-validation)

Combinatorial Purged Cross-Validation: the run’s trades are split many ways into training and test groups (folds), with a gap between them so later data can’t leak into earlier data. Here it re-splits one fixed strategy’s trades and re-fits nothing, so it shows how steady they are across the history; it is not evidence the edge isn’t curve-fit.

Test-fold Sharpe (per trade)

Per-trade Sharpe over the trades in the test folds. A fixed strategy is not re-fitted on the training folds and every trade lands in some test fold, so this equals the full run’s per-trade Sharpe. It is not measured on data the strategy has never seen.

Training-fold Sharpe

Sharpe over the trades in the training folds. Nothing is fitted on them: they are the same strategy’s trades from other stretches of the history.

Degradation

How the Sharpe changes from the training folds to the test folds. Nothing was re-fitted, so a drop is variation across the history, not by itself proof of overfitting.

Deflated Sharpe Ratio (DSR)

Shown 0–100%: the probability that the strategy’s true Sharpe ratio is above the best Sharpe that luck alone would produce across the versions tried, allowing for how many trades there are and how skewed and fat-tailed their returns are (Bailey and López de Prado’s Deflated Sharpe Ratio). Try many ideas and one will look good by chance; this takes that luck back out. It is worked out from this run’s own trades, not from unseen data, and a high figure on few trades is still thin evidence. Higher is better.

Probabilistic Sharpe (PSR)

Shown 0–100%: how confident the numbers are that the strategy’s average return per trade is really above zero, given how many trades there are and how uneven they are. It is not the chance the strategy makes money in future. With a real edge it climbs toward 100% as trades accumulate; 95% is only the usual bar for calling it significant, and a high figure on very few trades is still thin evidence.

Windows

Number of separate train/test splits of the run’s own history the check used.

Test-fold trades

Trade count in the check’s test folds. For one fixed strategy that is every trade of the run. Too few and the result is just noise.

Overfitting

Tuning a strategy so tightly to past data that it memorizes noise instead of a real edge — it looks great in the backtest and falls apart live.

Monte Carlo

Monte Carlo

We redraw your trades at random — with replacement, in blocks of consecutive trades, so some repeat and some are left out — thousands of times, to see the spread of returns and drawdowns those same trades could give. It takes the trades as they are, so it does not test whether the edge is real. Use "Run Monte Carlo" under the result for the deep 10k-path version.

Profitable paths

Share of simulated runs that ended in profit — the run’s own trades resampled WITH REPLACEMENT, in blocks of consecutive trades, so each path varies in which trades it draws. Which trades a path draws decides where it ends; the order they come in does not (it only changes how deep the path dips on the way). It assumes the edge is real: a curve-fit strategy scores high here too, so this figure is no evidence that the edge exists. Not the chance of making money in future. The Honesty score says how much evidence there is; /validate is not an out-of-sample test.

Median return

The middle outcome across all simulated paths — half do better, half worse. The paths resample this run’s own trades, so it is not independent evidence of anything the backtest did not already show.

Terminal return

Final return at the end of each simulated path. p5 and p95 are the 5th and 95th percentiles: 5% of paths ended below p5 and 5% above p95, so they are not the worst and best outcomes.

CAGR

Compound annual growth rate — each simulated path's return annualized over the CALENDAR span of the backtest window, the basis a buy-and-hold figure on the same window uses (where the card shows one). The p5/median/p95 spread shows the realistic range of yearly compounding, not a single lucky number.

CVaR (Expected Shortfall)

The AVERAGE outcome across the worst 5% of simulated paths — not just the p5 boundary. It answers "when it goes bad, how bad on average?" and is the metric risk desks size to.

Median max drawdown

Across all simulated paths, the typical worst drop. Half of outcomes are deeper than this, half shallower. It is measured on the account at each trade's close and, where the engine recorded it, the worst point inside each trade; on fewer than 20 trades it is not a risk estimate, and the run's own drawdown is printed beside it.

Worst max drawdown

The deepest drop seen across every simulated path. It is only as deep as the trades resampled can make it: a resample that cannot reach the drawdown this run itself had is understating the risk, and the card says so.

Chance of a drawdown this deep

Share of simulated runs whose worst drawdown reached the threshold you pick on the slider (5% to 50%) — the run’s own trades resampled WITH REPLACEMENT, in blocks of consecutive trades, so each path varies in which trades it draws and in the order they come, which matters here because a drawdown depends on the sequence. It assumes this run's edge is real and repeats, so it is not the probability of wiping out your account in future.

The Honesty Score

A 0 to 100 score of how much the evidence supports the result. It marks down what usually makes a backtest look better than it is: too few trades, a Sharpe ratio that could be luck, a search over many versions, and returns that are mostly the market. It is not a forecast.

ComponentWeightWhat it measures
Sharpe confidence40%The probability that the strategy’s true Sharpe ratio is above zero, given how many trades there are and how lumpy they are (Probabilistic Sharpe).
Sample size15%The number of trades behind the result; after /validate, the trade observations across its test folds. Full marks at 100.
Track record length10%Trades on record against the minimum needed for this Sharpe ratio to be statistically significant (MinTRL).
Market independence10%How much of the return the market explains: the R² of the strategy against SPY. Measured by /validate. Not scored for a strategy that trades SPY itself.

When you try several versions of a strategy in one chat, the Sharpe check is deflated for the search: its 40% splits into Deflated Sharpe (30%) and Probabilistic Sharpe (10%), and the score’s breakdown says which variant this is and what the best of that many random strategies would show by luck.

The remaining 25% belongs to fold stability: the probability of backtest overfitting, which ranks competing configurations of a strategy against each other. A /sweep measures it over the configurations it ran, for the one it picks; on a run no sweep picked it is left out rather than counted as a pass, and its points are not handed to the other checks. So without it the checks allow at most 75, and 65 for a strategy that trades SPY itself, so grade A (80 or more) needs fold stability measured: the configuration a sweep picked, run as a held-out test. On top of that, every score is capped at 64 (grade C) until a held-out test has run; see caps for how to run one.

Grades

GradeScore
A80 to 100 (needs fold stability from a sweep, and a held-out test)
B65 to 79
C50 to 64
D35 to 49
F0 to 34

Caps

Some findings do not lower the score a little; they put a ceiling on it, because the number would otherwise answer a different question. The verdict names the cap whenever one applies.

64 (grade C)

Capped at grade C until a held-out test has run: a test on data the strategy was not developed or chosen on. To run one, put a hold-out on the record before you develop (“keep everything from 2024-10-01 out of sight”), test only on earlier years, then re-run the card you choose, unchanged, over exactly those years with /period (for example /period 2024-10-01 2026-10-01 v5, the card’s period control, or “re-run v5 unchanged on the held-out years”). That run is the test, scored on its own trades: it lifts this cap once every check on it is measured, only if no earlier run on that market in the chat had tested any of those years, and only once. It is not deflated by the runs it was picked after, since none of them saw those years; only by held-out attempts. A second try, a changed version, or any later run over those years does not lift it, and like every run it counts as a trial. A run that took no trades because a date in its code shut those years showed nothing, so it does not use them up. Where a check is still unmeasured on the held-out run (market independence), /validate on that card measures it. /validate on any other run is not a held-out test: it re-splits the run’s own trades into folds, re-fits nothing, and every trade lands in a test fold, so it measures how steady the result is across its history and does not lift this cap.

49 (grade D)

The edge cannot be told apart from zero or from luck: the bootstrap 95% confidence interval for the Sharpe ratio includes zero, or, after several versions were tried, the deflated Sharpe is 80% or lower.

64 (grade C)

The backtest departs from the strategy you described in part: for example, a session window you set that some trades fall outside.

39 (grade D)

The backtest does not implement the strategy you described: for example, a rule never to hold overnight, on a run where every trade was held overnight.

Verdict words

The headline on each result is one of these:

Pass + Edge

Every check has run on a held-out test (see caps), and the score is 65 or more.

Weak Edge

Every check has run, and the score is from 35 to 64.

Edge unverified

A check is still to run (send /validate to measure the rest), and the score so far is 35 or more.

Insufficient evidence

No trades, or a score below 35.

Account wiped out

The account lost everything during the test. This is checked before anything else, since a ruined account ends the test early and leaves few trades.

Warnings

Warnings sit with the result they are about. Heads up notes give context: a default that was used, a data caveat, what a figure is based on. Warning notes flag something that changes how the result should be read.

Routine notes fold into one row that says how many there are. The loudest ones, such as a rule that never fired or a result that contradicts its own code, never fold. Some warnings carry a button that applies the fix and runs again.

Look-ahead is code that reads bars it could not have seen yet; its results cannot be achieved. Every run’s code is checked against a list of known look-ahead patterns. A held-out test is also re-run with the bars after 8 cut points (20% to 70% of its window) removed, and so is every run of code you supplied or changed (your own file, /runcode, a Code-tab edit, a Pine translation) after 4 cut points (27% to 70% of its window). Code that reads only the past cannot change a trade it took before a cut, so if any such trade changes, a warning names the first by date and bar, and the run is marked invalid and not scored. A held-out test whose years closed fewer than 10 trades before the latest cut is checked over the hold-out together with the history fetched before it: look-ahead is a property of the code, not of the years. The grade-C cap stays when this check cannot run: still too few trades, a run made in segments, a shortened re-run that failed, or code whose identical runs take different trades. The check cannot see a leak that changes no trade before a cut: a high of the whole series reached before the first cut is the same high on every shortened run, and a leak that reads only a few bars ahead shows only on trades next to a cut, so it can fall between them.

More on the checks behind the numbers: Market data and FAQ.

Not answered here? Write to us through the Support page.

Reading results — QuantWright Help