Methodology
How the projections are made, how we tested them, and what didn't work. Every number below is from a pre-registered test; the code and logs are public on GitHub.
The model, step by step
- Baseline. A recency-weighted average of a player's past full-PPR points (each game's weight halves every 8 games). Everything else has to beat this.
- Opportunity × efficiency. Points = opportunities (targets, carries, pass attempts) × points per opportunity. Both are estimated separately and shrunk toward league and long-run averages (empirical Bayes), so a few big games don't over-count.
- Betting market. Sportsbook game totals and spreads give each team's implied points. That sets how much offense to expect (volume) and how valuable each touch is (scoring environment).
- Median, not mean. Fantasy scores are skewed: a few huge weeks pull the average up. A per-position correction, fitted by least absolute deviations, turns the average into the median, the number that minimises the typical miss.
- Floor and ceiling. The 10th and 90th percentiles, fitted on past seasons and widened for more volatile players. In the 2025 test, 82.7% of top-player outcomes landed between them (target: about 80%).
- Injuries. Players designated Out on the injury report are removed. Questionable players keep their projection.
Rules we hold ourselves to
- No look-ahead. A projection for a week only uses information available before that week's kickoff. All backtests are walk-forward.
- Earn every feature. An idea only enters the model if it lowers error on seasons it wasn't fitted on, with the test written down before running it.
- Holdout discipline. Developed on 2018–2023, validated once on 2024, final test once on 2025. Neither was used to tune.
- Significance, not just wins. Comparisons use a paired bootstrap on per-player errors, resampling whole weeks so that players in the same week aren't treated as independent.
Results on held-out seasons (Big 60 vs the baseline)
| Test | Baseline MAE | Model MAE | p-value | Weeks won |
|---|---|---|---|---|
| 2024 validation (one time) | 6.506 | 6.349 | 0.002 | 15 of 18 |
| 2025 final test (one time, the live model) | 6.589 | 6.295 | < 0.001 | 16 of 18 |
A lower MAE (average miss in fantasy points) is better. These tests are against our own baseline, because past ESPN or Yahoo projections aren't freely available. Comparison with a real platform (Sleeper) starts live in 2026: see the Big 60 scoreboard.
What didn't work
Tested properly and rejected. We keep these because a model that only reports its successes can't be trusted.
- Week-of-season ramp (early / mid / late season): Slightly worse out of sample
- Week 1 effect (position-level and player-specific): No significant gain; player-specific version was worse
- Prime-time games: No gain; a placebo test also exposed (and we fixed) a fitting bug
- Bad weather (wind ≥ 15 mph or ≤ 32°F, outdoors): No gain on top players
- Opponent strength vs position (schedule-adjusted): No gain; defensive strength barely persists week to week once shrunk
- Vacated opportunity (redistributing an injured teammate's targets): No gain, tested twice
- Team context on its own (share × team's historical volume): No gain until combined with betting lines
Known limitations
- News that breaks minutes before kickoff may be missed. Those players are handled by the inactive rule in grading, the same for every source.
- Players with no NFL history (most rookies before their first game) get no projection. If one is in a platform's top 60, he is dropped from both sides and the count is published.
- Questionable players are projected as if they will play their usual role.
- Sleeper's projections endpoint is part of its public API but isn't listed in its documentation. We use it under Sleeper's non-commercial API terms and publish only our error statistics.
Data
Player stats, snap counts, schedules, betting lines, rosters and injury reports come from nflverse (CC BY 4.0). Projections refresh automatically every day and every 3 hours Thursday–Sunday, and each game's projection is locked at kickoff for grading.