Methodology
How every number on RotoStandings is computed, in plain English.
The problem: raw stats can’t cross eras
Stephen Curry made 402 three-pointers in 2015-16. Larry Bird never made more than 98 in a season. Does that make Curry four times the shooter? Of course not: Bird played in an era when the entire league barely used the three-point line. The same trap is everywhere. Wilt Chamberlain’s rebound totals came in games with far more missed shots to grab, 1930s hitters batted in a league without night games or relief specialists, and a 1970s running back carried the ball twice as often as today’s committee backs. Compare raw numbers across decades and you mostly measure the era, not the player.
The fix: per-season z-scores
A z-score answers one question: how far above or below average was this player, measured against the other players from that same season? A z of 0 is exactly league average. A z of +2 means roughly “better than about 98% of the league that year.” Bird’s 1986 season is scored against 1986 peers, Curry’s 2016 against 2016 peers, and suddenly the two are on the same yardstick: not “who made more threes” but “who towered further above his own league.” That per-season normalization is the core of everything on this site. It automatically absorbs pace, rule changes, season length, and every other era effect, because each season is only ever compared to itself.
Categories where less is better (turnovers in basketball, ERA and WHIP in baseball) are inverted, so avoiding them scores positive.
Ranking players: sum the z-scores
A player-season’s score on the Seasons board is simply the sum of its category z-scores. Elite in many categories adds up; terrible in one subtracts. This is the same math the major fantasy platforms’ player raters use under the hood. Careers extend the idea: a career’s score is its seasons’ z-scores summed (the Sum lens, which rewards longevity) or averaged (the Average lens, which measures per-season greatness and lets a short, brilliant peak compete with a twenty-year grind). We never compute a fresh z-score over lifetime totals: that would quietly re-open the era-fairness problem the per-season scores solved.
Every board also offers a Totals vs Per-game basis. Totals reward durability, the way a real roto season accumulates; per-game asks who was most dominant on any given night. Both are pre-computed, and the toggles just choose which columns to sum, so re-ranking is instant.
Ranking teams: the Roto Champ
The Roto Champ answers a different question: which real team would have won a fantasy league that season? Each franchise becomes a fantasy roster, scored the classic rotisserie way: rank all the teams in each category, award placement points (worst gets 1, best gets the number of teams), and sum the points into standings.
- NBA: each team is its top 10 players by minutes played, scored across the nine categories. The fixed roster size keeps counting stats fair between deep benches and short rotations.
- MLB: each team is its 9 hitters by plate appearances, 5 starters by innings, and 1 closer by saves, scored across all ten 5×5 categories.
- NFL: fantasy football is points, not categories, so the NFL champ is honest about it: each team’s best possible weekly lineup (QB, 2 RB, 3 WR, TE, flex) by total half-PPR points, highest total wins.
A team can be Roto Champ without winning the real title. That gap is the whole fun, and the real-life finish badges next to each team keep the comparison in view.
Percentages are volume-weighted
Rate stats break naively: a player who goes 1-for-1 from the field is a “100% shooter,” and a reliever with three perfect innings has a 0.00 ERA. The classic fix is a minimum-attempts cutoff, but cutoffs throw players away, and nobody gets excluded here. Instead, percentage categories are volume-weighted: a player’s percentage impact is scaled by his attempts, so a 55% shooter on 1,500 attempts moves the category enormously while a 100% shooter on one attempt barely registers. Every player is included, and small samples can’t distort the board. Career percentages are computed the same honest way: total makes divided by total attempts, never an average of season rates.
When a stat didn’t exist yet
The NBA didn’t track steals or blocks until 1973-74, turnovers until 1977-78, or threes until 1979-80. Older seasons are scored only on the categories that existed, against peers measured on those same categories: no fake zeros, no penalty. When a view mixes eras, every player is scored on the categories the eras share, so the comparison stays apples-to-apples (filter down to the 1960s and everyone is scored on the universal five: points, rebounds, assists, FG%, FT%). Boards label these seasons, e.g. “scored on 5 of 9,” so nothing is hidden.
Sport-specific wrinkles
- NBA: the classic nine categories (points, rebounds, assists, steals, blocks, threes, FG%, FT%, turnovers), 1951-52 to today.
- MLB: hitters and pitchers are two separate scoring pools (R, HR, RBI, SB, AVG for bats; W, K, SV, ERA, WHIP for arms), each z-scored against its own kind, 1901 to today. A two-way player like Shohei Ohtani or Babe Ruth is genuinely two entries: his bat and his arm are scored separately, then combined wherever one human should appear once.
- NFL: skill positions (QB, RB, WR, TE) from 1970 to today, with three ranking lenses: raw fantasy points (standard, half-PPR, or PPR), a z-score against same-position peers, and value over replacement (points above a baseline starter at the position, the position-fair lens), because 300 points from a quarterback and 300 points from a tight end are not the same feat.
Roto value is not “best player”
These rankings measure fantasy category value, on purpose. A specialist who is elite in a few categories and harmless everywhere else can out-rank a bigger star who hurts you somewhere, exactly the way he would in a real roto league. When a ranking surprises you, the category toggles are the escape hatch: turn off the categories you don’t care about and watch the board re-rank to your definition of value. The site doesn’t bake in one answer; it shows its work and hands you the dials.
Data sources
NBA statistics via the public NBA stats API (1951-52 to present); MLB statistics via the Lahman Baseball Database (1901 to present), with the live season from the MLB Stats API; NFL statistics via nflverse (1999 to present) and Pro-Football-Reference’s historical fantasy data (1970-1998). Statistics are historical facts; all computation on top of them (the z-scores, placements, and rankings) is original to RotoStandings. Everything is pre-computed in a data pipeline, which is why every toggle re-ranks instantly.
RotoStandings is an independent project and is not affiliated with or endorsed by the NBA, MLB, or NFL.