Evidence
This half asked whether a model can beat the closing line. It cannot — which is exactly why the other half uses the line instead of fighting it.
Equity curve
Cumulative profit, every bet in order. A flat-to-drifting line on a sample this size is the signature of no edge — not of bad luck.
By period
The same bets split into four consecutive stretches. An edge that only exists in one of them is a story about that period.
What the backtest actually says
The two findings that settle it
Is the model better than picking at random?
Random selection inside the same odds band, on the same fixtures, at the same best-of-bookmaker prices. It lands near zero rather than at a loss because shopping for the top price already strips out the bookmaker margin. The model finishes below that line, which means its selections are actively harmful rather than merely weak: it keeps backing the side the market prices as too short, and the market keeps being right. Every time this model 'finds value', what it has really found is its own largest error.
| Selection rule | Bets | ROI |
|---|---|---|
| Random pick in band | 44,895 | -0.29% |
| This model | 19,211 | -4.49% |
| Difference | -4.20pp |
Model vs the closing price
Brier score over every scored match, lower is better. This is the cleanest test there is: it uses all matches rather than only the ones the model liked. The closing price is the better forecaster. If the model cannot out-predict the market, no staking rule or filter will turn it into profit — the edge has to come from forecasting, not from bet selection.
| Brier (lower better) | Log loss | |
|---|---|---|
| Model | 0.6154 | 1.0261 |
| Market close | 0.5972 | 0.9990 |
Three rescues that did not survive
Do the filters survive out of sample?
Filters like “drop this league” or “cap the edge” are chosen by a human looking at results, which is exactly how a backtest gets flattered. So the sample is split by date: the filters were picked on the first half and are scored here on the second, which never influenced them. The gain survived, which is the encouraging direction — a rule that only works on the data that produced it is a description of the past. Note the out-of-sample interval still includes zero, so this is a promising direction, not a demonstrated edge.
| Half | Span | Bets | ROI before | ROI after | Gain |
|---|---|---|---|---|---|
| Train (chose the filters) | Apr 2021-Mar 2024 | 7,466 | -1.76% | -1.74% | +0.02pp |
| Test (never consulted) | Mar 2024-Oct 2026 | 7,535 | -7.25% | -6.80% | +0.45pp |
Small disagreements beat big ones
Every bet split into ten equal groups by the edge the model claimed. The ranking is inverted: the model's *small* disagreements with the market pay, and its large ones lose. That is not a paradox — it follows from the market being the better forecaster. When this model says it is twenty points better than the closing line, the overwhelmingly likely explanation is that the model is wrong, not that the market is. A big claimed edge is a error signal, so capping edge from ABOVE is the counter-intuitive move that survives out-of-sample testing.
| Decile | Edge range | Bets | Win rate | ROI |
|---|---|---|---|---|
| 1 | 3.0-3.4% | 1,922 | 46.1% | -5.23% |
| 2 | 3.4-3.8% | 1,921 | 46.3% | -3.93% |
| 3 | 3.8-4.2% | 1,921 | 46.6% | -3.67% |
| 4 | 4.2-4.7% | 1,921 | 45.5% | -5.14% |
| 5 | 4.7-5.3% | 1,921 | 46.0% | -3.83% |
| 6 | 5.3-5.9% | 1,921 | 46.2% | -3.47% |
| 7 | 5.9-6.7% | 1,921 | 44.8% | -5.44% |
| 8 | 6.7-7.8% | 1,921 | 45.4% | -4.11% |
| 9 | 7.8-9.5% | 1,921 | 44.0% | -6.62% |
| 10 | 9.5-25.6% | 1,921 | 44.1% | -3.46% |
Does a wider odds band help?
The same model and edge threshold, run over different price ranges. The band is not an arbitrary restriction — it is a filter on the model's own worst errors. Removing it entirely (1.01-99.00) drops ROI to -6.92% with an interval that excludes zero, i.e. a reliably losing strategy: at extreme prices the model backs long-odds home underdogs, which is exactly its known bias. A narrow band buys accuracy at the cost of sample size. Note this table is a diagnostic, not a tuning dial — picking the best-scoring row would be fitting the parameter to the test set.
| Odds band | Bets | Win rate | ROI | 95% CI |
|---|---|---|---|---|
| 1.70-2.00 | 5,575 | 52.1% | -2.26% | [-4.7%, +0.2%] |
| 1.60-2.50 | 19,211 | 45.5% | -4.49% | [-6.0%, -3.0%] |
| 1.50-3.00 | 28,935 | 42.0% | -4.89% | [-6.2%, -3.6%] |
| 1.01-99.00 | 78,544 | 27.9% | -6.92% | [-8.2%, -5.7%] |
Where the bets actually came from
Which market is worth modelling?
Totals (Over/Under) and 1X2 are separate bets on the same model. Totals produce far more qualifying selections, because a two-way market prices closer to even money more often — which means a much tighter confidence interval for the same seasons of data. Neither market's interval clears zero, so neither has demonstrated an edge — but the totals interval is narrow enough that a real edge of a few percent would have shown up by now.
| Market | Bets | Avg odds | Win rate | ROI | 95% CI |
|---|---|---|---|---|---|
| O/U 2.5 | 14,775 | 2.09 | 46.4% | -4.22% | [-5.9%, -2.5%] |
| 1X2 | 4,436 | 2.25 | 42.4% | -5.39% | [-8.7%, -2.2%] |
Which leagues carry the result?
Each competition is modelled separately, so these are independent-ish samples of the same strategy. If profit comes from one league only, you have found a quirk of that league — or noise — rather than a method. Per-league samples are small; treat the ordering as indicative.
| League | Bets | Win rate | ROI |
|---|---|---|---|
| IRL-PREMIERD | 74 | 50.0% | +11.12% |
| CHN-SUPERLEA | 104 | 50.0% | +7.91% |
| ROU-SUPERLIG | 123 | 45.5% | +2.57% |
| ARG-LIGAPROF | 103 | 43.7% | +2.17% |
| FIN-VEIKKAUS | 84 | 46.4% | +1.60% |
| SWZ-SUPERLEA | 181 | 46.4% | +0.30% |
| BRA-SERIEA | 156 | 44.9% | +0.12% |
| GSL | 565 | 47.1% | +0.09% |
| BL2 | 622 | 48.2% | -0.11% |
| PPL | 694 | 45.7% | -0.55% |
| SC3 | 451 | 49.2% | -0.81% |
| ENL | 1305 | 48.1% | -1.60% |
| SPL | 487 | 46.2% | -1.77% |
| PL | 770 | 47.0% | -2.04% |
| EL2 | 1203 | 47.1% | -2.15% |
| PD | 721 | 45.2% | -2.86% |
| BJL | 747 | 46.2% | -3.06% |
| BL1 | 644 | 48.6% | -3.80% |
| MEX-LIGAMX | 143 | 43.4% | -4.32% |
| ELC | 1298 | 45.1% | -4.74% |
| SA | 814 | 44.7% | -4.75% |
| SD | 886 | 46.4% | -5.07% |
| FL2 | 777 | 46.3% | -5.15% |
| TSL | 719 | 44.6% | -6.09% |
| SB | 798 | 44.5% | -6.58% |
| SC2 | 438 | 46.1% | -6.82% |
| DED | 489 | 44.8% | -7.40% |
| NOR-ELITESER | 126 | 42.9% | -7.58% |
| SWE-ALLSVENS | 128 | 43.0% | -7.67% |
| EL1 | 1346 | 43.4% | -7.96% |
| SCH | 451 | 44.6% | -9.80% |
| USA-MLS | 366 | 41.0% | -9.81% |
| FL1 | 776 | 42.1% | -10.49% |
| RUS-PREMIERL | 130 | 40.8% | -11.88% |
| JPN-J1LEAGUE | 124 | 40.3% | -12.61% |
| POL-EKSTRAKL | 170 | 38.8% | -13.51% |
| ARG-COPADELA | 52 | 36.5% | -15.50% |
| AUT-BUNDESLI | 74 | 36.5% | -18.74% |
| DNK-SUPERLIG | 72 | 31.9% | -30.61% |
What held up anyway
Does a bigger edge pay better?
Bets grouped by the edge the model claimed at the time. If the edge number carries information, ROI should climb down this table. It does, which is weak evidence the estimate is meaningful.
| Claimed edge | Bets | Win rate | ROI |
|---|---|---|---|
| 3-5% | 8699 | 46.0% | -4.67% |
| 5-8% | 6921 | 45.5% | -4.37% |
| 8-12% | 2920 | 44.4% | -4.62% |
| 12%+ | 671 | 44.1% | -2.87% |
Is the model calibrated?
Every model probability bucketed against how often that outcome actually happened. A calibrated model sits on the diagonal. Miscalibration matters more than accuracy here: a model that says 45% when the truth is 40% will invent edge on exactly the bets it feels most confident about.
| Predicted | Cases | Avg predicted | Actually happened | Gap |
|---|---|---|---|---|
| 5-15% | 2,390 | 12.2% | 6.8% | -5.4pp |
| 15-25% | 36,953 | 22.1% | 20.4% | -1.7pp |
| 25-35% | 77,758 | 28.9% | 28.0% | -0.9pp |
| 35-45% | 36,122 | 39.9% | 40.0% | +0.2pp |
| 45-55% | 21,430 | 49.2% | 52.6% | +3.4pp |
| 55-65% | 6,363 | 58.8% | 66.0% | +7.2pp |
Is the result stable over time?
The sample split into four equal blocks by date. A real edge is boring — similar returns throughout. The periods broadly agree, which is what you want to see.
| Period | Span | Bets | ROI |
|---|---|---|---|
| Period 1 | Apr 2021 - Jan 2023 | 4803 | -1.74% |
| Period 2 | Jan 2023 - Mar 2024 | 4803 | -1.41% |
| Period 3 | Mar 2024 - Aug 2025 | 4803 | -7.94% |
| Period 4 | Aug 2025 - Oct 2026 | 4802 | -6.87% |
By market
| Market | Bets | Win rate | Avg odds | ROI | 95% CI |
|---|---|---|---|---|---|
| O/U 2.5 | 14,775 | 46.4% | 2.09 | -4.22% | [-5.9%, -2.5%] |
| 1X2 | 4,436 | 42.4% | 2.25 | -5.39% | [-8.7%, -2.2%] |
Odds band sweep
Widening the band buys sample size and costs accuracy, monotonically. It is a diagnostic, not a dial: picking the best-scoring row would be fitting a parameter to the test set.
| Band | Bets | Win rate | ROI | 95% CI |
|---|---|---|---|---|
| 1.70-2.00 | 5,575 | 52.1% | -2.26% | [-4.7%, +0.2%] |
| 1.60-2.50 | 19,211 | 45.5% | -4.49% | [-6.0%, -3.0%] |
| 1.50-3.00 | 28,935 | 42.0% | -4.89% | [-6.2%, -3.6%] |
| 1.01-99.00 | 78,544 | 27.9% | -6.92% | [-8.2%, -5.7%] |