How the model works
The model answers one question for every game: how likely is the home team to win? It does that from how well each team has actually played, not from what anyone thinks of them.
What goes in
Every play in the NFL has an expected points value before and after the snap. The difference, expected points added or EPA, measures how much a play helped or hurt. We total that up per team and per game, split into passing and rushing, on offense and on defense. We also track success rate (the share of plays that keep an offense on schedule) and how efficient a team is on first and second down.
Recent games count more than old ones. Each number is a weighted average of the team's earlier games this season, where every game back in time counts about 15% less. In September there is not much to go on, so the average starts from last season's number, pulled halfway toward league average. By mid-season the current year dominates.
On top of team strength: home field, days of rest for each side, whether either team is coming off a bye, whether it is a division game, and a quarterback estimate. A timestamped quarterback report can be used only if it was observed before the prediction. Otherwise the model uses the dominant passer from the team's last completed game, or a replacement-level estimate if no earlier passer is available. That fallback may miss injuries or planned starter changes; it never discovers a starter by looking at the game it is predicting.
What never goes in
Betting lines. The closing spread and moneyline are used only to grade the model against the market, never as inputs. Historical predictions use a common Tuesday cutoff for each week. Only earlier completed games contribute team or quarterback performance. Regression tests change passer identities and dropback counts and remove target and future plays; the target game's features must stay unchanged.
The model itself
Stage one is a logistic regression on the differences between the two teams' numbers. Stage two is a gradient-boosted tree model on the same inputs, which can ship only if it beats stage one on both Brier score and log loss in the 2022 selection season. Right now stage one ships.
How it was tested
Read the complete backtest, including each season, every baseline and ten-bin calibration.
The model choice is made using 2022 alone. Its settings are then frozen for a 2023–2025 audit: each week is predicted from earlier weeks whose games were completed before the prediction cutoff. Both models are reported even when the simpler model is selected. Probabilities describe the chance of winning conditional on a decisive result. Ties are excluded from binary win-probability training and backtest scores; live ties remain visible as pushes in the record.
| Who | Games | Accuracy | Brier | Log loss |
|---|---|---|---|---|
| Stage 1 (logistic) | 854 | 63.2% | 0.2230 | 0.6364 |
| Stage 2 (boosted trees) | 854 | 63.5% | 0.2294 | 0.6519 |
| Always pick home | 854 | 54.9% | 0.2476 | 0.6883 |
| Closing-spread favorite | 854 | 67.9% | 0.2109 | 0.6096 |
| Market moneyline, vig removed | 854 | 67.9% | 0.2102 | 0.6077 |
The model does not beat the closing line. On the same 854 decisive games, the market's vig-free probabilities scored 67.9% accuracy and 0.6077 log loss; the model scored 63.2% and 0.6364. The running record will show future results either way. Calibration is measured below rather than assumed.
Calibration
Games are grouped by the model's predicted home-win probability. If the model is honest, the observed rate should track the predicted rate.
| Predicted | Games | Mean predicted | Home actually won |
|---|---|---|---|
| 0.1-0.2 | 20 | 17% | 30% |
| 0.2-0.3 | 54 | 26% | 30% |
| 0.3-0.4 | 96 | 35% | 35% |
| 0.4-0.5 | 165 | 45% | 46% |
| 0.5-0.6 | 165 | 55% | 51% |
| 0.6-0.7 | 164 | 65% | 65% |
| 0.7-0.8 | 122 | 75% | 75% |
| 0.8-0.9 | 62 | 84% | 79% |
| 0.9-1.0 | 6 | 92% | 100% |
What the historical results can tell us
This is a rebuilt historical audit using the latest nflverse files, not a replay of archived Tuesday data releases. Later statistical corrections and revised schedules can remain in those files. Current schedule starter names do not prove what was known on a historical Tuesday, so they are ignored unless separately timestamped evidence exists. Completion is conservatively approximated by a final score and at least 12 hours since kickoff. Closing market odds are a later benchmark and may have had more information than the model.
The 15 Week 5 picks issued with version 0.1.0 are preserved exactly as originally published. The quarterback repair changes future predictions and this rebuilt audit; it does not replace those original picks or invent missing historical provenance.
Data and attribution
All data comes from the nflverse project (play-by-play, team and player statistics, schedules, scores and closing lines), released under CC BY 4.0, and is loaded with the nflreadpy package. FTN charting and participation data are not used. The code is open; the pick log is append-only with a pre-kickoff timestamp on every row. New predictions also retain their quarterback inputs and provenance.
Team names on this site are city names and standard abbreviations. No league or team logos, wordmarks or trademarks are used, and this site is not affiliated with the NFL.