v1.x ranked players by per-stat z-score shape — "who do their counting stats look like?" That structurally buried elite dual-threats like Josh Allen because z-scoring is scale-invariant within era and ignored that a rushing TD scores 6 points. v2.0 replaces the engine: players are matched by their fantasy production curves under modern scoring, then projected forward against historical players with similar curves.
Before any scoring or similarity math, every historical season's raw stat line is multiplied by an empirically-calibrated position+stat+era_from→Era-4 ratio. A 2010 Peyton Manning passing-yards total becomes "what would this season produce if it happened today". The full table:
| Pos | Stat | Era 1→4 | Era 2→4 | Era 3→4 | Era 4→4 |
|---|---|---|---|---|---|
| QB | interceptions | 0.68× | 0.76× | 0.88× | 1.00× |
| QB | passing_tds | 1.11× | 1.02× | 0.87× | 1.00× |
| QB | passing_yards | 1.06× | 0.98× | 0.85× | 1.00× |
| QB | rushing_tds | 1.60× | 1.25× | 1.60× | 1.00× |
| QB | rushing_yards | 1.61× | 1.55× | 1.21× | 1.00× |
| RB | receiving_tds | 1.20× | 1.15× | 1.10× | 1.00× |
| RB | receiving_yards | 0.70× | 0.98× | 0.79× | 1.00× |
| RB | receptions | 0.76× | 0.98× | 0.83× | 1.00× |
| RB | rushing_tds | 0.96× | 1.07× | 1.07× | 1.00× |
| RB | rushing_yards | 0.91× | 0.94× | 1.00× | 1.00× |
| WR | receiving_tds | 0.69× | 0.90× | 0.90× | 1.00× |
| WR | receiving_yards | 0.67× | 0.86× | 0.88× | 1.00× |
| WR | receptions | 0.80× | 0.88× | 0.94× | 1.00× |
| WR | rushing_yards | 1.00× | 1.00× | 1.00× | 1.00× |
| TE | receiving_tds | 0.94× | 0.94× | 0.94× | 1.00× |
| TE | receiving_yards | 0.82× | 1.00× | 0.91× | 1.00× |
| TE | receptions | 0.92× | 1.04× | 0.97× | 1.00× |
Source: empirical_snapshot ·
multipliers derived from the median per-game rate within each era × position × stat cell,
clamped to [0.6, 2.0].
Era-adjusted stats are run through Superflex PPR scoring (plus
sf_ppr, 1qb_ppr, 2qb_ppr, half_ppr, std, sf_te_premium variants) to
produce a fp_per_game arc for every player-season. The result
is a per-player, per-format career arc in MODERN-fp-equivalent units —
completely free of stat-shape distortion.
The comp pool is restricted to long-arc players: retired through 2022 OR 8+ NFL seasons OR 33+ years old with 6+ seasons. Long-arc active veterans (Rodgers, Stafford, Russell Wilson) contribute only their COMPLETED seasons — the in-progress season never leaks.
v[0] = fp/g at the current age (weight 1.0)v[1] = fp/g at age-1 (weight 0.7)v[2] = fp/g at age-2 (weight 0.5)v[3] = career-avg fp/g through current agev[4] = peak-3yr-avg fp/g through current agev[5] = peak-single-season fp/g (any age through current)v[6] = career-total fp through current age (scaled / 100)v[7] = trajectory slope (fp/g per career-season)v[8] = durability (games / possible_games)v[9] = career-stage fp percentile within positionSimilarity is feature-importance-weighted inverse-distance (not cosine because we want magnitude to matter): two players with similar fp/g production trajectories under modern scoring are similar, regardless of how they earned those points.
comp_weighted_fp.peak_anchored_fp = target's projection-rate ×
17 games × expected remaining years × mid-life discount factor.
Projection-rate = max(recent_3yr × 1.10, peak_3yr × 0.90) —
blends current form with all-time ceiling so a single down year
doesn't crash a proven star.max(comp_weighted_fp, peak_anchored_fp) when the
target's peak-3yr clears the elite tier (QB ≥18, RB ≥15, WR ≥16,
TE ≥12). Sub-elite players fall back to comp-weighted.v2.0/v2.1 projected forward by similarity-weighting comps' realised post-snapshot fantasy points. That left three known overrates: small-sample players got full credit for limited NFL data, players with bust-prone comp pools got no penalty for the pool's collapse rate, and late-breakout QBs were rewarded for "years remaining" the empirical record says they rarely cash in.
v2.2 composes three multiplicative penalties on top of the v2.0/v2.1 raw projection:
bust_rate (fraction of comps who
retired by age 30 with <8 NFL seasons) and
short_career_rate (≤5 NFL seasons). Multiplier =
(1 - bust)×0.20 + (1 - short)×0.10 + 0.70, floored
at 0.65 and capped at 1.0. Clean comp pools (Allen, Mahomes,
Hurts, Lamar) score 1.0; bust-heavy pools (Anthony Richardson)
score 0.78–0.92.Stack composition order:
raw → ×survival → ×confidence + baseline×(1−conf) → ×late_breakout.
Floored at 0.20×raw and capped at 1.00×raw — penalties are penalties,
not lifts. Per-player diagnostics (bust_rate, durable_career_rate,
breakout_age, confidence) are saved to data/diagnostics/v2.2_*.json.
Dynasty value is the projected lifetime fantasy points a player will score for your roster. v1.x's stat-shape matching answered a different question ("what shape of NFL career does this player project to have?") which correlated imperfectly with fantasy production. v2.0 measures the thing we actually care about directly: fantasy points produced under modern scoring.
The base Similarity Scores page uses Superflex PPR. The Dynasty Rankings page reads per-format fp totals directly from the pre-computed arc corpus (no re-scoring needed) and recomputes positional VORP baselines under the target roster rules. v2.2 keeps two preset formats: Superflex PPR and 2QB PPR.
v3.0 adds a college→NFL similarity layer on top of the v2 NFL production engine. Skill-position college prospects are compared against a 2000+ college corpus using era-pace-adjusted, conference-tier-weighted fp/g curves. Each prospect's top-25 college comps are then bridged to NFL outcomes (where the comp eventually played) to project the prospect's career fantasy points and peak3 fp/g.
| Metric | Result | Target | Status |
|---|---|---|---|
| Hit@10 (elite in top-50) | 36% | ≥ 22% | pass |
| KTC head-to-head | 50% | ≥ 50% | pass |
| Spearman ρ (overall) | +0.203 | ≥ 0.28 | fail |
| Spearman ρ (ex-TE) | +0.274 | ≥ 0.28 | borderline |
| Bust@10 | 38% | ≥ 55% | fail (partly artifact) |
| Position | Spearman ρ | Read |
|---|---|---|
| QB | +0.249 | validated |
| RB | +0.282 | validated |
| WR | +0.276 | validated |
| TE | +0.086 | experimental |