Skip to content

Explore WCWins

Track 4 · Professional Research Lab · Lesson 21 of 24

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.

  1. Price sanity: ratio of the recorded price to an independent consensus; investigate anything far outside the usual range.
  2. Timing: the quote capture time must precede kickoff (and the decision time of the rule).
  3. Uniqueness: one row per match, selection, quote time and price.
  4. Executability: stake no larger than the maximum the bookmaker accepted at that time.
  5. 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.

The five flagged rows (all teams fictional)
RowFlawEvidence in the rowTreatment
B23Bad priceRecorded 41.00 against a consensus of 4.10 (ratio 10.0)Remove
B24Look-aheadQuoted 14:17, kickoff 14:00Remove
B25Look-aheadQuoted 16:05, kickoff 14:00Remove
B26DuplicateIdentical to B06 (match, selection, time, price)Remove
B27ExecutionStake 50 against a maximum accepted stake of 25Cap at 25
ROI = Σ profit / Σ stake
Stake-weighted return. With unequal stakes, a single large winning stake can move it a long way.

Peeling back the flaws one at a time

Cumulative corrections
StepBetsWinsStakedProfitROI
Headline2713310+501.80+161.9%
Remove B23 (41.00 vs 4.10)2612300+101.80+33.9%
Remove look-ahead B24, B252410280+65.80+23.5%
Remove duplicate B26239270+44.80+16.6%
Cap B27 stake at 25239245+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 − α)^k
Family-wise error rate: the probability of at least one false positive among k independent tests at level α.

When 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.

  1. HeadlineProfit 501.8 on 310 staked (13 wins from 27 bets)ROI +161.9%
  2. Price sanity checkRatio recorded / consensus for every row; B23 is 41.00 / 4.10Ratio 10.0 → bad price; remove (profit falls by 400)
  3. Timestamp checkquotedAt must precede kickoff; B24 14:17 and B25 16:05 against 14:00 kick-offsTwo look-ahead rows; remove (profit falls by 19 + 17)
  4. Duplicate checkGroup by match, selection, quote time and price; B26 repeats B06Remove the copy (profit falls by 21)
  5. Execution checkstake ≤ maxStake; B27 staked 50 with a cap of 25Cap to 25 (profit falls from 82.5 to 41.25)
  6. Corrected resultProfit 3.55 on 245 staked; 9 wins from 23 betsROI +1.4%
  7. Flat-stake checkUnit stakes on the 23 corrected rows−2.12 units, ROI −9.2%
  8. UncertaintyWilson 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
A fictional research note claims a spectacular return. Audit its 27 recorded bets (fictional teams, synthetic data). Flag each row you believe is invalid. Selection rule: bet when the recorded price is at least 7.5% above the consensus price. The 7.5% threshold was chosen after testing 40 thresholds on this same sample.
Claimed ROI (as recorded)+161.9%
Claimed profit501.8 on 310
ROI after your flags+161.9%
Bets after your flags27
Times are UTC. Consensus = median price of the other bookmakers at the same moment. Stakes in units.
IDMatch · pickKickoffQuoted atOddsConsensusStake / maxResultYour flag
B01Harbour City v Northvale · Home08-16 14:0008-16 11:052.101.9410 / 25Won
B02Ashbridge v Millford · Away08-16 14:0008-16 10:403.403.1410 / 25Lost
B03Kestrel Park v Dunmore · Home08-17 13:0008-17 09:151.951.8010 / 25Won
B04Redcastle v Ferrybank · Draw08-23 14:0008-23 12:102.602.4010 / 25Lost
B05Northvale v Glenrock · Away08-23 16:3008-23 13:002.252.0810 / 25Lost
B06Millford v Harbour City · Away08-30 14:0008-30 10:203.102.8710 / 25Won
B07Dunmore v Ashbridge · Home08-30 14:0008-30 11:452.051.8910 / 25Lost
B08Glenrock v Kestrel Park · Away08-31 15:3008-31 12:301.901.7510 / 25Won
B09Ferrybank v Redcastle · Draw09-13 14:0009-13 09:502.802.5910 / 25Lost
B10Harbour City v Dunmore · Home09-13 16:3009-13 14:002.402.2210 / 25Won
B11Ashbridge v Glenrock · Away09-20 14:0009-20 10:103.603.3310 / 25Lost
B12Millford v Northvale · Home09-20 14:0009-20 11:302.001.8510 / 25Lost
B13Redcastle v Kestrel Park · Away09-27 14:0009-27 09:402.302.1210 / 25Won
B14Dunmore v Ferrybank · Draw09-27 16:3009-27 13:202.752.5410 / 25Lost
B15Glenrock v Harbour City · Home10-04 14:0010-04 10:001.981.8310 / 25Won
B16Northvale v Ashbridge · Away10-04 14:0010-04 11:153.253.0010 / 25Lost
B17Kestrel Park v Millford · Home10-18 14:0010-18 10:252.151.9910 / 25Lost
B18Ferrybank v Glenrock · Away10-18 16:3010-18 12:502.502.3110 / 25Won
B19Harbour City v Redcastle · Home10-25 14:0010-25 09:302.202.0310 / 25Lost
B20Ashbridge v Dunmore · Draw10-25 14:0010-25 11:403.002.7710 / 25Lost
B21Millford v Kestrel Park · Away11-01 14:0011-01 10:052.452.2610 / 25Lost
B22Northvale v Ferrybank · Home11-01 16:3011-01 13:101.921.7710 / 25Lost
B23Kestrel Park v Ashbridge · Away11-08 14:0011-08 10:3041.004.1010 / 25Won
B24Redcastle v Northvale · Home11-08 14:0011-08 14:172.902.1210 / 25Won
B25Glenrock v Millford · Draw11-15 14:0011-15 16:052.702.4910 / 25Won
B26Millford v Harbour City · Away08-30 14:0008-30 10:203.102.8710 / 25Won
B27Dunmore v Glenrock · Home11-22 14:0011-22 12:002.652.4550 / 25Won
Is the 7.5% threshold evidence of an edge?

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

Check your understanding

1. In the synthetic dataset, what share of the headline profit comes from row B23?
2. Which treatment is correct for a row whose stake exceeds the bookmaker's maximum?
3. What did Clegg & Cartlidge (2025) find when extending the tennis data beyond 2020?

Practice only: saved on this device, no XP and no account record.

Saved on this device only.
Anatomy of a false-positive backtest · Value Academy · WCWins