Anatomy of a false-positive backtest
Take a synthetic backtest showing +161.9% ROI apart flaw by flaw — an erroneous outlier price, look-ahead quotes, a duplicate row and an unexecutable stake — and see why a published correction found the same pattern in real research.
Learning objectives
- Identify the four planted flaws in the Replication Challenge dataset and state the correct treatment of each.
- Recompute headline and corrected ROI and attribute the difference to individual rows.
- Explain how one outlier at an erroneous price drove much of the profit in Ramirez, Reade & Singleton (2023), as corrected by Clegg & Cartlidge (2025).
- Quantify how a threshold chosen from 40 trials inflates the false-positive risk.
The case: a published profit and its correction
Nothing about this is unusual or scandalous. Betting returns are heavy-tailed: one long-odds winner pays as much as dozens of short-odds winners, so a single bad price can dominate a sample. In the synthetic data below, one 10-unit winner at 41.00 earns 400 units — the profit of about 36 winners at 2.10. The lesson is procedural: every backtest needs row-level checks before anyone looks at the ROI.
- Price sanity: ratio of the recorded price to an independent consensus; investigate anything far outside the usual range.
- Timing: the quote capture time must precede kickoff (and the decision time of the rule).
- Uniqueness: one row per match, selection, quote time and price.
- Executability: stake no larger than the maximum the bookmaker accepted at that time.
- Settlement: results checked against a second source, under the market's own settlement rules.
The synthetic dataset
The Replication Challenge uses 27 fictional bets. The rule: back a selection when the recorded price is at least 7.5% above the median of other bookmakers. Stakes are 10 units, and the 7.5% threshold was chosen after trying 40 thresholds on this same sample. Twenty-two rows are clean; five carry planted flaws that mirror failures in the literature.
| Row | Flaw | Evidence in the row | Treatment |
|---|---|---|---|
| B23 | Bad price | Recorded 41.00 against a consensus of 4.10 (ratio 10.0) | Remove |
| B24 | Look-ahead | Quoted 14:17, kickoff 14:00 | Remove |
| B25 | Look-ahead | Quoted 16:05, kickoff 14:00 | Remove |
| B26 | Duplicate | Identical to B06 (match, selection, time, price) | Remove |
| B27 | Execution | Stake 50 against a maximum accepted stake of 25 | Cap at 25 |
ROI = Σ profit / Σ stakePeeling back the flaws one at a time
| Step | Bets | Wins | Staked | Profit | ROI |
|---|---|---|---|---|---|
| Headline | 27 | 13 | 310 | +501.80 | +161.9% |
| Remove B23 (41.00 vs 4.10) | 26 | 12 | 300 | +101.80 | +33.9% |
| Remove look-ahead B24, B25 | 24 | 10 | 280 | +65.80 | +23.5% |
| Remove duplicate B26 | 23 | 9 | 270 | +44.80 | +16.6% |
| Cap B27 stake at 25 | 23 | 9 | 245 | +3.55 | +1.4% |
Row B23 alone contributes 10 × (41 − 1) = 400 units, or 79.7% of the headline profit. That is the same shape as the real correction, where one erroneous long price explained much of the result. The remaining flaws matter too — together they account for another 98 units.
Now look harder at the corrected +1.4%. It depends on B27, a winner that still carries a 25-unit stake when every other bet is 10. At flat one-unit stakes the 23 corrected bets lose 2.12 units, a ROI of −9.2%; the 22 clean rows alone return −17.1% (−37.7 on 220 staked). The win rate is 9 of 23 (39.1%), with a Wilson 95% interval of 22.2% to 59.2% — comfortably containing the 40.1% break-even implied by the average odds of 2.49.
The threshold was also a choice
The rule's 7.5% threshold was the winner of 40 trials. If each trial were an independent test at the 5% level with no real effect, the chance that at least one looks significant would be 1 − 0.95⁴⁰ ≈ 87.1%. Real thresholds are correlated, so the exact figure is lower, but the direction is the point made by Bailey et al. (2014): the best of many backtests is biased upwards. A Bonferroni-style bar would require p < 0.05 / 40 = 0.00125.
FWER = 1 − (1 − α)^kWhen you write up an audit like this, report the headline and corrected figures side by side, list each changed row with its reason, give the profit attributable to each correction, and state the number of rule variants tried. Then say what the corrected sample can and cannot support. Here that is short: 23 bets cannot establish an edge in either direction, so the next step is new data, not a new threshold.
Worked example
Worked example · Auditing the Replication Challenge backtest
You receive 27 synthetic bets with a headline ROI of +161.9%. Audit them row by row before computing anything else.
- Headline
Profit 501.8 on 310 staked (13 wins from 27 bets)ROI +161.9% - Price sanity check
Ratio recorded / consensus for every row; B23 is 41.00 / 4.10Ratio 10.0 → bad price; remove (profit falls by 400) - Timestamp check
quotedAt must precede kickoff; B24 14:17 and B25 16:05 against 14:00 kick-offsTwo look-ahead rows; remove (profit falls by 19 + 17) - Duplicate check
Group by match, selection, quote time and price; B26 repeats B06Remove the copy (profit falls by 21) - Execution check
stake ≤ maxStake; B27 staked 50 with a cap of 25Cap to 25 (profit falls from 82.5 to 41.25) - Corrected result
Profit 3.55 on 245 staked; 9 wins from 23 betsROI +1.4% - Flat-stake check
Unit stakes on the 23 corrected rows−2.12 units, ROI −9.2% - Uncertainty
Wilson 95% interval for 9/23; break-even at average odds 2.49 is 40.1%22.2% to 59.2%: break-even is inside
The headline profit was dominated by invalid rows and an unaccepted portion of a stake. A small positive return remains after correction, but the sample is too small to show an edge and its sign depends on stake weighting. Verdict: no edge demonstrated; test the frozen 7.5% threshold on new data.
Practice · Run the Replication Challenge
Open the Replication Challenge. Flag every flawed row with the right category, then compare the headline and corrected ROI. Try flagging B23 alone first and note how much of the profit disappears.
Lab 5 · Research replication challenge
Synthetic · deterministic| ID | Match · pick | Kickoff | Quoted at | Odds | Consensus | Stake / max | Result | Your flag |
|---|---|---|---|---|---|---|---|---|
| B01 | Harbour City v Northvale · Home | 08-16 14:00 | 08-16 11:05 | 2.10 | 1.94 | 10 / 25 | Won | |
| B02 | Ashbridge v Millford · Away | 08-16 14:00 | 08-16 10:40 | 3.40 | 3.14 | 10 / 25 | Lost | |
| B03 | Kestrel Park v Dunmore · Home | 08-17 13:00 | 08-17 09:15 | 1.95 | 1.80 | 10 / 25 | Won | |
| B04 | Redcastle v Ferrybank · Draw | 08-23 14:00 | 08-23 12:10 | 2.60 | 2.40 | 10 / 25 | Lost | |
| B05 | Northvale v Glenrock · Away | 08-23 16:30 | 08-23 13:00 | 2.25 | 2.08 | 10 / 25 | Lost | |
| B06 | Millford v Harbour City · Away | 08-30 14:00 | 08-30 10:20 | 3.10 | 2.87 | 10 / 25 | Won | |
| B07 | Dunmore v Ashbridge · Home | 08-30 14:00 | 08-30 11:45 | 2.05 | 1.89 | 10 / 25 | Lost | |
| B08 | Glenrock v Kestrel Park · Away | 08-31 15:30 | 08-31 12:30 | 1.90 | 1.75 | 10 / 25 | Won | |
| B09 | Ferrybank v Redcastle · Draw | 09-13 14:00 | 09-13 09:50 | 2.80 | 2.59 | 10 / 25 | Lost | |
| B10 | Harbour City v Dunmore · Home | 09-13 16:30 | 09-13 14:00 | 2.40 | 2.22 | 10 / 25 | Won | |
| B11 | Ashbridge v Glenrock · Away | 09-20 14:00 | 09-20 10:10 | 3.60 | 3.33 | 10 / 25 | Lost | |
| B12 | Millford v Northvale · Home | 09-20 14:00 | 09-20 11:30 | 2.00 | 1.85 | 10 / 25 | Lost | |
| B13 | Redcastle v Kestrel Park · Away | 09-27 14:00 | 09-27 09:40 | 2.30 | 2.12 | 10 / 25 | Won | |
| B14 | Dunmore v Ferrybank · Draw | 09-27 16:30 | 09-27 13:20 | 2.75 | 2.54 | 10 / 25 | Lost | |
| B15 | Glenrock v Harbour City · Home | 10-04 14:00 | 10-04 10:00 | 1.98 | 1.83 | 10 / 25 | Won | |
| B16 | Northvale v Ashbridge · Away | 10-04 14:00 | 10-04 11:15 | 3.25 | 3.00 | 10 / 25 | Lost | |
| B17 | Kestrel Park v Millford · Home | 10-18 14:00 | 10-18 10:25 | 2.15 | 1.99 | 10 / 25 | Lost | |
| B18 | Ferrybank v Glenrock · Away | 10-18 16:30 | 10-18 12:50 | 2.50 | 2.31 | 10 / 25 | Won | |
| B19 | Harbour City v Redcastle · Home | 10-25 14:00 | 10-25 09:30 | 2.20 | 2.03 | 10 / 25 | Lost | |
| B20 | Ashbridge v Dunmore · Draw | 10-25 14:00 | 10-25 11:40 | 3.00 | 2.77 | 10 / 25 | Lost | |
| B21 | Millford v Kestrel Park · Away | 11-01 14:00 | 11-01 10:05 | 2.45 | 2.26 | 10 / 25 | Lost | |
| B22 | Northvale v Ferrybank · Home | 11-01 16:30 | 11-01 13:10 | 1.92 | 1.77 | 10 / 25 | Lost | |
| B23 | Kestrel Park v Ashbridge · Away | 11-08 14:00 | 11-08 10:30 | 41.00 | 4.10 | 10 / 25 | Won | |
| B24 | Redcastle v Northvale · Home | 11-08 14:00 | 11-08 14:17 | 2.90 | 2.12 | 10 / 25 | Won | |
| B25 | Glenrock v Millford · Draw | 11-15 14:00 | 11-15 16:05 | 2.70 | 2.49 | 10 / 25 | Won | |
| B26 | Millford v Harbour City · Away | 08-30 14:00 | 08-30 10:20 | 3.10 | 2.87 | 10 / 25 | Won | |
| B27 | Dunmore v Glenrock · Home | 11-22 14:00 | 11-22 12:00 | 2.65 | 2.45 | 50 / 25 | Won |
Educational calculator. Uses only the numbers you enter or seeded synthetic data — no live prices, no staking, no real money.
Show what you should find
Correct flags: B23 bad price; B24 and B25 look-ahead; B26 duplicate (of B06); B27 execution. Flagging B23 alone takes ROI from +161.9% to +33.9% (profit 501.8 → 101.8). All five corrections give 23 bets, 245 staked, 3.55 profit, ROI +1.4%. Flagging a clean row such as B01 is a false flag: suspicion must come from evidence in the row, not from the fact that it won.
Common mistakes
- ✗ Checking only the ROI, not the rows that produce it.Sort rows by profit contribution. If one row supplies most of the profit, verify it against an independent source before anything else.
- ✗ Deleting only losing rows that look odd.Apply the same checks to winners and losers. Here every flagged row is a winner: flawed rows that happen to win are exactly the ones that inflate a headline, so they deserve the hardest look.
- ✗ Reporting the corrected +1.4% as a smaller but real edge.With 23 bets the ROI standard error is about 25 points, and flat stakes give −9.2%. Report it as no evidence either way.
- ✗ Forgetting that the threshold was tuned on the same sample.Report the number of trials (40 here) and test the frozen rule on later data, as Clegg & Cartlidge (2025) did with post-2020 data.
When it fails
Supporting research
- Ramirez, Reade & Singleton (2023): Betting on a buzz: Mispricing and inefficiency in online sportsbooksInternational Journal of Forecasting · Peer-reviewed empiricalThe original attention-based mispricing study whose headline profitability was later corrected.
- Clegg & Cartlidge (2025): Not feeling the buzz: Correction study of mispricing and inefficiency in online sportsbooksInternational Journal of Forecasting · Peer-reviewed replicationThe correction: one erroneous outlier price drove much of the profit, returns came mainly from bookmaker mispricing, and no profits appeared after 2020.
- Bailey et al. (2014): Pseudo-Mathematics and Financial Charlatanism: The Effects of Backtest Overfitting on Out-of-Sample PerformanceNotices of the American Mathematical Society · Peer-reviewed theoryWhy a threshold chosen from many trials inflates backtest performance.
Check your understanding
Practice only: saved on this device, no XP and no account record.
