Methodology & track record
Every number below is out of sample. The model was tuned on the 2016, 2017, 2018, 2019, 2021, 2022 seasons and then run, frozen, over 2023–2025: each game was projected using only games played in earlier weeks, the way the site would have shown it before kickoff. We publish the misses with the hits, and we compare against the pregame market line so you can see where the model stands. Win probabilities are calibrated estimates, never certainties.
Held-out accuracy, 2023–2025
All Division I games with a final score, including FCS matchups. Margin MAE is the average miss on the final margin in points; Brier score and log loss grade the win probabilities (lower is better; always saying 50% scores 0.25 and 0.693).
| Set | Games | Winner | Margin MAE | Brier | Log loss | Total MAE |
|---|---|---|---|---|---|---|
| 2023 | 1,602 | 74.3% | 12.93 | 0.1692 | 0.5031 | 13.01 |
| 2024 | 1,665 | 73.6% | 12.81 | 0.1729 | 0.5121 | 12.91 |
| 2025 | 1,686 | 76.0% | 12.78 | 0.1615 | 0.4853 | 12.65 |
| All 2023–2025 | 4,953 | 74.6% | 12.84 | 0.1678 | 0.5001 | 12.85 |
| Previous model (as deployed) | 4,953 | 71.8% | 14.11 | 0.1807 | 0.5368 | 13.11 |
| Previous model (best settings) | 4,953 | 73.7% | 13.41 | 0.1709 | 0.5087 | 12.98 |
By part of the season
| Set | Games | Winner | Margin MAE | Brier | Log loss | Total MAE |
|---|---|---|---|---|---|---|
| weeks 1-3 | 1,338 | 77.1% | 13.91 | 0.1471 | 0.4406 | 12.87 |
| weeks 4-8 | 1,667 | 73.7% | 12.75 | 0.1772 | 0.5248 | 12.92 |
| weeks 9+ | 1,948 | 73.8% | 12.17 | 0.1740 | 0.5198 | 12.78 |
| FBS v FBS | 2,398 | 71.7% | 12.43 | 0.1814 | 0.5350 | 12.87 |
| FBS v FCS | 365 | 96.2% | 12.79 | 0.0364 | 0.1418 | 12.26 |
| FCS v FCS | 2,190 | 74.3% | 13.30 | 0.1749 | 0.5215 | 12.93 |
| neutral | 233 | 60.5% | 12.56 | 0.2310 | 0.6526 | 13.21 |
Are the probabilities honest?
Calibration groups every held-out game by how likely we said the favorite was to win, then checks how often it actually did. A well-calibrated model's 70% favorites win about 70% of the time.
| Favorite's win probability | Games | Predicted | Actually won |
|---|---|---|---|
| 50–60% | 1,101 | 55.0% | 55.3% |
| 60–70% | 1,081 | 65.0% | 66.5% |
| 70–80% | 994 | 74.9% | 74.8% |
| 80–90% | 833 | 84.9% | 85.7% |
| 90–100% | 944 | 95.2% | 96.5% |
Against the market line
The pregame point spread and total (the last line recorded by the odds feed before kickoff, at or near the close) are the toughest benchmark in sports forecasting: they fold in injuries, weather and a whole market's information. On the 4,589 held-out games with a recorded line, our average margin miss was 12.50 points against 11.94 for the line, and we picked the winner 74.4% of the time against the line favorite's 75.5%. On totals we missed by 12.81 points against 12.60. In plain terms: the market line is more accurate than we are, as it is for almost every public model. Where our number and the line disagreed, the final margin landed on our side of the line in 51.7% of 4,074 games — close to a coin flip, so read nothing into those disagreements. The correlation between our margin and the line is 0.94. These numbers are here for transparency only.
Model, market and blended projection
The blended projection combines our margin with the market margin using weights fitted on the training seasons only (0.17 x ours + 0.83 x market). All three are scored on the same 4,580 held-out games that had a line.
| Set | Games | Winner | Margin MAE | Brier | Log loss | Total MAE |
|---|---|---|---|---|---|---|
| Our model only | 4,580 | 74.3% | 12.51 | 0.1688 | 0.5025 | 12.81 |
| Market only | 4,580 | 75.3% | 11.95 | 0.1623 | 0.4860 | 12.60 |
| Blended projection | 4,580 | 75.5% | 11.96 | 0.1620 | 0.4852 | 12.60 |
This season
Graded results appear after the first game day.
How the model works
- Play-by-play efficiency. Every snap of every FBS game is reduced to expected points added (EPA), success rate, explosiveness, havoc, finishing drives, field position and pace, with garbage time removed (a lead over 38 points in the second quarter, 28 in the third or 22 in the fourth).
- Opponent adjustment. For points, EPA per play and success rate, every team gets an offense and a defense number from a ridge regression: what each unit produced once the quality of the opponent and home field are accounted for. Lower-division (FCS) teams sit on their own scale, measured from their games against FBS opponents.
- Preseason priors. Before a season starts, each team's numbers sit on a prior built from the last two seasons, returning production (the share of last year's offense and defense that is back), the roster talent composite, this year's recruiting class and whether the head coach changed. Each game played pulls the ratings away from the prior, so September leans on history and November on this season.
- Margin, total and win probability. A linear model fitted on the training seasons turns the rating gaps (plus home field, rest and division) into a projected margin and total. Win probability comes from a normal curve whose width was fitted for honest probabilities, and is wider early in the season when less is known.
- Matchup terms (added October 2026). Three terms sit on top of the rating gaps, each with a fixed, documented weight (points per standard deviation); the rest of the model is refitted around them. Pace x passing / explosiveness on the total: when both teams' combined pace and their combined passing efficiency (or explosive-play rate) point the same way, the total moves further out than the two would add up to: up for a fast game between leaky pass defenses, down for a slow game between stingy ones (weights 1.5 and 1.0). Trench mismatch on the margin: sack rate vs sacks allowed, run-defense stuff rate and rushing EPA vs the run game, combined into one line-of-scrimmage edge plus a signed square of it, so a lopsided mismatch moves the margin more than a small one (weights 1.5 and 1.0). Red zone: red-zone touchdown rate and points per scoring opportunity, offense against the defense it faces, on the margin (1.0) and the total (1.0). Their inputs are opponent-adjusted like everything else.
- What it does not know. Injuries, suspensions and opt-outs (a manual starting-quarterback toggle exists on matchup pages), and weather beyond a small wind adjustment on totals, which could not be backtested (historical weather needs a paid data tier). On matchup pages that wind term now reads the stored kickoff forecast for the stadium (zero under a dome); its weight is unchanged.
Matchup terms: backtest before and after
Same walk-forward test as above (every game projected only from earlier weeks). Held out: 2023-2025, model fitted on 2016-2022. 2026 to date: fitted on 2016-2025, as the live site is. Lines: DraftKings where recorded.
| Change | Margin MAE | Total MAE | Winners | Brier |
|---|---|---|---|---|
| Pace x passing/explosive (totals), held out 4,953 | 12.84 -> 12.84 | 12.84 -> 12.83 | 74.6% -> 74.6% | 0.1679 -> 0.1679 |
| Trench mismatch (margin), held out 4,953 | 12.84 -> 12.84 | 12.84 -> 12.84 | 74.6% -> 74.7% | 0.1679 -> 0.1679 |
| Red zone (margin + total), held out 4,953 | 12.84 -> 12.83 | 12.84 -> 12.86 | 74.6% -> 74.6% | 0.1679 -> 0.1678 |
| All three, held out 4,953 | 12.84 -> 12.84 | 12.84 -> 12.85 | 74.6% -> 74.6% | 0.1679 -> 0.1678 |
| All three, 2026 to date 933 | 13.77 -> 13.75 | 13.23 -> 13.21 | 77.1% -> 76.6% | 0.1602 -> 0.1601 |
Against DraftKings, held-out 2023-2025: the side the model took against the spread covered 51.6% of 2,119 games before and 52.8% of 2,097 after; over/under 51.7% before, 51.1% after. 2026 to date: against the spread 48.3% before, 48.5% after (about 800 games); over/under 49.9% before, 49.7% after. Where the model and the consensus line disagreed by 3 points or more (held out, 2,200 games), the model's side covered 51.3% when it took the road team and 51.5% when it took the home team. Fitted home field stays at 2.1 points.
Stats on game pages. Once a game has kicked off, its page shows both teams' records and season stats exactly as they stood before kickoff (stored for every game, built only from earlier weeks), so a final never shows numbers that include the game itself. Team pages and upcoming games show season-to-date numbers. Per-play numbers for a team with a weak schedule are pulled toward its opponent-adjusted value: not at all for an average or tougher schedule, fully once the schedule is one standard deviation weaker than average.
What we tried earlier and dropped as straight additions: separate run and pass ratings, explosiveness, havoc, finishing drives and field-position ratings each added nothing measurable on top of points, EPA and success rate in cross-validation. Pace, passing, explosiveness, line play and red-zone numbers now enter only through the matchup terms above. Last season's SP+ and FPI ratings and transfer-portal balance also added nothing to the preseason prior once our own ratings were in it; a head-coaching change and the recruiting class did help and are kept.
Player outlook
Every game page has a Player outlook: a projection for each established quarterback, running back and receiver (3+ games, played last game, a real role), and badges for the few whose projection sits far from their own season average. It is analysis of the matchup, not advice.
Data. Player box scores and play-by-play from ESPN's public game summaries (targets, red-zone and third-down touches, sacks per passer come from the play text), collected a few games at a time by our scheduled job and stored, never on a page view. Game weather for the backtest is the recorded observation at the nearest airport station (Iowa Environmental Mesonet archive); on the site it is the kickoff forecast. No snap counts or injury reports are used: neither has a free college source. Availability is read from the logs instead (missed last game, a new starting quarterback, teammates out).
Projection. Volume (attempts, carries, targets per game: 30% last three games, 70% season) x efficiency (yards per attempt, carry or target, catch rate), each shrunk toward the position average so a hot three-game start doesn't look like a season. Then the factors below adjust it. A probability model turns the projection, the player's game-to-game spread and how often he tops his average into the chance he finishes above (or below) that average.
Testing. Everything was fitted on the 2025 season only and then graded on 2026 games it never saw. A badge type stays only if it hit at least 55% on those 2026 games and beat the typical player's rate. The site runs exactly that 2025 fit. Generated 2026-10-24.
Badge records
| Badge | 2026 (unseen) | Typical | 2025 (fit) | Shown |
|---|---|---|---|---|
| 🎯 High passing yards | 31-25 (55%) | 49% | 124-66 (65%) | Yes |
| 🧊 Low passing yards | 32-20 (62%) | 51% | 62-16 (79%) | Yes |
| 🏃 High rushing yards | 5-6 (45%) | 36% | 91-58 (61%) | No, too few |
| 🧱 Low rushing yards | 130-45 (74%) | 63% | 177-67 (73%) | Yes |
| 🙌 High receiving yards | 12-11 (52%) | 36% | 50-46 (52%) | No, too few |
| 🔒 Low receiving yards | 63-26 (71%) | 64% | 105-20 (84%) | Yes |
| 🧲 High receptions | 0-0 | 39% | 0-0 | No, too few |
| 🪫 Low receptions | 82-48 (63%) | 57% | 110-55 (67%) | Yes |
| 📈 Receptions leader | 25-32 (44%) | 30% | 57-81 (41%) | No, below 55% |
| 🔥 TD threat | 57-31 (65%) | 39% | 144-67 (68%) | Yes |
High / Low badges are graded against the player's season average before the game; TD threat on scoring at least once; Receptions leader on leading the game in catches. Games the player sat out are left out. “Typical” is how often the same thing happened for any eligible player: yards are lopsided (a few big games lift the average), so most players finish below their average most weeks, which is why the Low badges start from a higher bar.
Projection error, 2026
| Stat | Player-games | Season avg | Our projection |
|---|---|---|---|
| Pass yds | 404 | 66.3 | 64.3 |
| Rush yds | 953 | 33.2 | 31.7 |
| Rec yds | 998 | 29.1 | 27.4 |
| Catches | 998 | 1.8 | 1.7 |
| TDs | 1656 | 0.6 | 0.5 |
Average miss per player-game (lower is better) on 2026 games: the plain season average vs our projection.
Every factor tested
Effect per unit of each factor measured on its own (2025), with its t-value; ✓ = kept by cross-validated forward selection (it had to cut the error by 0.25%+). Bold = in the model. Factors the site cannot supply at kickoff (humidity, gusts, travel, altitude, line movement) were measured but can't be used. Inputs that only exist for 2026 were measured on 2026 alone.
| Factor | Pass yds | Rush yds | Rec yds | Catches | TDs |
|---|---|---|---|---|---|
| Opponent defense | |||||
| Pass yards allowed per game | +49% t4.1 | +42% t2.9 | +34% t2.8 | +21% t2.4 | +95% t3.1 |
| Rush yards allowed per game | +24% t3.1 | +90% t7.5 ✓ | +20% t2.4 | -3% t-0.5 | +216% t7.4 ✓ |
| Pass attempts faced per game | +25% t1.4 | +7% t0.4 | +14% t0.8 | +22% t1.5 | -18% t-0.6 |
| Carries faced per game | +32% t1.7 | +124% t4.0 | +34% t1.6 | +3% t0.2 | +406% t4.5 |
| Yards per pass allowed | +59% t3.8 | +63% t3.2 | +43% t2.7 | +17% t1.5 | +224% t4.4 |
| Yards per carry allowed | +28% t2.7 | +116% t6.8 | +21% t1.9 | -6% t-0.8 | +263% t6.4 |
| Sacks per game (pressure) | -3% t-0.5 | -26% t-4.7 | -5% t-0.9 | +0% t0.1 | -39% t-4.3 |
| Explosive plays allowed (20+ pass, 15+ run) | +47% t5.3 ✓ | +57% t5.1 | +32% t3.6 | +5% t0.7 | +137% t5.4 |
| Red-zone plays allowed | +22% t2.7 | +48% t4.4 | +19% t2.3 | +9% t1.5 | +93% t4.2 |
| Points allowed per game | +34% t4.5 | +63% t6.0 | +31% t3.8 | +7% t1.2 | +154% t6.5 |
| Rushing + receiving TDs allowed | +29% t4.5 | +53% t6.0 | +24% t3.5 | +6% t1.2 | +118% t6.1 |
| Takeaways per game | -8% t-1.7 | -12% t-2.3 | -8% t-1.6 | +1% t0.2 | -27% t-3.0 |
| Receiving yards allowed to the player's position | +0% t0.2 | +2% t0.7 | +32% t3.5 ✓ | +18% t2.8 | +51% t3.5 |
| Catches allowed to the player's position | +0% t0.1 | -2% t-0.6 | +19% t1.8 | +17% t2.1 | +24% t1.4 |
| Rush yards allowed to RBs / QBs | +6% t2.2 | +38% t5.2 | +20% t2.3 | +0% t0.1 | +208% t6.8 |
| Schedule-adjusted yards allowed | +29% t4.3 | +45% t7.6 | +19% t2.7 | +10% t1.9 | +76% t6.6 |
| Strength of the defenses the player already faced | -7% t-0.4 | -8% t-0.6 | -4% t-0.2 | -5% t-0.3 | +22% t0.9 |
| Game context | |||||
| Team pass rate | -16% t-1.9 | -9% t-1.2 | -13% t-1.5 | -4% t-0.7 | +18% t1.0 |
| Pace: plays per game, both teams | +10% t0.4 | +65% t1.8 | +3% t0.1 | -4% t-0.2 | +75% t1.1 |
| Opponent offense pace | +13% t0.7 | -21% t-1.1 | +12% t0.6 | +4% t0.3 | -7% t-0.2 |
| Time of possession | -15% t-0.9 | -12% t-0.6 | -14% t-0.8 | -10% t-0.7 | -25% t-0.8 |
| Turnover margin | 0% t-0.0 | -2% t-0.8 | +1% t0.3 | +4% t2.0 | -13% t-2.8 |
| Game script | |||||
| Projected margin (favored by) | +4% t4.1 | +9% t6.3 | +5% t4.7 | +1% t0.9 | +13% t5.4 ✓ |
| Favored: margin | +5% t2.8 | +7% t3.7 | +6% t3.1 | +0% t0.2 | +15% t4.5 |
| Underdog: margin | +9% t4.2 | +22% t7.3 | +10% t4.7 | +2% t1.4 | +27% t4.6 |
| Blowout risk: favored by 21+ (starters sit) | +4% t0.8 | +10% t1.5 | +4% t0.6 | -1% t-0.1 | +31% t2.7 |
| Underdog by 21+ | -18% t-2.6 | -41% t-4.4 | -20% t-3.1 | -7% t-1.3 | -32% t-2.0 |
| Projected total | +20% t1.8 | +12% t0.9 | +24% t1.9 | +14% t1.5 | +2% t0.1 |
| Team's projected points | +26% t4.8 ✓ | +47% t6.5 | +31% t5.5 ✓ | +8% t2.2 | +67% t4.7 |
| Weather | |||||
| Wind above 10 mph | -18% t-2.9 ✓ | +7% t0.9 | -11% t-1.5 | -8% t-1.4 | -19% t-1.4 |
| Gusts above 20 mph | -11% t-2.6 | +4% t0.8 | -4% t-1.0 | -5% t-1.5 | -6% t-0.7 |
| Rain at kickoff | -16% t-3.1 ✓ | +12% t1.8 | -6% t-1.1 | -5% t-1.2 | -9% t-0.8 |
| Below 45°F | -11% t-2.4 | +6% t1.2 | +2% t0.3 | +1% t0.1 | -4% t-0.4 |
| Above 85°F | +5% t0.3 | -15% t-0.6 | -19% t-0.9 | -19% t-1.1 | -19% t-0.5 |
| Humidity above 75% | -19% t-3.5 | +6% t0.9 | -20% t-3.2 | -14% t-2.9 | -15% t-1.2 |
| Setting | |||||
| Dome | +4% t0.6 | -4% t-0.6 | +5% t0.8 | +2% t0.5 | +12% t0.9 |
| Artificial turf | -1% t-0.6 | +8% t2.3 | -3% t-0.9 | -5% t-2.4 | +0% t0.0 |
| Home / road | +2% t1.2 | +6% t3.4 ✓ | 0% t-0.0 | 0% t-0.1 | +5% t1.8 |
| Neutral site | -2% t-0.5 | -6% t-0.9 | +3% t0.5 | +8% t1.9 | -13% t-1.2 |
| Visiting a stadium above 1,200 m | -11% t-1.5 | +6% t0.7 | -10% t-1.3 | -12% t-2.3 | +9% t0.6 |
| Travel distance | +1% t0.3 | -6% t-2.0 | +1% t0.4 | +1% t0.4 | 0% t-0.1 |
| Time zones crossed | +1% t0.6 | -5% t-2.0 | +1% t0.3 | +1% t0.5 | +0% t0.0 |
| Short week (5 days or fewer) | n/a | n/a | n/a | n/a | n/a |
| Coming off a bye | +1% t0.3 | -3% t-0.9 | +1% t0.4 | +3% t1.4 | -5% t-0.8 |
| Rest days vs the opponent | -1% t-0.3 | +1% t0.3 | -2% t-0.6 | +0% t0.1 | -4% t-0.8 |
| Conference game | +1% t0.3 | +6% t1.5 | +4% t1.1 | -1% t-0.3 | +12% t1.6 |
| Bowl / postseason | +1% t0.2 | -5% t-0.8 | +4% t0.8 | +10% t2.2 | -15% t-1.4 |
| Market | |||||
| Total line movement (open to close) | +4% t1.4 | 0% t-0.0 | +3% t0.9 | +2% t0.8 | -2% t-0.4 |
| Spread movement toward the team | -3% t-1.2 | +5% t1.6 | +2% t0.8 | +2% t0.8 | -2% t-0.4 |
| Usage and form | |||||
| Last 3 games vs season | +17% t2.0 | +4% t0.8 | +6% t1.4 | -8% t-1.5 | +5% t0.3 |
| Target share | -3% t-0.0 | +2% t0.1 | -11% t-0.5 | +1% t0.1 | +23% t0.7 |
| Carry share | +8% t0.5 | +14% t0.8 | -16% t-0.6 | -30% t-2.1 | -17% t-1.2 |
| Red-zone share | +14% t0.9 | +32% t1.8 | -15% t-0.7 | -19% t-1.1 | -49% t-2.8 |
| Third-down usage | +9% t1.2 | +16% t1.7 | -19% t-1.9 | -4% t-0.5 | -2% t-0.1 |
| Yards per attempt / carry / target (air-yards proxy) | -6% t-0.5 | -9% t-1.6 | -5% t-0.4 | -15% t-1.1 | -23% t-4.8 |
| Quarterback | |||||
| Completion % | 0% t-0.0 | +2% t1.4 | +0% t0.1 | +1% t1.4 | +2% t0.5 |
| Sacks taken per dropback | -2% t-0.5 | +10% t1.8 | 0% t-0.1 | 0% t-0.0 | -5% t-0.8 |
| QB carries (scrambles and designed runs) | +2% t0.8 | +6% t1.6 | n/a | n/a | n/a |
| Availability | |||||
| Backup or new starter at QB | +22% t3.4 ✓ | +7% t1.4 | -7% t-1.8 | -5% t-1.7 | +4% t0.5 |
| Games played (sample size) | -13% t-2.7 ✓ | +20% t2.8 | +8% t1.4 | +11% t2.3 | +14% t1.1 |
| Share of team games missed | +22% t1.9 | -15% t-1.1 | -23% t-2.2 | -21% t-2.6 | +2% t0.1 |
| Teammates who sat out last game (usage shift) | +4% t0.4 | +12% t1.0 | +3% t0.3 | +4% t0.5 | +28% t1.2 |
| Existing signals (2026 only) | |||||
| Our total minus the book's total | n/a | n/a | n/a | n/a | n/a |
| “Leans high scoring” chip | n/a | n/a | n/a | n/a | n/a |
| “Leans low scoring” chip | n/a | n/a | n/a | n/a | n/a |
| “Blowout brewing” chip | n/a | n/a | n/a | n/a | n/a |
| Over minus under pattern / study / combo pills | n/a | n/a | n/a | n/a | n/a |
In the model now: Pass yds: Explosive plays allowed (20+ pass, 15+ run), Backup or new starter at QB, Rain at kickoff, Team's projected points, Wind above 10 mph, Games played (sample size) · Rush yds: Rush yards allowed per game, Home / road · Rec yds: Team's projected points, Receiving yards allowed to the player's position · Catches: base only · TDs: Rush yards allowed per game, Projected margin (favored by). Not testable with free data: snap share, injury reports and depth charts (ESPN's college feeds return none), rivalry games (no maintained free list). Existing card tags, patterns and combos were frozen only from week 7 of 2026, too few games to fit.
Elite conditions: 🔥 💎 ⭐
A search over past seasons looks for pregame conditions (game and player) that kept hitting. Every candidate must clear a shuffled-results baseline (sample sizes where luck alone rarely produces such a record) and beat what the line or the stat's base rate already implies. Then it is checked on later games the search never saw.
- 🔥 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.
The untouched 2026 record is shown on every pill. Records only, not advice.
Data sources
- Play-by-play, EPA and success rate: the open cfbfastR data releases from the SportsDataverse project. We publish our own aggregates, not the raw feed.
- Roster talent composite and returning production: the same SportsDataverse releases.
- Schedules and final scores: ESPN's public scoreboard, used for scores only (no ESPN content is republished).
- Historical point spreads and totals (benchmark only, never used in projections).
- Player box scores and play-by-play for the Player outlook: ESPN's public game summaries, reduced to our own per-player game logs.
- Recorded game weather for the Player outlook backtest: the Iowa Environmental Mesonet airport-station archive.
Full technical notes live with the code. See also the scorecard and the power ratings.
Projections are statistical estimates for entertainment and analysis only. They are not betting advice and nothing here guarantees any result.