You can check a backtest's headline claims without re-running the strategy: recompute net profit, profit factor, win rate, and max drawdown straight from the trade list and confirm they reconcile with the summary. This article walks through each recomputation and what a mismatch tells you. It is educational only, not financial advice, and it is about verifying the arithmetic and internal consistency of a report — never about predicting whether a strategy will make money.
Yes. If the report includes a trade list — entry time, exit time, direction, and profit/loss per trade — you can recompute every headline number yourself and check that it reconciles with the summary. You are not reproducing the strategy logic or the data feed. You are checking one narrow but decisive thing: does the summary describe the trades it claims to summarize? A report where the arithmetic does not tie out is disqualified before you get anywhere near questions of edge. To be clear about scope: this reconciliation tells you whether a report is internally honest, not whether the strategy is or will be profitable. Nothing here predicts future returns, and nothing here should be read as advice to trade any system. A backtest that reconciles perfectly can still be curve-fit, over-optimized, or built on look-ahead bias — reconciliation is the floor, not the ceiling. The reason this matters is that most bought strategies and prop signals are sold on a summary screenshot. The trade list is where the claims can be falsified, and vendors who lead with a glossy equity curve but will not share the trade list have already told you something. If you want the arithmetic checked for you, the free [Backtest Health Check](/backtest) recomputes these figures from an uploaded trade list. This guide shows you how to do it by hand so you understand what the tool is testing.
Net profit is the plainest check and the one most often wrong. Sum the profit/loss column of the trade list. That number must equal the reported net profit after you account for commissions and fees the same way the summary claims to. If the summary says 'net of costs' but the per-trade P/L is gross, you will find a gap — and the direction of the gap tells you whether costs were quietly dropped. A common failure is a summary that reports gross profit under a 'net' label.
Profit factor is gross profit divided by gross loss: the sum of all winning trades over the absolute value of the sum of all losing trades. Recompute both sums separately.
| Metric | Formula from trade list | |---|---| | Net profit | sum(pnl) | | Gross profit | sum(pnl where pnl > 0) | | Gross loss | abs(sum(pnl where pnl < 0)) | | Profit factor | gross_profit / gross_loss |
If a report shows a profit factor above roughly 3 or 4 on a liquid, competitive market with modest trade counts, treat it as a prompt to look harder — not proof of fraud, but a number that usually reflects an in-sample fit rather than a durable property. High profit factors most often come from overfitting, which is covered in [Overfitting and Curve-Fitting Explained](/learn/overfitting-curve-fitting-explained).
Win rate is the count of trades with positive P/L divided by total trade count. Recompute it directly and watch the edge cases: are break-even trades (exactly zero P/L) counted as wins, losses, or excluded? Vendors sometimes park scratch trades wherever flatters the headline. A win rate that only reconciles if you exclude break-evens, or only if you count them as wins, is a sign the summary was reverse-engineered.
Maximum drawdown is the harder recomputation and the one most worth doing, because it is where reports most often understate risk. Build the running equity curve by cumulatively summing P/L in chronological order. Track the running peak. Drawdown at each point is peak minus current equity; max drawdown is the largest such gap. The look-ahead-clean way to write this:
equity = trades['pnl'].cumsum() running_peak = equity.cummax() drawdown = running_peak - equity max_drawdown = drawdown.max()
Note that cummax only ever looks backward — it never peeks at future equity, which is exactly the discipline you want when verifying anyone's numbers. If the report's stated max drawdown is smaller than what you compute, the most common explanation is that they measured drawdown on closed-trade equity while ignoring open-trade excursions, or measured it monthly rather than trade-by-trade. Ask which. None of this tells you the strategy is safe to trade — it tells you whether the risk figure in the summary is the risk the trade list actually contains.
Then you cannot verify it, and that is the finding. A summary without an underlying trade list is an assertion, not evidence. You can still sanity-check it against arithmetic that must hold regardless: net profit should roughly equal average trade P/L times trade count; the equity curve endpoint should match net profit; and stated Sharpe, if given, should be plausible for the volatility implied by the drawdown. But these are weak checks. A vendor who shows an equity curve image and a metrics table but withholds the trades is asking you to trust the rendering.
There is a second class of missing information that matters as much as the trades: the number of strategy variants tested to arrive at this one. A single backtest reported in isolation hides how many configurations were tried and discarded. If someone tested two hundred parameter sets and showed you the best, the reported Sharpe is inflated by selection, and you would need something like the [Deflated Sharpe Ratio](/learn/deflated-sharpe-ratio) (Bailey and Lopez de Prado) to adjust for it. Ask how many variants were run. The honest answer is rarely 'one.' For a broader map of how backtests mislead even when the arithmetic is clean, see [Why Most Backtests Fail](/learn/why-most-backtests-fail).
Run the four recomputations, then read them together rather than one at a time. A single small discrepancy is often a rounding or cost-convention difference and not damning. The pattern that should stop you is systematic bias — every discrepancy flattering the strategy. Costs dropped, break-evens counted as wins, drawdown measured on the gentlest possible basis: individually excusable, jointly a portrait of a report edited toward a conclusion.
What verification cannot do is also worth stating plainly, because it is where people over-read a clean result. Reconciliation confirms the summary matches the trades. It does not confirm the trades are real, that the data feed was point-in-time, that there was no look-ahead bias in the signal (see [Look-Ahead Bias](/learn/look-ahead-bias)), or that the sample is large enough to mean anything — for that last question see [How Many Trades Is Enough](/learn/how-many-trades-is-enough). A verified backtest is a backtest whose arithmetic you trust. It is not a promise of profit, and no honest process treats it as one. When you are ready to stress the result beyond arithmetic, the [Overfitting Check](/backtest/overfitting) and a [Monte Carlo Simulation](/learn/monte-carlo-simulation-backtests) probe robustness rather than internal consistency. Start with the reconciliation. It is the cheapest check and it disqualifies the most reports.
Educational only — not financial advice. Trading involves substantial risk of loss.