Methodology Notes

Discount Rates, Aging Curves & Normalization

How a player's age, contract, and production turn into Current, Future, and Dynasty Value, and how a raw number becomes a letter grade.

← Back to Live Values

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.

Illustrative aging curves by position
QBpeak ~ 30TEpeak ~ 28WRpeak ~ 26RBpeak ~ 250%25%50%75%100%21232527293133353739REFERENCE AGEQBTEWRRBRelative ProductionAge
Stylized for clarity. The production-side model uses curves fit on real history, not the hand-drawn shapes above. The relative shapes and peak ages are realistic; the exact numbers are rounded.
💡
Why age 23 is the reference, not the peak
Think of age 23 as a common starting line. It's not where players peak (most positions peak later), but for the model to compare a 24-year-old to a 31-year-old fairly, it needs to translate both back to the same reference age. The aging curve does that translation. It takes a 27-year-old WR's actual production and converts it into "what would this same guy produce at 23?" That gives me one comparable number per player, regardless of how old he actually is. From there the curve rolls forward to project his next three seasons, and that's where the real peak ages show up: around 25 for RB, 26 for WR, 28 for TE, 30 for QB.

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.
📝
In-season Bayesian update
During the season, each weekly snapshot blends the player's preseason prior (scouting plus structural projection) with his observed production. Early in the year the prior dominates. By mid-season the observed data starts pulling the rank away from the preseason expectation.

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.

Year 1 (next season)
The largest of the three future weights. Most concrete projection — the contract is usually still active and the role is mostly visible.
Year 2
Smaller weight. Retention risk and role drift both grow. This is where contract length starts to matter.
Year 3
The smallest. By this point, depth charts, coaching staffs, and post-rookie-deal contracts are mostly guesses, and the math reflects that.
⚠️
Why I don't publish the exact rate
It's one of the few knobs that separates this model from a back-of-the-envelope projection. Position-specific tuning happens elsewhere in the system (retention curves, role multipliers, the Dynasty Score blend), so the discount itself doesn't need to do that work. The conceptual answer is more useful than a single number anyway.

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.

ExampleNewly-extended WR1WRAge 264 yrs left · 18% of cap
Just signed a top-of-position deal. Big guarantees, long term. The model widens his retention probability across Years 1–3 and bumps his role multiplier — his Future Value rises even if his per-week production held flat.
Takeaway: A contract extension is a leading indicator for the Future Value column. Watch for it; it usually predates a market-rank bump by a few weeks.
ExampleWalk-year RB on a contenderRBAge 28Last year of deal · franchise tag possible
High Current Value (heavy workload, contender offense), but low Future Value because his post-contract role is unknown and the position discount is steep at his age.
Takeaway: The model captures the "win-now asset on borrowed time" feel without you having to read a contract beat reporter every week.

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.

💡
Two players with similar Dynasty Scores
If two players land at the same Dynasty Score but the WR has higher Value Over Replacement than the QB, the WR is the more roster-defining piece. The drop from him to a waiver-wire WR is bigger than the drop from the QB to a waiver-wire QB.

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.

📝
How the headline Dynasty Score is built
The 🐨 Dynasty Score blends two percentiles: where the player ranks in my Koalaty model, and where he ranks in the consensus dynasty market. When the two agree, the score is solid. When they disagree, the gap powers the Market Watch buy/sell signals.

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.

Percentile → Letter Grade
0th percentile100th percentileFD−DD+C−CC+B−BB+A−AA+025507590100Percentile of the normalized score (VORP-based) within the league pool.
A+ ≥ 97th percentile, A ≥ 93rd, A− ≥ 90th, B+ ≥ 87th, B ≥ 83rd, B− ≥ 80th, C+ ≥ 77th, C ≥ 73rd, C− ≥ 70th, D+ ≥ 67th, D ≥ 63rd, D− ≥ 60th, F below 60th.
ℹ️
Same scale, different lenses
The same letter-grade mapping runs on every normalized column, so an A− in Current Value and an A− in Future Value are directly comparable. Both mean "top 10% of the league pool on that axis."

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.
💡
What's next
The How To Use page walks through how I actually read these numbers when I sit down to trade or draft: Value Over Replacement, quadrants, team report cards, and where the common mistakes live.