Methodology & track record
Model rebuilt Oct 29, 2026, 4:20 AM · numbers below update automatically after every game day.
Every projection on HoopVantage comes from one model, and this page shows how that model would have done on 1615 regular-season games it had never seen (2020–2025), plus every game graded so far this season. The test is walk-forward: each game is projected using only games played before it, and the model's settings were chosen on 2012–2019 and frozen before the test seasons were scored.
Out-of-sample results, 2020–2025
Compared with the closing line and our old model
| Same games | Winners | Margin MAE | Brier | Log loss | Total MAE | Top prob |
|---|---|---|---|---|---|---|
| This model | 64.8% | 10.14 | 0.220 | 0.633 | 10.33 | 94% |
| Market closing line | 66.8% | 9.76 | 0.210 | 0.608 | 10.28 | 93% |
| Previous site model | 60.7% | 11.02 | 0.246 | 0.716 | 11.32 | 100% |
The honest read: the betting market's closing line is still better than this model, by about 1.9 points of winner accuracy and 0.37 points of average margin error. That is normal — closing lines aggregate injury news, team information and a great deal of money, and very few public models beat them. Good public NFL models pick roughly 63–68% of winners; the ceiling is low because roughly a quarter of games are decided by a field goal or less. The model's margin landed closer to the final result than the closing line in 43% of games. The margin never uses a sportsbook line. The total does, since October 2026: see the totals recalibration below.
Totals recalibration (October 2026)
Our raw totals were not high against final scores: over 2016–25 they missed by 0.08 points on average. They were high against the closing total, about 1.7 points this season and 1.2 on average since 2022, and when the two disagreed by 3 or more the closing total was closer. "Model leans over" (our total 3+ above the book) went 141-173-2 (45%) to the over in 2016–25. So our total is now pulled toward the market total: our total = raw + k × (market total − raw). k is fitted each season on earlier seasons' out-of-sample totals only. Those fits came out at 0.86 or more every season, which would simply copy the market, so k is capped at 0.5: our number keeps its own opinion with half the gap. A plain mean-residual correction was tested first and made things worse. Scheduled games use the current market total (the closing total once a game has kicked off); a custom matchup with no line keeps the raw total.
| Walk-forward check | Total MAE | Avg gap to close | Leans over → over | Leans under → under |
|---|---|---|---|---|
| 2017–24 before | 10.67 | 0.3 | 113-138-2 (45%) | 92-78-2 (54%) |
| 2017–24 after | 10.53 | 0.1 | 15-6 (71%) | 4-8 (33%) |
| 2025 before | 10.51 | 0.9 | 23-24 (49%) | 6-4 (60%) |
| 2025 after | 10.40 | 0.5 | 5-1 (83%) | 0-1 (0%) |
| 2026 before | 11.44 | 1.7 | 8-13 (38%) | 2-0 (100%) |
| 2026 after | 11.04 | 0.9 | 0-2 (0%) | no games |
Graded against nflverse closing totals; 2025 was held out. After the change "Model leans over" points the right way, but it fires only on a raw gap of about 6 points, so it is rare. "Model leans under" fires even less, and its few games went the wrong way: no totals chip here is an edge on its own. The stat-trend and tail-lean records do not use our total and did not change; the combos that read it were re-run (see the alert records).
The previous version of this site rated teams from the current season's scores alone with almost no regression, so after a week or two it produced numbers like 99% favourites. Over the same games it picked 60.7% of winners with a Brier score of 0.246 and a log loss of 0.716 — worse than calling every game 50/50 (log loss 0.693).
Model, market and blended projection
The blended projection mixes the model with the de-vigged closing market. Its weights were fitted once on 2012–2019 and frozen (23% model / 83% market for the margin). All three are scored on the same 1615 test games.
| 2020–2025 | Winners | Margin MAE | Brier | Log loss | Total MAE |
|---|---|---|---|---|---|
| Model only | 64.8% | 10.14 | 0.220 | 0.633 | 10.33 |
| Market only (closing) | 66.8% | 9.76 | 0.210 | 0.608 | 10.28 |
| Blended projection | 66.5% | 9.81 | 0.211 | 0.613 | 10.29 |
The blend improves on the model everywhere, but it does not beat the closing line: the market already contains most of what the model knows. The site shows all three so you can see where the model disagrees.
2026 backtest graded against recorded closing lines
| Same games | Games | Winners | Margin MAE | Brier | Total MAE |
|---|---|---|---|---|---|
| Model | 74 | 67.1% | 8.34 | 0.223 | 10.50 |
| Closing line | 74 | 61.6% | 8.29 | 0.231 | 10.45 |
| Blended projection | 74 | 61.6% | 8.36 | 0.228 | 10.43 |
Model = the walk-forward backtest number (recomputed each model run, not the frozen pregame number; see the season record above). Closing line = the last line this site recorded before kickoff (consensus across books).
Features we tested
Rule: a feature stays only if it improves the 2012–2019 walk-forward. Kept: pace (offensive plays, totals only): -0.02 total MAE on 2012-2019. Tried and dropped because they made the backtest worse: OL/DL pressure proxy (sacks + QB hits per dropback); 4th-down aggressiveness; NGS receiver separation; short weeks; byes; non-QB injury load by snap share (WR/TE/OL, CB/S/DL/LB); pass / rush / success-rate rating splits.
Are the probabilities honest?
A calibrated model's 70% favourites should win about 70% of the time. Each row groups the test games by the favourite's projected chance and shows how often that favourite actually won.
| Favourite's chance | Games | Projected | Actually won |
|---|---|---|---|
| 50–55% | 369 | 52.5% | 55.1% |
| 55–60% | 280 | 57.3% | 60.4% |
| 60–65% | 293 | 62.3% | 60.8% |
| 65–70% | 200 | 67.5% | 67.5% |
| 70–75% | 194 | 72.3% | 75.3% |
| 75–80% | 143 | 77.2% | 72.7% |
| 80–85% | 85 | 82.2% | 77.6% |
| 85–90% | 40 | 87.2% | 90.0% |
| 90–100% | 11 | 91.7% | 81.8% |
The highest regular-season chance the model gave any team in these six seasons was 94%. It does not hand out 99%: history does not support it.
Season by season
| Season | Games | Winners | Line | Old | MAE | Line MAE | Brier | Line Brier |
|---|---|---|---|---|---|---|---|---|
| 2020 | 256 | 67.1% | 67.5% | 62.7% | 10.10 | 9.83 | 0.216 | 0.201 |
| 2021 | 272 | 63.1% | 62.4% | 57.6% | 11.10 | 10.78 | 0.223 | 0.216 |
| 2022 | 271 | 60.6% | 66.2% | 58.4% | 9.27 | 8.74 | 0.225 | 0.209 |
| 2023 | 272 | 64.0% | 68.0% | 59.2% | 10.29 | 9.90 | 0.226 | 0.219 |
| 2024 | 272 | 69.1% | 71.3% | 65.4% | 10.05 | 9.61 | 0.213 | 0.200 |
| 2025 | 272 | 65.3% | 65.3% | 60.9% | 10.02 | 9.72 | 0.220 | 0.212 |
Early season vs late
Early weeks are where the old model broke. Preseason priors keep the new one steady.
| Weeks | Games | Winners | Old | MAE | Old MAE | Top prob | Old top |
|---|---|---|---|---|---|---|---|
| Weeks 1-2 | 192 | 65.5% | 53.4% | 8.95 | 10.09 | 82% | 87% |
| Weeks 3-4 | 191 | 61.4% | 49.7% | 10.86 | 14.07 | 89% | 100% |
| Weeks 5-8 | 347 | 64.5% | 59.9% | 10.54 | 11.69 | 94% | 100% |
| Weeks 9-13 | 433 | 65.2% | 64.5% | 9.73 | 9.99 | 89% | 97% |
| Weeks 14-18 | 452 | 65.9% | 65.3% | 10.42 | 10.60 | 93% | 98% |
2026 season record
Graded from the last number the site published before each kickoff (snapshotted hourly by a scheduled job, frozen at kickoff), against the final score and the closing line. This is the honest live record. Every game is on the scorecard.
Closing line on the same games: 61.6% winners, 8.3-point margin miss, 10.4-point total miss.
2026 walk-forward backtest (recomputed every model run, not frozen)
Same games, closing line: 64.1% winners, 9.4-point margin miss. Previous site model: 56.6% winners, 11.8-point miss, Brier 0.268. These are backtest numbers: every run re-projects each game with today's model and settings, so they are not what the site showed before kickoff. A few weeks is a small sample; judge the model on the multi-season numbers above.
| Week | Games | Winners | Margin MAE | Brier |
|---|---|---|---|---|
| 1 | 16 | 68.8% | 11.62 | 0.207 |
| 2 | 16 | 56.3% | 12.89 | 0.258 |
| 3 | 16 | 62.5% | 8.04 | 0.223 |
| 4 | 16 | 68.8% | 6.76 | 0.199 |
| 5 | 15 | 71.4% | 10.29 | 0.209 |
| 6 | 14 | 64.3% | 7.00 | 0.260 |
| 7 | 14 | 64.3% | 11.22 | 0.249 |
Every game in the backtest
| Game | Projected | Chance | Final | Winner |
|---|---|---|---|---|
| Wk 7 NE @ CHI | 24–25 | Bears 54% | 24–30 | ✓ |
| Wk 7 PIT @ NO | 25–21 | Steelers 60% | 16–10 | ✓ |
| Wk 7 SF @ ATL | 27–22 | 49ers 67% | 20–29 | ✗ |
| Wk 7 CIN @ BAL | 25–23 | Bengals 57% | 35–13 | ✓ |
| Wk 7 TB @ CAR | 22–24 | Panthers 59% | 43–13 | ✗ |
| Wk 7 NYG @ HOU | 17–27 | Texans 78% | 27–21 | ✗ |
| Wk 7 IND @ MIN | 17–27 | Vikings 78% | 10–16 | ✓ |
| Wk 7 MIA @ NYJ | 19–22 | Jets 62% | 28–25 | ✗ |
| Wk 7 CLE @ TEN | 20–17 | Browns 59% | 27–24 | ✓ |
| Wk 7 DEN @ ARI | 25–20 | Broncos 66% | 30–16 | ✓ |
| Wk 7 GB @ DET | 25–30 | Lions 65% | 17–20 | ✓ |
| Wk 7 LA @ LV | 26–24 | Rams 56% | 35–21 | ✓ |
| Wk 7 KC @ SEA | 20–24 | Seahawks 61% | 3–20 | ✓ |
| Wk 7 DAL @ PHI | 22–24 | Eagles 58% | 38–21 | ✗ |
| Wk 6 SEA @ DEN | 21–20 | Seahawks 53% | 14–17 | ✗ |
| Wk 6 HOU @ JAX | 19–23 | Jaguars 62% | 34–31 | ✗ |
| Wk 6 CHI @ ATL | 26–25 | Bears 52% | 31–23 | ✓ |
| Wk 6 BAL @ CLE | 20–21 | Browns 53% | 10–13 | ✓ |
| Wk 6 TEN @ IND | 17–28 | Colts 79% | 26–20 | ✗ |
| Wk 6 NYJ @ NE | 17–27 | Patriots 79% | 19–26 | ✓ |
| Wk 6 NO @ NYG | 22–24 | Giants 57% | 34–27 | ✗ |
| Wk 6 CAR @ PHI | 21–21 | Panthers 52% | 25–14 | ✓ |
| Wk 6 PIT @ TB | 20–20 | Steelers 52% | 26–19 | ✓ |
| Wk 6 ARI @ LA | 20–32 | Rams 82% | 18–16 | ✗ |
| Wk 6 LAC @ KC | 17–26 | Chiefs 77% | 6–22 | ✓ |
| Wk 6 BUF @ LV | 30–25 | Bills 65% | 33–30 | ✓ |
| Wk 6 DAL @ GB | 25–28 | Packers 60% | 13–23 | ✓ |
| Wk 6 WAS @ SF | 22–30 | 49ers 76% | 17–23 | ✓ |
| Wk 5 TB @ DAL | 21–29 | Cowboys 73% | 24–16 | ✗ |
| Wk 5 PHI @ JAX | 18–24 | Jaguars 67% | 17–19 | ✓ |
| Wk 5 CHI @ GB | 23–23 | Packers 52% | 7–31 | ✓ |
| Wk 5 CIN @ MIA | 25–20 | Bengals 66% | 31–24 | ✓ |
| Wk 5 LV @ NE | 20–25 | Patriots 63% | 17–45 | ✓ |
| Wk 5 MIN @ NO | 24–19 | Vikings 67% | 23–13 | ✓ |
| Wk 5 CLE @ NYJ | 20–20 | Jets 51% | 12–17 | ✓ |
| Wk 5 IND @ PIT | 21–23 | Steelers 56% | 22–34 | ✓ |
| Wk 5 HOU @ TEN | 23–17 | Texans 67% | 26–3 | ✓ |
| Wk 5 NYG @ WAS | 20–24 | Commanders 64% | 27–27 | tie |
| Wk 5 DEN @ LAC | 22–21 | Broncos 55% | 23–17 | ✓ |
| Wk 5 DET @ ARI | 29–26 | Lions 61% | 45–21 | ✓ |
| Wk 5 SF @ SEA | 23–24 | Seahawks 55% | 32–29 | ✗ |
| Wk 5 BAL @ ATL | 20–24 | Falcons 62% | 30–23 | ✗ |
| Wk 5 BUF @ LA | 27–28 | Rams 54% | 37–34 | ✗ |
| Wk 4 PIT @ CLE | 19–20 | Browns 52% | 24–27 | ✓ |
| Wk 4 IND @ WAS | 26–23 | Colts 57% | 30–13 | ✓ |
| Wk 4 TEN @ BAL | 15–29 | Ravens 85% | 18–24 | ✓ |
| Wk 4 NE @ BUF | 22–27 | Bills 65% | 29–26 | ✗ |
| Wk 4 NYJ @ CHI | 19–25 | Bears 67% | 12–23 | ✓ |
| Wk 4 JAX @ CIN | 26–24 | Jaguars 55% | 22–17 | ✓ |
| Wk 4 DAL @ HOU | 23–27 | Texans 61% | 34–30 | ✗ |
| Wk 4 ARI @ NYG | 22–22 | Cardinals 52% | 24–36 | ✗ |
| Wk 4 LA @ PHI | 23–21 | Rams 58% | 24–20 | ✓ |
| Wk 4 GB @ TB | 22–19 | Packers 59% | 17–14 | ✓ |
| Wk 4 MIA @ MIN | 14–26 | Vikings 82% | 10–15 | ✓ |
| Wk 4 KC @ LV | 25–23 | Chiefs 58% | 30–27 | ✓ |
| Wk 4 LAC @ SEA | 16–25 | Seahawks 77% | 23–30 | ✓ |
| Wk 4 DEN @ SF | 21–27 | 49ers 68% | 14–24 | ✓ |
| Wk 4 DET @ CAR | 27–26 | Lions 55% | 26–32 | ✗ |
| Wk 4 ATL @ NO | 22–25 | Saints 59% | 45–24 | ✗ |
| Wk 3 ATL @ GB | 18–26 | Packers 72% | 35–14 | ✗ |
| Wk 3 LAC @ BUF | 20–29 | Bills 75% | 16–24 | ✓ |
| Wk 3 CAR @ CLE | 20–21 | Browns 53% | 18–21 | ✓ |
| Wk 3 NYJ @ DET | 21–29 | Lions 73% | 24–31 | ✓ |
| Wk 3 HOU @ IND | 23–23 | Colts 50% | 17–19 | ✓ |
| Wk 3 NE @ JAX | 22–23 | Jaguars 53% | 6–35 | ✓ |
| Wk 3 KC @ MIA | 26–20 | Chiefs 70% | 24–10 | ✓ |
| Wk 3 TEN @ NYG | 18–22 | Giants 64% | 7–12 | ✓ |
| Wk 3 CIN @ PIT | 22–21 | Bengals 52% | 27–30 | ✗ |
| Wk 3 SEA @ WAS | 25–18 | Seahawks 72% | 31–33 | ✗ |
| Wk 3 ARI @ SF | 18–30 | 49ers 82% | 30–36 | ✓ |
| Wk 3 MIN @ TB | 24–19 | Vikings 66% | 23–16 | ✓ |
| Wk 3 BAL @ DAL | 29–25 | Ravens 63% | 34–31 | ✓ |
| Wk 3 LV @ NO | 21–24 | Saints 59% | 35–27 | ✗ |
| Wk 3 LA @ DEN | 22–22 | Rams 52% | 26–30 | ✗ |
| Wk 3 PHI @ CHI | 23–21 | Eagles 55% | 7–27 | ✗ |
| Wk 2 DET @ BUF | 25–29 | Bills 64% | 31–41 | ✓ |
| Wk 2 CAR @ ATL | 19–27 | Falcons 74% | 34–3 | ✗ |
| Wk 2 NO @ BAL | 19–28 | Ravens 75% | 24–17 | ✗ |
| Wk 2 MIN @ CHI | 23–25 | Bears 57% | 9–3 | ✗ |
| Wk 2 CIN @ HOU | 22–26 | Texans 63% | 20–6 | ✗ |
| Wk 2 PIT @ NE | 18–24 | Patriots 68% | 3–20 | ✓ |
| Wk 2 GB @ NYJ | 24–22 | Packers 56% | 20–17 | ✓ |
| Wk 2 CLE @ TB | 18–24 | Buccaneers 69% | 23–19 | ✗ |
| Wk 2 PHI @ TEN | 25–17 | Eagles 74% | 24–20 | ✓ |
| Wk 2 JAX @ DEN | 23–21 | Jaguars 57% | 13–20 | ✗ |
| Wk 2 LV @ LAC | 20–24 | Chargers 63% | 26–14 | ✗ |
| Wk 2 SEA @ ARI | 24–19 | Seahawks 64% | 31–7 | ✓ |
| Wk 2 WAS @ DAL | 27–28 | Cowboys 53% | 20–37 | ✓ |
| Wk 2 MIA @ SF | 18–28 | 49ers 79% | 13–35 | ✓ |
| Wk 2 IND @ KC | 20–27 | Chiefs 70% | 30–33 | ✓ |
| Wk 2 NYG @ LA | 23–27 | Rams 64% | 6–28 | ✓ |
| Wk 1 NE @ SEA | 20–25 | Seahawks 64% | 10–13 | ✓ |
| Wk 1 SF @ LA | 24–26 | Rams 56% | 27–7 | ✗ |
| Wk 1 CHI @ CAR | 24–22 | Bears 56% | 59–37 | ✓ |
| Wk 1 TB @ CIN | 24–27 | Bengals 59% | 27–33 | ✓ |
| Wk 1 NO @ DET | 21–28 | Lions 71% | 30–31 | ✓ |
| Wk 1 BUF @ HOU | 22–24 | Texans 55% | 36–31 | ✗ |
| Wk 1 BAL @ IND | 25–26 | Colts 51% | 41–23 | ✗ |
| Wk 1 CLE @ JAX | 17–24 | Jaguars 72% | 10–34 | ✓ |
| Wk 1 ATL @ PIT | 17–25 | Steelers 73% | 13–20 | ✓ |
| Wk 1 NYJ @ TEN | 21–21 | Titans 52% | 23–10 | ✗ |
| Wk 1 ARI @ LAC | 20–27 | Chargers 72% | 26–14 | ✗ |
| Wk 1 MIA @ LV | 21–22 | Raiders 50% | 13–27 | ✓ |
| Wk 1 GB @ MIN | 22–25 | Vikings 62% | 22–39 | ✓ |
| Wk 1 WAS @ PHI | 20–26 | Eagles 68% | 22–24 | ✓ |
| Wk 1 DAL @ NYG | 24–25 | Giants 52% | 20–28 | ✓ |
| Wk 1 DEN @ KC | 21–22 | Chiefs 55% | 10–31 | ✓ |
Projections here are the model's pregame numbers computed from games before each week (the same walk-forward rule as the backtest). The scorecard separately grades the numbers the site actually displayed before each kickoff.
How the model works
- Data. Every play since 2009 from nflverse play-by-play (expected points added, success rate, win probability), plus schedules, rest days, stadium roof and surface, weather, starting quarterbacks, injury reports, depth charts, snap counts, Next Gen Stats, team and player stats and PFR pressure data.
- Team ratings. Each team gets an offense and defense rating twice: in points per game and in EPA per play (garbage time removed). Both are opponent adjusted, so a good day against a strong defense counts for more.
- Preseason priors. A new season starts from last season's ratings regressed 30% toward average. The prior counts as 9 games for the points rating and 4 for the EPA rating, so two or three blowouts cannot swing a team to the top of the board.
- Quarterbacks. Every QB has a value in EPA per dropback, shrunk toward replacement level until he has thrown enough and faded across seasons. A game's QB adjustment is the starter's value minus the value of the QBs the team's rating was built on, so a backup starting (or a star returning) moves the number and a normal week does not. Starters come from the schedule, checked against the injury report and depth chart.
- Situation. Home field is worth 2.62 points before travel; the visitor loses 0.66 per 1,000 miles travelled and 0.09 per time zone. Net of travel, the average home edge is close to 2 points, in line with recent seasons. Rest differences count up to 1.37 points for a full week. Totals drop 0.36 per mph of wind above 10 and 1.40 per 10°F below 40; domes add 2.17.
- Margin, total, probability. The weights on each input are fitted on past seasons only (2010–2025, recent seasons counting more). The margin becomes a win probability through a logistic curve fitted on those seasons' out-of-sample projections (slope 0.129 per point): a 3-point favourite wins about 60%, a 7-point favourite about 71% and a 14-point favourite about 86%.
- Total vs the market. On a scheduled game the total is pulled 50% of the way toward the market total (fitted on earlier seasons, capped at half). See the totals recalibration above.
- Updates. The whole pipeline reruns on a schedule after every game day, re-tests itself and publishes new ratings, projections and this page.
Player outlook
Every player with 3+ games gets a projected line for passing yards, rushing yards, receiving yards, catches and touchdowns. The base is his own season: volume (attempts, carries, targets; the last three games weigh 35%) times efficiency (yards per attempt, carry and target and catch rate, pulled toward the position average by 40–120 plays). Then each factor the backtest kept moves it up or down. Players listed out or doubtful on the injury report get no projection; their share of targets and carries counts as "teammates out" for everyone else.
Data: nflverse weekly player stats, snap counts, play-by-play (red-zone usage), injury reports and schedules (CC BY 4.0). Every factor below was tried alone and in a forward selection scored on seasons it was not fitted on; only the kept ones (bold) are used.
| Stat (2025–26) | Season avg miss | Base miss | Model miss |
|---|---|---|---|
| Pass yds (462) | 64.6 | 64.26 | 62.7 |
| Rush yds (912) | 24.44 | 24.26 | 24.06 |
| Rec yds (2054) | 24.3 | 23.84 | 23.16 |
| Catches (2054) | 1.72 | 1.71 | 1.68 |
| TDs (1956) | 0.53 | 0.52 | 0.49 |
Every factor tested (33 per stat)
| Group | Factor | Pass yds | Rush yds | Rec yds | Catches | TDs |
|---|---|---|---|---|---|---|
| Opponent defense | What this defense allows to the player's position (the same stat) | +52% t3.3 ✓ | +42% t4.3 ✓ | +16% t2.1 | +25% t3.3 | +7% t1.6 |
| Opponent defense | Pass yards allowed per game | +52% t3.3 | -36% t-2.6 | +29% t2.2 | +23% t2.1 | +12% t0.8 |
| Opponent defense | Rush yards allowed per game | +11% t1.2 | +50% t3.5 | +4% t0.5 | -3% t-0.5 | +24% t2.2 |
| Opponent defense | Points allowed per game | +25% t2.3 | -0% t-0.0 | -2% t-0.2 | -1% t-0.2 | +26% t2.2 |
| Game script | Team's projected points from the line | +30% t3.9 ✓ | +15% t1.6 | +24% t3.6 ✓ | +12% t2.2 | +18% t2.3 |
| Game script | Projected margin (favored by) | +3% t2.1 | +2% t1.1 | +3% t2.6 | +2% t1.6 | +4% t3.1 |
| Game script | Favored: margin | +5% t2.3 | +4% t1.3 | +5% t2.6 | +4% t2.2 | +7% t2.9 |
| Game script | Underdog: margin | -3% t-1.4 | -1% t-0.5 | -4% t-1.9 | -1% t-0.6 | -6% t-2.4 |
| Game script | Favored by 10+ | +6% t1.4 | +10% t1.5 | +6% t1.5 | +4% t1.1 | +7% t1.4 |
| Game script | Underdog by 10+ | -3% t-0.7 | +3% t0.5 | -2% t-0.4 | +4% t1.1 | -7% t-1.5 |
| Game script | Game total | +6% t3.1 | +3% t1.2 | +3% t2.0 | +2% t1.4 | -2% t-0.8 |
| Game context | Team pace (plays per game) | -47% t-3.1 ✓ | -64% t-3.9 ✓ | -38% t-2.6 | -45% t-3.9 | -13% t-0.7 |
| Game context | Opponent pace | +10% t0.5 | -27% t-1.2 | -21% t-1.3 | -13% t-0.9 | -27% t-1.4 |
| Weather | Wind 15+ mph, open air | -16% t-3.7 ✓ | -10% t-1.7 | -9% t-2.1 | -5% t-1.5 | -10% t-2.1 |
| Weather | 32°F or colder | -3% t-0.5 | +12% t1.5 | -5% t-0.9 | -4% t-0.8 | -4% t-0.7 |
| Setting | Dome / closed roof | +2% t0.9 | -3% t-0.9 | +1% t0.4 | +1% t0.5 | +7% t2.5 |
| Setting | Home / road | +2% t1.4 | +1% t0.7 | +3% t2.9 | +2% t2.3 | +4% t3.0 |
| Setting | Short week (5 days or fewer) | +9% t1.8 | -5% t-0.8 | +5% t1.1 | +6% t1.7 | +3% t0.6 |
| Setting | Coming off a bye | -6% t-1.5 | -3% t-0.5 | -11% t-2.8 | -9% t-2.7 | -7% t-1.5 |
| Setting | Division game | -2% t-1.0 | -6% t-1.9 | -1% t-0.4 | -1% t-0.4 | -2% t-0.7 |
| Setting | Week 13 or later | -7% t-2.9 | -1% t-0.3 | +1% t0.3 | +1% t0.8 | -1% t-0.4 |
| Usage and form | Volume, last 3 games vs season | -15% t-1.7 ✓ | +17% t2.4 | -12% t-2.3 | -13% t-3.0 | +10% t1.5 |
| Usage and form | Target / carry share, last 3 vs season | -99% t-0.5 | +77% t3.0 | -51% t-2.2 | -56% t-3.0 | +30% t0.7 |
| Usage and form | Snap share last game vs season (snap counts) | +64% t4.6 ✓ | +117% t6.6 ✓ | +47% t4.5 ✓ | +41% t4.8 ✓ | +39% t3.2 |
| Usage and form | Season snap share | -13% t-1.0 | +6% t0.8 | +47% t6.0 ✓ | +27% t4.4 ✓ | +9% t1.5 |
| Usage and form | Target share | +1018157% t1.3 | +30% t0.9 | +85% t3.6 | +28% t1.7 | +7% t0.4 |
| Usage and form | Carry share | -29% t-2.2 | +9% t0.8 | -20% t-3.9 | -19% t-4.5 | +13% t2.1 |
| Usage and form | Red-zone share (carries + targets inside the 20) | -6% t-0.3 | +22% t1.4 | -17% t-1.7 | -23% t-3.0 | -11% t-1.0 |
| Usage and form | Air yards share | -100% t-1.5 | +0% t0.0 | +41% t3.9 | +23% t2.9 | -6% t-0.7 |
| Availability | Listed questionable | -6% t-0.8 | -8% t-1.1 | -5% t-1.1 | -2% t-0.5 | -8% t-1.5 |
| Availability | Teammates out / doubtful (their target or carry share) | -15% t-2.4 | +18% t2.5 | +4% t0.6 | +10% t1.7 | -6% t-0.7 |
| Availability | Backup or new starter at QB | +0% t0.0 | +1% t0.2 | -4% t-1.4 | -2% t-0.9 | -2% t-0.6 |
| Availability | Games played (sample size) | -7% t-1.4 | +2% t0.2 | +1% t0.2 | +6% t1.4 | -0% t-0.1 |
Effect = change in the stat per unit of the factor, fitted alone on 2021–23; t = how many standard errors from zero. ✓ = kept by the selection. Many factors that look strong alone add nothing once volume and the line are in the base.
| Badge | 2025 | 2026 | 2025–26 | Typical | 2021–23 / 2024 | Status |
|---|---|---|---|---|---|---|
| 🎯 High passing yards | 20-12 (63%) · 3 void | 7-4 (64%) | 27-16 (63%) · 3 void | 52% | 33-27 (55%) · 4 void / 13-8 (62%) · 1 void | On cards |
| 🧊 Low passing yards | 121-108 (53%) · 16 void | 14-7 (67%) | 135-115 (54%) · 16 void | 48% | 447-283 (61%) · 54 void / 123-124 (50%) · 13 void | Dropped |
| 🏃 High rushing yards | 22-12 (65%) · 3 void | 5-4 (56%) | 27-16 (63%) · 3 void | 42% | 82-52 (61%) · 1 void / 15-12 (56%) | On cards |
| 🧱 Low rushing yards | 63-34 (65%) · 9 void | 6-3 (67%) · 2 void | 69-37 (65%) · 11 void | 58% | 218-80 (73%) · 50 void / 92-31 (75%) · 12 void | On cards |
| 🙌 High receiving yards | 1-0 (100%) | 2-0 (100%) | 3-0 (100%) | 40% | 1-2 (33%) / 2-2 (50%) | Dropped |
| 🔒 Low receiving yards | 176-82 (68%) · 38 void | 44-20 (69%) · 9 void | 220-102 (68%) · 47 void | 60% | 565-242 (70%) · 93 void / 215-102 (68%) · 28 void | On cards |
| 🧲 High receptions | 0-0 (–) | 0-0 (–) | 0-0 (–) | 40% | 0-0 (–) / 0-0 (–) | Dropped |
| 🪫 Low receptions | 177-84 (68%) · 15 void | 86-44 (66%) · 6 void | 263-128 (67%) · 21 void | 60% | 481-233 (67%) · 44 void / 159-91 (64%) · 8 void | On cards |
| 📈 Receptions leader | 42-45 (48%) · 2 void | 7-14 (33%) | 49-59 (45%) · 2 void | 18% | 125-147 (46%) · 7 void / 42-42 (50%) · 1 void | Dropped |
| 🏈 TD threat | 35-45 (44%) · 2 void | 15-11 (58%) | 50-56 (47%) · 2 void | 33% | 115-115 (50%) · 8 void / 58-43 (57%) · 2 void | Dropped |
Fitted on 2021, 2022, 2023, thresholds set on 2024, tested on 2025 and 2026 (never used for fitting). "Typical" = how often any eligible player landed on that side of his own season average. A badge type shows on cards only at 55%+ on 30+ test badges and above the typical rate. Void = the player didn't play. Records only, not advice.
🔥 Undefeated finder
Every one- and two-part combination (three-part ones were tested too) of the board's pregame building blocks (both teams' league-rank thirds frozen before kickoff and the offense-vs-defense edges between them, line / total / implied-total buckets, our walk-forward number vs the line, venue, division game, rest, roof, recorded kickoff weather, season stage, each team's last result and cover) is searched on 2016–2021 (1548 regular-season games with a closing line) for six outcomes (favorite / underdog wins and covers, over, under). A condition is kept only if it hit 75%+ on at least the sample bar (0–50 games, set per outcome and tier where shuffled results produce fewer than one by chance), the record is under 1% likely from the line alone (big favorites winning doesn't count), and it then held up on 2022–2025 (1087 games it never saw). 2026 (107 games so far) is the untouched test record.
- 🔥 Undefeated: no losses on every game found and checked.
- 💎 Near-perfect: 90%+ on every game found and checked.
- ⭐ Elite: 72%+ and 10+ points better than usual on games it never saw (20+ of them, 40+ in all). Each ⭐ shows the typical rate next to its record so the edge is visible.
Luck check: the whole pipeline on 10 shuffles of the results (moved only between games with similar spreads) keeps 0 conditions per shuffle by chance. Real run (2026-10-27): 0 survivors. Walk-forward (each season searched only on the seasons before it): 0-0 on 0 flagged games across 7 seasons. Player conditions use the same guards on 2021–2023 player games, validated on 2024–2025 and tested on 2026: 0 kept, 0.1 per shuffle by chance. Re-run by the weekly refresh. Records only, not advice.
Limits
- Final NFL margins scatter about 12.9 points around even a good projection; an 80% range for any game is roughly ±17 points.
- Only quarterbacks are valued individually. Other injuries, coaching changes and late-week news move closing lines but not this model.
- In the backtest, past games use the recorded kickoff weather and the announced starting quarterback; upcoming games use a forecast and the expected starter.
Market data sources
Market lines are shown as neutral data for comparison. The scheduled lines job (never a page view) walks a fallback chain: The Odds API (US books plus Pinnacle, within its monthly credit budget), then ESPN's odds feed, then Action Network's public scoreboard, then the published nflverse line. When a game card still has no line, the site fills that gap from ESPN's scoreboard, Action Network, nflverse closing lines and finally the last stored copy; those scraped fallbacks run only on gaps, are rate-limited and cached, and every use is logged. Each card names its book and source. Kalshi and Polymarket win-probability markets are shown as a separate signal. The line a game had at kickoff is kept as its closing line and graded above.
| Source | Status | Games | Checked |
|---|---|---|---|
| The Odds API | idle (idle this run (called Tue / Sat / Sun mornings to save credits)) | 0 | Oct 29, 2026, 3:21 AM |
| ESPN odds feed | ok | 28 | Oct 29, 2026, 3:21 AM |
| nflverse schedules | ok | 28 | Oct 29, 2026, 3:22 AM |
| Kalshi | ok | 28 | Oct 29, 2026, 3:22 AM |
| Polymarket | ok | 28 | Oct 29, 2026, 3:22 AM |
| Action Network | idle | 0 | Oct 27, 2026, 7:16 PM |
Which source is serving each game card's line this season:
| Served by | Games | Newest read |
|---|---|---|
| ESPN odds feed | 77 | Oct 28, 3:15 PM EDT |
| nflverse closing lines | 33 | Sep 26, 10:34 AM EDT |
| The Odds API | 12 | Oct 25, 9:17 AM EDT |
Fallback uses logged (lines, schedule, scores, stats, weather): 166 in total — lines via nflverse closing lines 63× · schedule via ESPN (browser agent) 42× · lines via nflverse schedules (lines job) 31× · schedule via ESPN CDN mirror 28× · lines via ESPN scoreboard 1× · schedule via ESPN site API refused 1×.
- Oct 29, 5:18 AM EDT · lines via nflverse closing lines (1 game) — no stored line for these games
- Oct 28, 11:13 PM EDT · lines via nflverse closing lines (1 game) — no stored line for these games
- Oct 28, 10:59 PM EDT · lines via nflverse closing lines (1 game) — no stored line for these games
- Oct 28, 9:08 PM EDT · lines via nflverse closing lines (14 games) — no stored line for these games
- Oct 28, 8:42 PM EDT · lines via nflverse closing lines (1 game) — no stored line for these games
- Oct 28, 4:11 PM EDT · lines via nflverse closing lines (1 game) — no stored line for these games
Market data for comparison only, not advice. 21+. Gambling problem? Call 1-800-GAMBLER.
Weather on game cards
Every card shows the kickoff forecast at the stadium, switching to current conditions (“Now”) from three hours before kickoff, “Indoors (dome)” for fixed roofs, and the recorded game-time weather once a game is final. Stadium coordinates and roof types come from our own checked venue table (all 30 NFL stadiums plus the international grounds). US forecasts and observations come from the National Weather Service; international venues use MET Norway. If those have nothing, the card falls back to ESPN's game weather, then nflverse's recorded kickoff weather for finals, then the last stored copy, and each fallback use is logged above. A scheduled job refreshes forecasts every two hours for the next seven days and every 15 minutes around kickoffs; pages only read the stored copy. The model's totals use the same kickoff forecast for wind, cold and roof.
| Served by | Games | Newest read |
|---|---|---|
| NWS | 20 | Oct 29, 1:56 AM EDT |
| Indoors (venue table) | 7 | — |
| MET Norway | 1 | Oct 25, 7:18 AM EDT |
Last weather run Oct 29, 2:25 AM EDT: NWS ok (12) · MET Norway ok (1) · NWS current ok (1) · MET Norway current ok (1) · ESPN game summary ok (1).
Data and credits
- Data: nflverse (nflverse.com), CC-BY 4.0
- Weather: National Weather Service (weather.gov, US public data); MET Norway (api.met.no), CC BY 4.0, for international venues
- nflverse data is licensed under CC BY 4.0; see github.com/nflverse/nflverse-data.
Projections are statistical estimates for entertainment and analysis only. They are not betting advice and nothing here guarantees any result.