RotoHound Methodology
Projection Methodology
Summary
RotoHound runs its own projection system by default. It blends component stats with models re-trained each year, and rebuilds every rest-of-season line daily from usage, injuries, and roster status.
In a 10-year backtest, it grades similarly to Steamer and ZiPS on rank correlation of the classic roto categories.
The backtest’s clearest weakness is ranking pre-season playing time, since it reads workload history rather than depth charts. In-season playing time comes from observed usage instead.
Intro
An essential feature of RotoHound is that you can upload any projection system you want to power the site’s core features (player values, projected standings, the estimated impact of trades on standings, etc.). But I knew the site would need its own projection system that runs by default, partly because it’s a better experience not to re-upload projections, and mostly because our own system lets us build daily projections, model rest-of-season playing time, and project additional stats used in custom leagues.
Therefore, I set out to make projections that were competitive with the major systems in terms of predicting player outcomes. I also wanted to ensure users could understand the methodology, both overarching and per-category. Since I don’t have the time or expertise of RosterResource’s Jason Martinez or Razzball’s Rudy Gamble, the system uses recent usage data (along with roster status and expected IL returns) to project rest-of-season playing time rather than manual estimates.
As evidenced by the length of this write-up, the system is fairly multi-faceted. I initially designed a simpler projection system that solely used the component framework described below (e.g., projecting pitcher K using only a weighted composite from historical results and underlying skills like whiff%, CSW, and FB velo, plus regression to league average). However, I found that I “maxed out” on the accuracy I could achieve without incorporating a model like linear regression, ending up with correlations in sniffing distance of the major systems, but clearly inferior overall. (Projecting rest-of-season playing time from usage rather than human judgment also proved more complicated than I’d expected.)
The revised system uses a blend of component stats and models that are re-trained each year on every completed season since 2011. It was rolled out in July 2026, and its 10-year backtest is comparable to Steamer and ZiPS’s actual record in terms of correlation: ahead on some stats (AVG), behind on others (W), but mostly similar.
The system’s biggest weakness in historical backtests is ranking pre-season playing time (PA and IP), which makes sense given the backtest infers roles from workload history rather than depth charts. The in-season playing time model is role-aware since it’s usage-driven, and future full-season projections will incorporate more role information.
What the system projects
RotoHound projects every fantasy-relevant statistic for all MLB players and qualifying minor leaguers, with a rest-of-season line that regenerates every day during the season. The inputs are MLB’s official statistics feed (season stat lines, rosters, injured-list status, transactions, daily lineups, rotation usage), Statcast data from Baseball Savant (exit velocity, barrel rate, expected batting stats, sprint speed, plate-discipline measures), multi-year park factors, and up to five years of major-league history, plus minor-league history.
Design rules
Every statistic follows the same four rules:
Incorporate historical results and skills. Every projected rate blends the player’s track record of outcomes (prior seasons’ category stats like hits, HR, and K, weighted toward recent seasons and larger samples) with his underlying skills (measures like contact rate, barrel rate, and whiff rate, which often stabilize faster than outcomes and predict them better).
Trust is proportional to evidence. A thin record is pulled hard toward league average and toward what the skills imply; a long record mostly speaks for itself. For example, entering the 2026 season, Jakob Marsee’s track record (234 career PA) is regressed more heavily than Manny Machado’s (8,195), and more of Marsee’s projection depends on his demonstrated skills (e.g., K%) relative to his results (e.g., AVG).
Playing time is modeled from usage. Hitter PA and pitcher GS & IP are modeled from recent usage, track record, and MLB roster / IL status. Team-dependent stats such as runs, RBI, wins, saves, and holds are allocated from team-level budgets so league totals stay coherent.
Performance is read in the context of its own season. A 25-homer season in 2019 and a 25-homer season in 2014 are different accomplishments. In the system’s model portion, each of a player’s seasons is expressed relative to that season’s league rate, so his record is read against the run environment it happened in. This helps prevent league-wide changes like the 2019 juiced ball, 2021 sticky-stuff crackdown, and 2023 SB-friendly rules from distorting a projection.
Projection framework
Each category is projected by combining projected performance on a rate basis with projected playing time.
How RotoHound projects performance on a rate basis
The system uses a player’s historical results and skills to project performance per unit of playing time (e.g., HR per PA, K per batter faced).
Components are regressed to league average by amounts that vary depending on the stat (e.g., K% is more stable than LD%) and player track record (e.g., a rookie’s historical performance carries less weight in his projection than a veteran’s).
Park effects are removed before skill estimation and re-applied for the projected home park.
Most categories are projected using a blend of two methods: a linear regression model, and a component-based calculation.
To give a concrete example, here’s how the system generates HR estimates:
The model’s central input is the player’s own HR per PA over the last five seasons, expressed relative to each season’s league rate and weighted toward recent seasons and larger samples. That average is then shrunk toward league average by adding 600 PA of league-average performance to his record, so a veteran with 2,000 PA keeps most of his edge while a rookie with 300 PA gets pulled most of the way in. Seasons under 200 PA don’t count toward it.
The model’s other inputs are three-year averages of his HR/FB, FB%, ISO, pull%, and hard-hit rate, each shrunk toward league average by its own amount, plus age.
Each year, the model’s coefficients are re-derived from every completed season since 2011, so the model updates itself as seasons finish. A hitter’s 2026 projections use coefficients derived from 3,291 player-seasons across 2011–2025.
The component estimate is HR = BIP × FB% × HR/FB, where FB% and HR/FB are regressed at their own backtest-tuned rates (65 PA and 100 PA, respectively), and HR/FB is adjusted to incorporate Barrel% and park factor.
The model and component estimates are blended at a rate of 80%/20% for veterans, with the component percentage increased for players with <1,000 PA. Players with no MLB history are projected 100% using the component estimate. (Note this is for HR; the model/component blend, and how it scales with playing time, varies from stat to stat.)
How RotoHound projects playing time
Pre-season: The pre-season logic is deliberately simple. The tradeoff is ranking accuracy: the projections cluster in a narrow band, so the system is worse than Steamer or ZiPS at ordering players by expected playing time (the numbers are in the Benchmarking section).
Hitters. An established regular anchors on his own best recent season, capped at 650 PA, then discounted for durability: with three 500-PA seasons in the last three years he keeps 95% of that anchor, two keeps 90%, one 85%, none 80%. Age adjusts the result (×1.03 at 23 or younger, ×0.95 at 35 to 36, ×0.90 at 37 and up). A player without an established starter’s record gets a recency-weighted average of his recent PA regressed 30% toward 450. The result is held between 150 and 660, and games played follow from PA.
Pitchers. A starter with a full prior season (150+ innings, 25+ starts) anchors on last year’s innings, held between 170 and 220. Coming off an injury year (healthy two years ago, short last year) he gets 85% of the healthy season. A reliever gets 95% of last year’s innings, held between 55 and 90.
Starter innings floors. Innings are then floored by demonstrated starting evidence, so a pitcher with real starts is not priced as a reliever: 8 or more starts last year at a 40% start share floors him at 150 innings; 3 or more starts floors 130; any start in the last two years for a young pitcher with a thin career floors 110; a 13-start Triple-A season floors 120; a rookie projected for 10 or more starts floors 130. Closers are exempt. The floors raise innings only. They never change a pitcher’s role.
In-season: Pre-season playing time is discarded once the season starts, and every line is rebuilt daily from observed usage.
Hitters. Rest-of-season PA = (remaining games he is available for) × (his projected share of those games as a starter) × (his PA per start)Start share. There are two main inputs. The first is the last 14 days of lineup cards. The second is his season-long start rate, measured as starts divided by the games he was actually available for, with injured-list time removed from the denominator so a player who missed six weeks is not punished for it. The season-long role sets the expectation, and the recent window updates it. How much the season role resists the window depends on how much he has played: an established regular (250+ PA, starting at least 70% of games) is anchored with weight on the order of his season games played, capped at 70 games, so a cold two weeks cannot cost him his job on paper. A thin-sample player is anchored at the equivalent of 10 games, so recent usage moves him quickly. The season-long expectation he’s anchored to is not his raw rate but the center of his role tier (assumed as .92 for everyday, platoon .62, bench .18, etc.).
Batting order. PA per start comes from where a player hits: leadoff 4.65, second 4.55, third 4.45, cleanup 4.35, fifth 4.20, sixth 4.10, seventh 4.00, eighth 3.90, ninth 3.80. The slot is his average lineup spot with ten games of a neutral middle slot mixed in, so one day at leadoff does not reprice him.
Pitchers.Starter role. Rotation membership is inferred from actual recent starts, taking each team’s five most recent distinct starters, and a member is projected for one turn in five of the remaining games. Six-man rotations are detected from usage (six pitchers with two or more of the team’s last twelve starts, all active within the past week) and members get one turn in six. A pitcher who skipped a turn but has a real season starting record and started within the last 21 days still counts as a member, because ordering by last start alone would drop an ace on extra rest. A pitcher outside the rotation gets a small residual capped at 6% of remaining games, since he might spot-start. A team whose recent start log is too thin to read gets no rotation inferred at all, and its pitchers fall back to their own start rates. Innings are starts multiplied by his own innings per start (5.3 by default, held between 3.5 and 7.0). Finally, a team cannot start more pitchers than it has games. When there’s a playing-time clash (projected starters exceed about 105% of the remaining schedule), the system prioritizes the pitchers with better FIPs and more career innings, and a pitcher with 8 or more starts this season keeps his turn regardless of his ratios.
Reliever role. A reliever’s expected games% is his season-to-date appearances divided by the games he was available for, blended with a prior for his role (closer .40, setup .38, middle relief .26 to .30), and capped at .52, since no reliever in the modern era appears in more than about half his team’s games. Available games exclude injured-list and option time. Innings per appearance use the player’s season-to-date rate for relief appearances only, held between 0.7 and 2.6. For a swingman, rotation turns are removed from the relief window.
Injuries. An injured player is given an estimated return date and loses the games he’s expected to miss. The estimate starts from historical patterns for the injured list and the injury type in question (e.g., the median IL-10 stint is 15 days, and the median oblique injury costs ~28 days). A published return date or range (for example, the Guardians saying José Ramírez is out 5–7 weeks) can push the estimate later, and the system always takes the longest of what it has, because list minimums and early reports tend to be optimistic. A player returning from a 15- or 60-day list carries an additional 8% reduction after his return.
Other system features and notes
Dynamic in-season update. For rate projections, the current season enters as an additional weighted season.
Aging is incorporated in two places: a per-stat aging curve centered on peak age 27 in the component build, and age/age² as inputs to the model. The model learns its age slopes each year, and allows for more nuance than a hand-set aging curve. For example, the system’s stolen-base model learned (and therefore projects) a much steeper speed decline than a linear post-peak decline.
Save and hold allocation. Saves are not projected as a rate. A model splits each team’s remaining save pool among its own relievers using their save logs (14-day, 45-day, and season shares, plus holds share as an heir-apparent signal), and the pool itself is the team’s season-to-date save pace prorated to its remaining schedule. Roles are rewritten from the result, so a stale closer tag cannot keep feeding saves to a pitcher who is no longer getting them. Holds are then redistributed from a leverage-weighted team budget, blended with each reliever’s demonstrated holds, and re-run after saves so hold eligibility reflects the final save totals.
Minor leaguers. Minor-league performance is translated to major-league equivalents before it enters the engine: each stat is adjusted by a level-specific difficulty factor, the league and park run environments are removed, and the player’s age relative to his level is credited or penalized. Translated seasons then enter as small, slightly worse major-league seasons with heavily discounted sample sizes (Triple-A counts at 60% weight, declining to 10% for rookie ball), so minor-league evidence is used but not trusted like major-league evidence.
NPB/KBO and other players without history. A player arriving from Japan or Korea has no major- or minor-league record for the engine to read, so he is projected manually using a few anchor stats and rates (e.g., HR, K%), with the rest of the line derived from league-average relationships.
Benchmarking
Open the projection benchmarking workbook (Google Sheets)My goal isn’t to convince you that RotoHound is demonstrably better than the leading projection systems, but that they’re a capable set of projections that can be relied on to produce reasonable values that don’t vary wildly from what you can download from FanGraphs, thereby allowing you to make decisions based on the site’s defaults without concern that it will cost you your league.
Summary
The benchmarking sheet and the table below are calculated from 10 seasons, 2012–19 plus 2024–25, chosen to exclude the COVID-shortened 2020 season and the three following seasons, since their lookback windows are affected by it. The graded pool of players includes only hitters who accumulated 450 or more PA and pitchers with 140 or more IP in the season in question. (This means relievers/SV are not benchmarked; they’re tough to do after the fact, since any good system requires pre-season assumptions on closer roles.)
I compared against Steamer and ZiPS because their historical projections are readily available. (I assume RotoHound trails ATC’s composite approach, and am curious how it compares to newer systems like THE BAT X and OOPSY.) The sheet includes correlation and error metrics for each 5x5 stat except saves, plus key inputs like PA and IP. The table below shows rank correlation, because ordering players correctly matters more in fantasy than minimizing absolute error, even though the system grades better on error.
Rank correlation with actual results, averaged across the ten seasons:
The three systems land close together, with RotoHound a bit ahead on hitters, a bit behind Steamer on pitchers, and ahead of ZiPS on pitchers. No category is an outlier in either direction.
An important caveat is that RotoHound’s projection system was designed in 2026, with the benefit of knowing exactly what happened during the benchmarking period of 2012–2025; ZiPS and Steamer are benchmarked above on their actual performance, which is much more impressive. Even though the system only uses previous seasons to project a given season’s outcomes, the model and component frameworks I used were informed to some extent by what gave me the best result.
Strengths
Hitter categories grade well as a whole on rank correlation, especially AVG, R, and RBI. Among pitchers, ERA and WHIP beat ZiPS while trailing Steamer.
Weaknesses
Pitching trails Steamer across all four categories. Wins are the weakest single category: .321 rank correlation, and on value correlation the gap is larger (.262 against .339 for Steamer).
Playing time is the biggest weakness, although this likely stems from RotoHound’s backtested pre-season projections including no qualitative role information. The pre-season model reads workload history rather than a depth chart: it can see which roster a player is on, but not the role his team signed him for. The system therefore projects playing time without much discrimination between players, which actually leads to the best PA error of the three systems (63 PA average error against Steamer’s 95) but the worst correlation (.442 rank, against Steamer’s .531).
Valuation Methodology
Summary
RotoHound prices every player for your league’s exact settings: teams, roster slots, categories or points, and budget. It re-prices daily, using our rest-of-season projections or any set you upload.
For category leagues it values production above replacement on one common scale (a version of the standings gain points method, SGP). Points leagues use points above replacement.
On identical projections, its values match the FanGraphs auction calculator at predicting realized 2026 NFBC auction prices (full comparison).
League-specific dollar values
Dollar values are computed from a league’s actual settings: team count, roster slots, scoring categories or point values, and auction budget or salary cap. Replacement level is determined by those settings: it’s the best player who goes undrafted once every team has filled its roster, so a 15-team league with deep benches has a very different replacement level than a 10-team league.
For category (roto) leagues, the engine measures each player’s contribution to each category relative to replacement level. Rate stats are weighted by volume, so a .300 average over 600 AB counts more than .300 over 200.
Each contribution is measured against how much players typically vary in that category (a standard deviation), so one typical spread above replacement counts the same in steals as in homers, and no category dominates just because its numbers run bigger. (This is a version of the standings gain points method, or SGP, formalized in Art McGee’s “How to Value Players for Rotisserie Baseball,” and made accessible to many current players by Tanner Bell’s Smart Fantasy Baseball.)
Positional premiums equal the gap between the best undrafted player overall and the best undrafted player at each position, which makes catcher the scarcest slot: in a standard 15-team auction, the premium is worth about $10 to a catcher and about $0.50 to an outfielder.
Starters and relievers are measured against separate replacement levels, and swingmen against a blend proportional to their usage.
The dollar scale is set so that a replacement-level player is worth exactly $0. Players below replacement are shown at $0 rather than negative, and positive value is scaled to sum to the league budget, split 65/35 between hitters and pitchers by default. Daily-lineup leagues use 60/40, since daily streaming and an innings cap mean teams roster more pitching than the active-slot count implies. (Ottoneu uses its own calibrated splits.)
Points leagues use points above replacement instead: projected fantasy points above a replacement band, plus a positional adjustment. They do not use a hit/pitch budget split. All positive value is pooled and the whole budget is distributed at a single league-wide dollars-per-point rate, because splitting it would inflate pitchers, whose pool of value above replacement is smaller.
Benchmarking
Open the valuation benchmarking workbook (Google Sheets)Benchmarking a valuation system is trickier than benchmarking projections: the values depend on both the quality of the projections and the method of attributing value to production. A way to gauge the effectiveness of the latter is to compare what people actually paid for a given league format, versus the values different systems produce based on the same set of projections.
I ran this analysis on realized 2026 NFBC auction values, 105 leagues of 15 teams with $260 budgets. I compared NFBC AAV with RotoHound’s values and those of the FanGraphs auction calculator. Both calculators were given the same ATC pre-season projections and the same NFBC roster settings, so the only thing that differs is the valuation math.
Projection system: ATC. Actual values: 2026 NFBC Online Auction AAV (105 leagues, 529 players).
The two systems are basically identical in terms of their effectiveness at ranking the entire player pool (0.88 versus 0.88). RotoHound’s values land slightly closer to the average auction price, both for the whole pool and when limiting it to a smaller subset (top 50 or top 250 players, viewable in the sheet).
I hope to expand this benchmarking in the future to other league formats (e.g., Ottoneu), to measure how well it extends to different league configurations.
The NFBC comparison suggests that RotoHound valuations reflect expert market values to a similar degree as the FanGraphs auction calculator. In the RotoHound platform, the values are computed for your exact league settings automatically, every day, on our projections that update daily, or on whatever system you choose to upload.