An opponent-adjusted NFL prediction engine built in R on five seasons of play-by-play data, blended with market win totals. We tested it against the closing line for two full seasons and published everything it did, including the part nobody else shows you.
Both tables are walk-forward: the model only ever saw data available at the time, and the bias correction used on 2025 was measured on 2024, never on the season being graded.
| Against the spread | Record | Win rate | At $100 a bet |
|---|---|---|---|
| 2024 | 92-113 | 44.9% | -$3,230 |
| 2025 | 95-112 | 45.9% | -$2,820 |
| Both seasons | 187-225 | 45.4% | -$6,050 |
| Totals | Record | Win rate | At $100 a bet |
|---|---|---|---|
| 2024 | 97-108 | 47.3% | -$2,180 |
| 2025 | 110-98 | 52.9% | +$220 |
| Both seasons | 207-206 | 50.1% | -$1,960 |
Spreads are the clear failure. Losing at 45.4% across 412 picks is not bad luck, it is statistically significant underperformance, and the model is simply worse than the market at pricing a game.
Totals are the one thing that has ever looked like something. In 2025 they finished slightly ahead, and the harder the model disagreed with the market the better they got, reaching 58.7% on the 63 games where it disagreed by four points or more. We are not claiming that is an edge. Sixty-three games proves nothing, the result is not statistically significant, and 2024 totals lost money doing the same thing. It is a hypothesis worth tracking in public, which is exactly what we are doing this season.
Mean absolute error against the real result, in points. Lower is better, and the market wins every column.
| Model margin | Market margin | Model total | Market total | |
|---|---|---|---|---|
| 2024 | 10.13 | 9.29 | 10.21 | 9.78 |
| 2025 | 10.82 | 9.99 | 10.45 | 10.08 |
Roughly one point worse than the closing line, every season, in every market. Respectable for a model built by one person. Not good enough to sell.
Nothing costs money until one of two things happens in public: 55% or better across 50 graded picks, or positive closing line value across 100 tracked lines. Every pick is logged before kickoff and graded afterwards on the dashboard, wins and losses alike. If the model never earns it, the paywall never comes.