This is the mechanics layer. I'll explain how things work conceptually; the exact coefficients, weights, and tuning constants live in the pipeline.
Aging curves — same idea, very different shapes
Every position has its own production-vs-age relationship. Running backs peak earliest and decline fastest. Wide receivers peak in their mid-20s and tail off gradually. Tight ends mature later and hold their value longer. Quarterbacks plateau the longest, often producing near peak well into their 30s. Rather than hard-code those intuitions, I fit a curve per position from decades of NFL production data.
How I forecast the next three seasons
For each player I generate four projections of points per game: now (current season), and +1, +2, +3 years. Each future projection is the age-23 estimate rolled forward by the position's aging curve, adjusted for:
- Retention probability — chance the player is still on an NFL roster in that future year. This matters more for older RBs and fringe role players.
- Role outlook — what depth-chart slot is likely, based on contract length, current usage, and upcoming free agency.
- Injury and opportunity priors — broad, league-level adjustments. No single-player guesswork.
The discount rate — why future seasons are worth less
A point of production today is worth more than a point of production two seasons from now. The player might get hurt, his role might change, the league might evolve. So when I roll Years 1–3 into Future Value, each future year gets multiplied by a discount factor less than 1.
Contract leverage as a real input, not a vibe
NFL contracts get under-used as a fantasy signal. A team that just guaranteed $50M to a wide receiver is telling you something about role and retention. I bake that into the model directly. Years left, APY as a percent of cap, guarantee rate, and the implied role multiplier all feed into both Current and Future Value through a contract-adjusted role estimate.
VORP — replacement level matters more than raw score
Raw Dynasty Value is useful, but a rank-12 QB and a rank-12 RB are not equally hard to replace. VORP (Value Over Replacement Player) subtracts a positional baseline from each player's value. What's left is how much you actually gain by rostering this player instead of the cheapest equivalent on the waiver wire.
I compute Value Over Replacement four times, once each for Dynasty, Current, Future, and Koalaty values, and report all four. Replacement levels are set per position to reflect a 12-team Superflex starting requirement.
Normalization — turning numbers into rankings
Raw Dynasty Value and raw Value Over Replacement are on hard-to-read scales. A "good" Future Value depends entirely on position and year, and the absolute numbers move week to week. To make players comparable across positions and across snapshots, I take each Value Over Replacement number, rank every eligible player against each other, and turn that rank into a percentile on a clean 0–100 scale where 100 is the best in the pool and 0 is the worst.
That percentile is what drives the letter grade. The same translation runs on each of the four model views (Current, Future, Dynasty, and Koalaty) plus on the consensus market value. Every leaderboard rank on the site is one of those percentiles in some form.
Letter grades — a percentile bucketed into A+/A/A−…F
Every normalized score on the site gets bucketed into a GPA-style letter grade. The thresholds match a school report card: A+ is the top 3%, A the next 4%, and so on down through F.
What this model is honestly bad at
No model is right about everything. The places mine is most likely to disagree with reality:
- Brand-new rookies in Weeks 1–3. The Bayesian update hasn't seen enough data to confirm or correct the prior yet, so expect bigger swings.
- Players changing roles mid-season. If a depth-chart shock lands between snapshots, the next refresh will catch up, but the current refresh might lag the news.
- Sticky-name veterans. If the market is slow to fade a long-time star, my percentile falls faster than his market rank. That shows up as Sell High on Market Watch.
- Single-week injury spikes. The rolling production windows are long, so one bad week barely moves the needle. That's a feature, but it means a "concerning trend" needs more than one game to land.