I've been backtesting strategies on a home GPU for months now, and the results pile up fast — one run spits out a file, the next run spits out another, and eventually you've got thousands of them sitting on disk. I finally sat down and ran a proper audit across all of it. Not one strategy family, not one grand GPU run. Every single file. 14,925 of them, containing 152,484 individual backtest records across 1,400 unique pairs.

Then I applied the same viability standard I use everywhere on this blog — enough trades to mean something, a profit factor and win rate that survive being checked instead of just glanced at, nothing propped up by quietly averaging into a loser. What came out the other side: 269 viable records, belonging to just 9 unique pairs.

The funnel nobody screenshots

Every backtest post on this blog talks about a winner. Nobody publishes the denominator. Here's mine:

Stage Count Survival
Result files scanned14,925
Individual backtest records152,484100%
Unique pairs tested1,400
Records that were actually viable2690.18%
Unique pairs that had at least one viable record90.64% of pairs

Read that last row again. Out of 1,400 different pairs I ran a backtest on at some point, 9 produced a result worth trusting. Not 9 configs — 9 pairs, out of everything Binance lists that I bothered to test. Everything else either never worked, worked on too few trades to mean anything, or looked good only because the strategy was quietly rescuing itself with averaging-down.

What actually cleared the bar

The 9 viable pairs split into two groups. Seven were already on my radar — pairs the override system had flagged going in, before I even ran this specific audit: AVAAIUSDT, EWJUSDT, GOOGLUSDT, LABUSDT, LLYUSDT, MRVLUSDT and ZROUSDT, spanning the range_bounce and volume_reversal families.

The other side is the part I actually cared about: this specific archive-wide pass surfaced 6 new candidates that weren't in that list before. I can only vouch for two of them with real numbers cited, because those are the two I pulled the full stats on:

New candidate Family PF WR Trades dca1_rate
BSBUSDTrange_bounce6.8675.0%20024.5%
BILLUSDTvolume_reversal4.6398.6%14228.9%

BSBUSDT stands out for the reason I actually trust it a little: a PF of 6.86 with a win rate of only 75%, not 96%+. When the profit factor and win rate aren't both suspiciously high at once, it's usually a sign the edge is coming from trade sizing and exits doing real work, not from a strategy that just never loses on paper. BILLUSDT is the opposite shape — a near-perfect 98.6% win rate — which is exactly the pattern I've learned to be careful with elsewhere on this blog. Both got marked GOOD_FOR_DEEP_TEST, which means candidate, not confirmed. Neither has been through the kind of multi-quarter stability check I now require before I'd call something validated.

Not the same number as "85 million backtests"

I've written before about running roughly 85 million parameter combinations through a single strategy family on a gaming GPU in one grand run. That's a different number measuring a different thing — one run, one family, one screening pass down to a shortlist. This audit is the archive: every file, every run, every family, going back through everything I've generated. The two numbers shouldn't be added together and they're not measuring the same funnel, but they land on the same conclusion from two completely different angles. Almost nothing survives contact with real standards, whether you're looking at one afternoon's GPU run or a year of accumulated files.

What a 0.64% survival rate actually tells me

It's not a discouraging number, it's the honest one. If I'd only ever looked at my best single runs, I'd have a folder full of impressive-looking profit factors and no idea how representative any of them actually are. Auditing everything at once — including the failures I never wrote a post about — is the only way to know the real base rate. Out of 1,400 pairs, 9 held up. That's the number I'd want before risking anything on any of them, and it's a lot smaller than it feels like when you're staring at one good-looking result in isolation.

Before I trust any single backtest number again, I run the worst-case outcome through risk of ruin and max drawdown — because a pair clearing this audit's bar tells you it survived scrutiny, not that it can't still go badly.

What to check before trusting your own backtest archive

  1. Audit everything, not just your best run. A single grand GPU screen tells you what one strategy family can do. A full-archive audit tells you your actual base rate.
  2. Be suspicious of a perfect win rate paired with a huge profit factor. BSBUSDT's 75% WR / 6.86 PF combination reads as more trustworthy than a 98%+ WR precisely because it isn't suspiciously clean.
  3. "Candidate" is not "confirmed." GOOD_FOR_DEEP_TEST means a result cleared the first bar, not that it's survived the multi-quarter stability check that separates a real edge from a lucky sample.
  4. Run the survivors through downside math before trusting them. I use risk of ruin and DCA survival on anything that clears the audit before I'd call it done.

→ Risk of ruin calculator · → DCA survival calculator · → Max drawdown calculator

FAQ

What did this backtest audit actually cover?

Every backtest result file I had on disk — not one run, the whole archive. 14,925 files containing 152,484 individual backtest records, spanning 1,400 unique trading pairs across multiple strategy families including range_bounce and volume_reversal. The audit re-checked every one of them against the same viability standards I use throughout this blog.

Why did so few pairs survive?

Because most backtest results that look good on the surface don't hold up once you apply real standards — enough trades to mean something, a profit factor and win rate that aren't a small-sample fluke, and results that aren't quietly propped up by averaging into losers. Out of 152,484 records only 269 cleared that bar, and those 269 records belonged to just 9 unique pairs out of the 1,400 tested. A 0.64% pair-level survival rate isn't a bug in the process, it's what happens when you stop counting the highlight reel and count everything.

How is this different from the "85 million backtests on a GPU" posts?

Those posts cover one grand GPU run of a single strategy family, screening roughly 85 million parameter combinations down to a shortlist. This audit is different — a full-archive review across every file, every run and every strategy family I've ever produced, 14,925 files and 152,484 records in total, not one run's output. The two numbers measure different things and shouldn't be added together, but they tell the same story from two angles: most of what gets backtested doesn't survive scrutiny.

What made a record count as viable?

The same standard I apply everywhere on this blog: enough trades for the numbers to mean something, a profit factor and win rate that survive being checked rather than just glanced at, and no hidden reliance on averaging down to manufacture a win rate. Records that failed any of those checks didn't count, which is why 152,484 records shrank to 269 viable ones before the pair count was even taken.

Share: 𝕏 Post
Trade on:BybitBinanceOKX|📈 TradingView
Risk of Ruin CalculatorDCA Survival CalculatorMax Drawdown CalculatorProfit Factor Calculator