Deep dive: how the numbers are made
Where every number comes from, how the model rates teams, where AI is (and isn't) used, and how it all stays up to date. Plain English first, with the formulas for anyone who wants them.
On this pageJump to a section
Betting lines are set by markets that see a lot of information, so they are hard to beat. What a fan can do is see the data clearly: who covered, how lines moved, how strong each team really is once you account for its schedule, and whether any pattern has actually held up over years of games.
That is what this site does. It collects public data, rates every team with a simple and fully disclosed model, tests every idea on past seasons before using it, and publishes the results, including the parts that don't work.
| Data | Source | What we use it for | History |
|---|---|---|---|
| Schedules, scores, venues | ESPN | Results, records, standings and the base of the ratings | 2015–now |
| Opening and closing spreads and totals | ESPN odds feed; for college also a multi-book consensus (cfbfastR-data) | Cover and over/under results, line movement, the market part of the prior and win probability; the track record and backtest prefer the college consensus line where one is saved, while finished game cards and team pages grade on ESPN's single-book close | 2015–now; ESPN openers only from 2024 (earlier ones copy the close) |
| Box scores: yards, plays, turnovers, passers | ESPN game summaries | Efficiency points, each team's usual starting QB, matchup stats | 2015–now |
| NFL injury report, live | ESPN | The injury card and the backup-QB adjustment for upcoming games | Live only |
| NFL final injury reports | nflverse (open data) | The usual starting quarterback as listed before kickoff, in every backtest and finished-game card | 2015–now |
| NFL play-by-play: EPA, success rate | nflverse (open data) | Matchup stats and XGBoost inputs; tested in the power ratings but not adopted there | 2015–now |
| NFL quarterback EPA | nflverse (weekly player stats) | Starter quality: the gap between the two starters' EPA per play moves the margin | 2015–now |
| College advanced stats: PPA, success rate | CollegeFootballData.com | Half of the college efficiency points, matchup stats (garbage time excluded) | 2015–now |
| Kickoff weather: wind, gusts, temperature, rain | Open-Meteo (CC BY 4.0) | Wind adjustment to totals, game conditions card | 2015–now; forecasts within 15 days |
| Headlines | ESPN, Google News | News & sentiment on game cards (on request) | Live only |
| Quarter scores and 1st-half lines | ESPN scoreboards and odds | Halftime pages: 1st-half results, 1st-half spreads and totals (real NFL lines from 2025; estimated otherwise) | 2015–now |
| Variable | What it captures | NFL | College | Status |
|---|---|---|---|---|
| Final score margin | Who won and by how much; NFL margins are capped, college margins count in full (the cap had squeezed the ratings) | cap 21 | cap none | In model |
| Opponent strength | Schedule difficulty, solved jointly for all teams | built in | built in | In model |
| Yards and turnovers | Steadier than points; turnovers kept at 35% because they barely repeat | 50% of score | 50% of score | In model XGBoost |
| EPA / PPA and success rate | Value added per play. In the NFL ratings it made totals worse; only XGBoost and the cards use it there | tested | 50% of efficiency | College XGBoost |
| Home field | Points for playing at home; zero at neutral sites | 1.75 pts | 2.5 pts | In model |
| Last season's rating | Carry-over of team strength | keep 50% | keep 75% | In model |
| Line-implied ratings | What this season's closing lines say about each team | 50% of prior | 75% of prior | In model |
| Roster talent | The 247 team-talent composite shifts each FBS team's preseason starting point, sharpening the first weeks until results take over | — | 3 pts per 1 sd of talent | College |
| Lines of games already played | Each finished game of the season is also scored the way its closing line implied, as a second, lighter training game ⓘ | — | margin 1 (fades), points 1 | College |
| FCS opponents | Every FCS team gets its own rating instead of one shared one, so an FBS team's early-season games against them count for what that opponent is worth | — | per team | College |
| Starting quarterback | Usual starter (most starts in last 4 games) out or doubtful on the injury report, plus the starters' EPA per play | −3 pts backup; 15 pts per 1.0 EPA gap | no injury data | NFL XGBoost |
| Wind at kickoff | Strong wind lowers scoring; indoor games skipped | −0.4 / mph over 5 | −0.4 / mph over 5 | In model XGBoost |
| Time zones and altitude | Points added to the home margin per extra time zone (and, in college, per km of altitude) the visitors cross or climb; the NFL sign is negative because road teams did better than the model expected. XGBoost also sees travel distance | −0.5 / zone | 0.6 / zone; 1.9 / km | In model XGBoost |
| Market spread | Share of the line in the win probability | 90% | 80% | In model XGBoost |
| Pace (plays per game) | Tempo; already reflected in offense and defense ratings | tested | tested | Shown XGBoost |
| Rest days, byes, short weeks | Days since each team's last game | tested | tested | Shown XGBoost |
| Line movement, ATS and O/U trends | Where the market moved; team cover and total history. XGBoost uses only average cover margin | — | — | Shown XGBoost |
| Temperature and rain | Kickoff conditions. XGBoost uses temperature, not rain | — | — | Shown XGBoost |
| Recency weighting, indoor bonus, season-specific home field | Ideas that sounded right but didn't improve accuracy enough to adopt | tested | tested | Not used |
| Same games, 2019–26 | NFL ratings | NFL XGBoost | College ratings | College XGBoost |
|---|---|---|---|---|
| Games | 2,054 | 5,647 | ||
| Model Favorite won | 66.2% | 66.2% | 73.4% | 73.5% |
| Brier (lower is better) | 0.2129 | 0.2123 | 0.1744 | 0.1744 |
| Average miss: margin | 10.08 pts | 9.83 pts | 12.47 pts | 12.14 pts |
| Average miss: total | 10.62 pts | 10.41 pts | 12.76 pts | 12.67 pts |
| ATS leans | 322-301 (51.7%) · -8.3u | 43-34 (55.8%) · +5.1u | 951-977 (49.3%) · -112.5u | 2-3 (40%) · -1.2u |
| O/U leans | 76-59 (56.3%) · +10.1u | 5-9 (35.7%) · -4.5u | 338-290 (53.8%) · +17.3u | 1-1 (50%) · -0.1u |
| Verdict on ATS leans | No edge | Not proven yet | No edge | No edge |
| NFL · 1,971 games | Line | Ratings | XGBoost |
| Miss: margin | 9.74 | 10.00 | 9.75 |
| Miss: total | 10.41 | 10.62 | 10.41 |
| Gap: margin | +0.26 ±0.06 | +0.01 ±0.01 | |
| Gap: total | +0.21 ±0.06 | +0.00 ±0.01 | |
| College · 5,619 games | Line | Ratings | XGBoost |
| Miss: margin | 12.12 | 12.46 | 12.13 |
| Miss: total | 12.67 | 12.76 | 12.67 |
| Gap: margin | +0.34 ±0.05 | +0.01 ±0.00 | |
| Gap: total | +0.10 ±0.04 | +0.00 ±0.01 |
| Edge | NFL ratings | NFL XGBoost | College ratings | College XGBoost |
|---|---|---|---|---|
| 1+ pts | 52.2% (1375) | 51.6% (279) | 49.8% (4131) | 44.1% (93) |
| 2+ pts | 51.5% (853) | 62.5% (16) | 49.3% (2960) | 40% (5) |
| 3+ pts | 51.3% (532) | 0% (1) | 49.2% (1998) | — |
| 4+ pts | 51.6% (308) | — | 50.4% (1250) | — |
| 5+ pts | 52.6% (173) | — | 50.3% (758) | — |
| Edge | NFL ratings | NFL XGBoost | College ratings | College XGBoost |
|---|---|---|---|---|
| 1+ pts | 49.9% (1380) | 47.7% (88) | 53.3% (4129) | 50% (238) |
| 2+ pts | 50.1% (851) | 35.7% (14) | 53.1% (2827) | 56% (25) |
| 3+ pts | 50.3% (493) | — | 54% (1799) | 50% (2) |
| 5+ pts | 56.3% (135) | — | 53.8% (628) | — |
| 7+ pts | 51.7% (29) | — | 52% (196) | — |
| Season | Games | Miss: ratings | Miss: XGBoost | ATS: ratings | ATS: XGBoost |
|---|---|---|---|---|---|
| 2019 | 267 | 10.36 | 10.22 | 50% (94) | 59.5% (37) |
| 2020 | 269 | 10.00 | 9.79 | 54% (87) | 50% (8) |
| 2021 | 285 | 10.77 | 10.69 | 52.9% (104) | 63.2% (19) |
| 2022 | 284 | 8.85 | 8.83 | 52.6% (78) | 42.9% (7) |
| 2023 | 285 | 10.36 | 10.10 | 54.9% (51) | 33.3% (3) |
| 2024 | 285 | 10.02 | 9.77 | 57% (86) | 0% (1) |
| 2025 | 285 | 10.30 | 9.61 | 45.6% (90) | 50% (2) |
| 2026 | 94 | 9.77 | 9.22 | 42.4% (33) | — |
| Season | Games | Miss: ratings | Miss: XGBoost | ATS: ratings | ATS: XGBoost |
|---|---|---|---|---|---|
| 2019 | 774 | 12.40 | 12.19 | 50% (256) | 40% (5) |
| 2020 | 534 | 13.12 | 12.80 | 52.1% (219) | — |
| 2021 | 770 | 12.88 | 12.55 | 48.5% (233) | — |
| 2022 | 776 | 12.42 | 12.03 | 46% (239) | — |
| 2023 | 792 | 12.44 | 12.13 | 47.7% (279) | — |
| 2024 | 798 | 12.54 | 12.10 | 51.6% (281) | — |
| 2025 | 808 | 12.08 | 11.82 | 50.5% (281) | — |
| 2026 | 395 | 11.77 | 11.35 | 47.1% (140) | — |
| Run (PT) | Games in data | Winner | ATS |
|---|
Ask SportsAnalysis
Uses AIPredictions
Machine learningNews tone
No AIThe code
AI-assistedFor every week of every season, the model is rebuilt using only games played before that week, then asked to predict that week's games. Those predictions are compared with the real results and the closing lines. Nothing from the future leaks in, except that kickoff weather for past games is the observed value, not a forecast. The quarterback is the usual starter as listed on the final injury report, never the one who actually played, and opening lines count only where they are real: ESPN's from 2024, the first season with real ones, and for college a multi-book consensus opener where one is saved. XGBoost is also retrained season by season, so each season is predicted by a model that never saw it. The closing line is the benchmark: see its comparison with both engines above.
| NFL | College | |
|---|---|---|
| Games scored | 2,844 | 7,955 |
| Model Favorite won | 66.2% | 73.7% |
| Win-probability error (Brier, lower is better) | 0.2121 | 0.1732 |
| Against-the-spread leans | 458-426 (51.8%) | 1278-1338 (48.9%) |
| Over/under leans | 115-92 (55.6%) | 510-447 (53.3%) |
| Leans the line later moved toward | 57% | 66% |
| Verdict on leans | No edge | No edge |
| Walk-forward 2016–26 | NFL | College |
|---|---|---|
| Games | 2,855 | 7,953 |
| Halftime leader picked | 61.9% | 69.7% |
| 1st-half ATS leans | 479-476 (50.2%) | 1117-1157 (49.1%) |
| 1st-half O/U leans | 101-106 (48.8%) | 313-299 (51.1%) |
| ATS vs real lines only | 60-72 (45.5%) | none exist |
| Average miss: margin / total | 8.17 / 7.01 pts | 9.58 / 8.89 pts |
| Verdict on leans | No edge | No edge |
- The ratings predict where the line goes. With a 2+ point gap, NFL lines moved toward the ratings in 60.5% of the 124 NFL games where the line moved (160 at that gap); college lines (3+ points) in 70% of the 390 college games where the line moved (444 at that gap). The bigger the gap, the more often it happens.
- They don't predict who covers. Graded at the opening line, those same teams covered 46.3% (74-86) in the NFL and 52.2% (229-210) in college. NFL is below the 52.4% break-even; college is below the 52.4% break-even. The market moves toward the ratings, then the game is close to a coin flip again.
- A line moving toward the pick adds little. At the closing line, spread picks the line moved toward went 12-12 (50%) in the NFL and 85-92 (48%) in college, no clear improvement on picks it moved away from. Graded at the opening line those picks look far better, but nobody can know the move in advance, so that number isn't one you could get.
| Gap | NFL | College | ||||
|---|---|---|---|---|---|---|
| Games | Moved | Covered | Games | Moved | Covered | |
| 1+ pts | 247 | 55.6% | 44.5% | 905 | 64.2% | 54% |
| 2+ pts | 160 | 60.5% | 46.3% | 661 | 67.7% | 52.2% |
| 3+ pts | 86 | 63.8% | 39.5% | 444 | 70% | 52.2% |
| 4+ pts | 44 | 67.6% | 27.3% | 295 | 74.6% | 53.1% |
| 5+ pts | 197 | 77.9% | 55.4% | |||
| 6+ pts | 133 | 79.2% | 56.9% | |||
| 7+ pts | 80 | 81.3% | 59% | |||
| 8+ pts | 53 | 82% | 68.6% | |||
| Since the open, the line moved | NFL | College |
|---|---|---|
| Spread: toward the pick | 12-12 (50%) | 85-92 (48%) |
| Spread: away from the pick | 72-66 (52.2%) | 233-219 (51.5%) |
| Spread: didn't move | 20-27 (42.6%) | 35-38 (47.9%) |
| Total: toward the pick | 1-1 (50%) | 18-18 (50%) |
| Total: away from the pick | 12-12 (50%) | 58-40 (59.2%) |
| Total: didn't move | 4-1 (80%) | 5-6 (45.5%) |
| Group | Inputs (favorite and underdog) | Weight |
|---|---|---|
| Team strength | Power-rating edge, offense and defense ratings, net EPA per play | 25% |
| Spread & move | Favorite’s closing spread, line move from the open | 20% |
| Total | Closing total, total move from the open | 15% |
| Season form | Season-to-date point differential and average cover margin | 15% |
| Situation | Conference game, season period, wind, indoors, backup QB (NFL) | 10% |
| Home / away | Home favorite, road favorite or neutral site | 10% |
| Rest | Days since each team’s last game | 5% |
For every NFL game from 2022 to 2025 we found its 50 closest games from earlier seasons only, then checked whether their cover and over rates called that game’s result. Each idea people suggest for “better” similarity was tried:
| How similarity was measured | ATS right | O/U right |
|---|---|---|
| Earlier version (spread, total, ratings edge, line move, team styles, week) | 50.4% | 49.8% |
| + pace, EPA gap, success-rate gap, wind, conference game | 50.2% | 51.2% |
| A separate totals profile (total, pace, EPA, wind) | 51.8% | 52.2% |
| Mahalanobis distance (allows for traits that move together) | 51.3% | 49.8% |
| XGBoost leaf proximity (games landing in the same tree leaves), model trained on earlier seasons only | 52.7% | 51.0% |
- Recent games counting more (recency decay): no gain on margins; a gentle decay trims the totals error slightly, not enough to adopt (see the Research log).
- Bye-week and short-week bonuses: no measurable effect once ratings are set (XGBoost still sees rest days).
- Indoor scoring bonus: totals didn't improve.
- Pace-based totals: offense and defense ratings already carry each team's tempo (XGBoost still sees pace).
- Home field re-estimated every season: a fixed, lower NFL value did better.
- NFL play-by-play EPA in the ratings: totals got worse; it's shown on cards and given to XGBoost instead.
- Backup-QB adjustment in college: no injury reports to drive it.
- Ratings built only from 1st-half scores: the scaled full-game projection did as well, so they get a small NFL share.
- A QB adjustment sized by the backup's quality (points added per dropback, NFL): win probability barely moved and margins didn't improve; the flat 3 points for a missing starter stays.
- 3rd-down, red-zone and explosive-play rates as XGBoost inputs: the NFL model got worse and college didn't change; EPA and success rate already carry it.
- Travel distance, temperature and rain in the ratings: no accuracy gain (time zones and, in college, altitude are in the ratings; XGBoost sees distance and temperature too).
- Key numbers (3, 7, 10) in win probability: a margin curve that keeps them scored slightly worse than the smooth one.
- Roster turnover in the college prior (returning production, transfer portal): no gain; the roster talent composite, tested alongside, did sharpen early-season margins and is in the college prior now (see Variables). Details
- Weighting the model's misses more: worse in the NFL, no use in college. Details
- NFL unit-level injuries, matchups and fatigue as inputs: no better than random inputs. Details
- XGBoost trees seeing fewer inputs (60% instead of 80%): differences within run-to-run noise. Details
- Only leaning when the line has moved our way: no better record than leaning regardless.
- Predicting line movement: the ratings do see where lines will move (with a big enough gap, a line that moved went toward them 60.5% of the time in the NFL and 70% in college), but betting the opening line hasn't cleared break-even over enough games yet. Real ESPN opening lines only exist from 2024, so this keeps being retested.
- Filtered "60% systems": subsets that hit 60% in one span fell back to about 50% on new seasons.