We Built 360 Features to Predict NFL Totals. The Market Beat Almost All of Them.
Our machine-learning model forecasts NFL games against the spread at a rate that's held above the 50/50 baseline across 1,500+ graded predictions. So last year we pointed the same machinery at a second target: the over/under. Same database of every game since 2002, same 360-feature pipeline, same gradient-boosting search that works on spreads.
It failed. Not "needs more tuning" failed — instructively failed, in a way that taught us more about how good the market's number is than any success would have. This is the full post-mortem, because in a genre where everyone claims to have cracked the code, we think there's more value in showing you exactly what the code refuses to give up.
The headline result: almost nothing correlates
For spread forecasting, our strongest features carry meaningful correlation with outcomes — the best single feature explains enough variance to build on. When we computed the same correlations for over/under outcomes across all 360 features, the strongest ones explained less than three-tenths of one percent of the variance (r² ≈ 0.002). That's not "weak signal." That's the statistical texture of a coin flip.
Think about what that means: rolling offensive efficiency, defensive form, points scored and allowed over every window from one game to fifteen, pace, penalties, kicking range — the total already knows all of it. Whatever public statistic you're looking at when you say "this game feels like it goes over," the number on the screen has already digested it.
Six ideas, five funerals
Correlation screens can miss conditional patterns, so we didn't stop there. We tested six specific hypotheses the way you'd want them tested — split by era, held out of sample:
- Extreme totals regress (mean reversion). Half-true, which is worse than false. Very high totals (7+ points above the season average) do lean under, and that held out of sample (~54→60%). But the mirror claim — very low totals lean over — was entirely a training-era artifact that reversed in the hold-out (55.9% over became 58.2% under). A feature built on "extremes regress" relies on both tails behaving. Only one does. We didn't build it.
- The number lags scoring inflation. When league scoring jumps, does the total take weeks to catch up? Directionally suggestive in a few seasons, noisy in most, and visibly decaying — after ~2013 the market simply got faster. The 2018 scoring explosion, the best test case in the sample, was priced almost perfectly from the start.
- Short rest suppresses scoring. Thursday games on ≤4 days' rest: 50.5% under across 279 games. Fully priced. The "sloppy tired Thursday" theory is folklore.
- Pace predicts totals misses. We quintiled games by the teams' combined prior plays-per-game. Under rate by quintile: flat at ~50% across all five. Fully priced.
- The line's own level carries information. Every derivative of the number itself we tried graded out at expectation. This deserves its own sentence: everything we tested that was derived from the market's number was already inside the market's number.
- Physical weather. The exception — see below.
The overfitting trap (a cautionary tale about "AI" predictions)
Midway through, our search produced something seductive: a feature set scoring 57.6% on held-out totals. If we sold predictions the way this industry usually does, that's the screenshot, that's the landing page, done.
It was fake, and we could prove it was fake. The model's probability calibration (Brier score) sat at 0.2503 — indistinguishable from random guessing at 0.25. Its directional calls happened to land on that particular set of seasons. Run the search again and it picked an almost entirely different feature set, equally confident. That instability is the fingerprint of a search algorithm memorizing noise: try enough combinations against a fixed answer key and one of them aces the test without learning anything.
Every "AI sports prediction" product you've ever seen advertised with a shiny hold-out accuracy number faces exactly this trap. Most never look for it. The test that catches it — force the suspicious feature into an independently chosen model and watch what happens — made our number worse, which is how we knew the 57.6% was an illusion. We threw it away.
What survived: physics
Two things — and only two — beat the number reliably, and neither is a statistic. They're weather:
- Wind at 15+ mph: ~58% of games finish under, stable across two decades.
- Rain in the forecast: ~59–60% under, also era-stable — and roughly additive with wind (~65% when both).
We wrote up the full analysis separately, but the shape of the finding matters here: both are physical inputs, both live in narrow slices of the schedule (~12% of games), and — the punchline — even these genuinely real signals made the model worse when added as features. A model input gets applied to every game; a condition that matters in one game out of eight just adds noise to the other seven. Real pattern, wrong tool.
What we did about it
We nearly didn't ship totals predictions at all. The model architecture worked, the pipeline worked, and the honest answer was still "the market's number is better than our forecast of it most weeks." The over/under projections we do publish carry the site's most conservative confidence framing, and they're graded in public like everything else — because pretending this research came out differently would have made us exactly the kind of service we built this site to be an alternative to.
What we kept: the research. The weather findings power game-condition displays across the site, the season-relative total bands became a League Trends view, and the whole exercise recalibrated how we evaluate our spread model (it's also why we publish that record, misses included).
The deepest lesson is one sentence long, and it's the maxim this project now lives by: correlation is necessary, not sufficient. A feature that genuinely relates to outcomes can still add nothing — because the question is never "is this real?" but "is this real and not already in the number?" For NFL totals, across 360 features and six hypotheses, the answer was: only the weather.
Explore the data
The totals results that fed this research — league-wide over/under records by season, game type, and conditions — are all on the SpreadTrends League Trends page, running live against every NFL game since 2002.
Research conducted on seasons 2003–2025; training era 2003–2021, hold-out 2022–2025. Model: gradient-boosted trees (LightGBM) over 360 computed trend features, with logistic regression as a cross-check.