How we project
AutoDrafters Projection Model v4.0 · live since June 2026
The short version
Most fantasy projection models multiply last year's points by a recency weight and an age curve. That works until a star player misses half a season — then the model either over-projects (averaging a healthy season into the prior) or under-projects (treating an injury-truncated year as evidence of decline).
Our model separates the question into three pieces:
projection = per_game_pace × expected_games × team_contextEach piece is modeled independently. A 4-game injury season counts as 4 games of evidence about pace — not as half a season's worth of points dragging the projection down.
v4.0 adds two component-level corrections on top: rush/rec touchdowns are regressed toward what each player's yardage implies (TD counts are the noisiest part of fantasy scoring), and small-sample seasons are anchored to what the player's usage — carries, targets, dropbacks — is worth league-wide, instead of to a generic position average.
Try the model
interactive · runs in your browser using the same projectV2 function the cron usesThe headline injury case. v1 averaged elite 2023 + injury 2024 + back-to-elite 2025 and over-projected. v2 down-weights the 4-game year via shrinkage.
Per-game pace shrunk toward the position baseline of 7.5 PPG with strength κ=2. Lower κ = trust the player's data more. Higher κ = pull harder toward the average.
Per-game pace
For each player, we compute a fantasy-points-per-game estimate from their last three seasons, weighted by recency × games observed. A 17-game season at recency-tier 0.3 gets effective weight 5.1; a 4-game injury at recency-tier 0.5 gets weight 2.0. The longer healthy season dominates.
Before any weighting, each season's points are corrected for TD luck: rushing and receiving touchdowns are 85%-regressed toward the league rate implied by the player's yardage. Passing TDs are deliberately untouched — backtests show pass-TD rate is sticky QB skill, while rush/rec TD over- or under-performance is almost entirely noise year to year.
Each season's pace is then empirically Bayes-shrunk by an amount that depends on sample size. The shrinkage target is player-specific where the data allows: a season with usage data shrinks toward what that volume of carries, targets, and dropbacks scores league-wide, not toward a position median that lumps starters in with deep-bench bodies. Volume is far stickier than efficiency, which makes it the right prior for small samples.
We didn't find any other public projection system that does principled Bayesian shrinkage on per-game pace. Most either weight by raw season totals (and inherit the sample-size noise) or aggressively drop short seasons (and lose the partial-year signal).
Expected games
Independent of pace, we project how many games a player will play next year:
expected_games = career_games_rate × age_curve × injury_recencyCareer rate is the player's lifetime games-per-season average. The age curve reflects position-specific durability decline (RBs decline faster than WRs). Injury-recency multiplies based on what happened recently: a season-ending injury last year discounts expected games more than a soft-tissue partial year, which in turn discounts more than a healthy season.
This is intentionally simpler than what dedicated injury models like Draft Sharks publish (≈300 features, AUC 0.81). v3 will revisit if the gap matters.
Team context (overlay, default 1.0)
Players who switch teams or play under new coordinators don't fit the historical average. v2.0 ships with a thin overlay defaulting to 1.0, with hand-curated overrides for the highest-impact offseason changes. The overlay is opt-in per player; v2.0b will surface it as an editable field for analysts in our CMS.
Rookies
Rookies have no NFL history, so v2.0 uses a position × draft-round table with adepth_chart_openflag for the small list of rookies with a clear path to a starting role. Comparable-player modeling — finding historically similar prospects by combine, college dominator, and landing spot — is on the v3 roadmap.
How we measured it
We backtested v4.0 against actual 2023 and 2024 season totals, training only on data up through the prior season (no leakage). Compared head-to-head against v1 and the previous v3.0 on the same 576 (2023) and 588 (2024) skill-position players who played at least 4 games in those years. Hyperparameters were calibrated on the 2023 split only; 2024 is held out.
| Backtest split (PPR MAE) | v1 | v3.0 | v4.0 | Δ vs v3.0 |
|---|---|---|---|---|
| 2020–22 → 2023, all positions | 48.5 | 49.4 | 48.0 | −2.8% |
| 2020–22 → 2023, top-100 | 63.2 | 63.7 | 61.5 | −3.5% |
| 2021–23 → 2024, all positions | 50.3 | 50.8 | 49.7 | −2.3% |
| 2021–23 → 2024, top-100 | 68.4 | 64.5 | 63.7 | −1.3% |
MAE = mean absolute error in PPR points. v4.0 also improves Spearman rank correlation over v3.0 (0.645 → 0.658 on 2023, 0.644 → 0.657 on 2024) and top-24 retention (38% → 42% on 2023, 42% → 46% on 2024).
The headline structural fix: Christian McCaffrey's 2024 backtest. v1 projected him at 348.7 PPR (off by 301 vs his injury-truncated 47.8 actual). v2 projects 315.4 — about 33 PPR closer, primarily because the per-game pace shrinkage doesn't extrapolate his elite 2023 onto a year he played 4 games.
What v4.0 doesn't fix yet
Two structural gaps explain most of the remaining error:
- No team-context overlay. Mahomes after Tyreek left, a back traded into a new scheme — these are context changes the model averages out instead of explicitly weighting. The overlay field exists but still defaults to 1.0 for everyone.
- League-average efficiency in the usage prior. The usage anchor values every carry, target, and dropback at the league rate for the position. That narrowed the QB gap (a rushing QB's carries now count), but elite-efficiency outliers still get pulled toward average harder than their track record deserves.
The next step on the roadmap is the team-first decomposition: project team volumes, allocate via roles, then apply player efficiency — which addresses both gaps at once.
Where this goes
Projections refresh nightly via /api/cron/run-projections. Previous model versions stay in the database for transparency — you can compare side-by-side via the ?model=v3.0 query parameter on the rankings page.
The full design document, including math derivations, hyperparameter calibration, and the roadmap, lives in the repo at docs/projection-methodology.md.
Last updated when v4.0 shipped — June 2026. The model is recalibrated annually as new season actuals land.