The Simple WAR Calculator is back!
During my sophomore year of college, as a way to procrastinate doing problem sets, I built an interactive spreadsheet that converted a set of simple statistical inputs into an estimate of a player’s Wins Above Replacement. It wasn’t groundbreaking work, just a shortcut in lieu of more-rigorous calculations, but I found that being able to model WAR from simple hypothetical inputs was useful in analyzing players. More importantly, it was fun to play around with: seeing how the results changed as you fiddled with the inputs or determining the MVPs of my video game teams.
As much as I enjoyed it, I didn’t maintain it for long — I stopped writing for the Cleveland Guardians blog where it lived about a year later, and eventually about baseball altogether for quite some time. As far I knew, the hosting service through which I’d jury-rigged the interface because I didn’t know how to code was long defunct.
But from the messages I’ve received over the years, I learned that the calculator was in use long after I assumed it was deprecated. Over a decade after I stopped maintaining it, I got emails on a regular basis from people who still relied on it for their softball leagues or video game teams to say that it was newly broken, implying that it had recently been working. So I promised myself that someday I would rebuild it in a better, more-stable format.
Today is that day. The Simple WAR Calculator has been reborn as a Dash application, and I dare say it’s better than ever. The new version features six different frameworks for understanding player value, a raft of customizable inputs to tailor the numbers to your league, and an interface that I hope feels less clunky than a color-coded spreadsheet.
A full guide to the new Simple WAR Calculator is below, including (what I imagine will be) frequently asked questions and a glossary of all the statistics it uses. You can also find the full code on Github. But if you just want to start playing with it:
A brief overview of WAR
What is WAR?
Wins above replacement, better known as WAR, is a framework for translating on-field performance (or future projections) into units of wins. It is essentially the answer to the question of: If a player disappeared, and their team put only minimal effort into replacing them on the roster, how many fewer games would we expect them to win?
A league-average player will end up around two WAR over a full season. Four WAR is All-Star production, while six WAR gets you into the MVP conversation most years. In 2024, each of the most-famous versions of WAR — Baseball-Reference’s bWAR, FanGraphs’ fWAR, and Baseball Prospectus’ WARP — agreed that Aaron Judge was the best player in baseball, at around 11 wins. On the flipside, a player with subzero WAR over a meaningful sample size may not be cut out for the big leagues.
What is it good for?
Absolutely nothing. Say it again!
Sorry.
The main benefit of WAR is offering a universal standard for evaluating players. If all you had were the classic stats on the back of a baseball card, it would be hard to compare a hitter to a pitcher, a slugger who can’t play defense to a Gold Glove shortstop with a light bat, or a star who misses several months with injuries to a mediocre player who plays a full season. Understanding on-field performance in terms of holistic impact has had enormous implications for analyzing baseball, from barstool arguments over which player was better, to MLB front offices weighing trade offers, to big-picture conceptualizations of the league labor market.
How is WAR calculated?
There is no single way to calculate WAR: the underlying assumptions and intermediate inputs vary among different sources. But generally speaking, there are three broad steps that every WAR model I’m aware of follows.
The first stage is converting a player’s performance to an estimate of runs created or prevented. This process is intuitive for pitchers, whose most widely used evaluative metric (ERA) already lends itself to comparing a given player’s run-prevention skill to the league norm. While the concept may seem more abstract for hitters, decades of research have yielded established processes for translating what a batter does at the plate, on the basepaths, and in the field — accounting for the difficulty of each position — into runs. Modelers may disagree in how exactly they do this, and whether (or how) they regress observed outcomes towards estimates of intrinsic skill.
The second step is recalibrating the performance baseline. A player who performs at a league-average level for a full season is both quite valuable to a team and hard to find on short notice. Thus the concept of replacement level: the quality of play you would expect from a minor-league call-up, a waiver claim, or a free agent who’s still available to sign at midseason. Giving players a slight boost for every inning they pitch or plate appearance they take lets us convert runs above average into runs above replacement.
(This is as good a time as any to acknowledge that WAR has earned a reputation as an anti-labor tool. It doesn’t take Marvin Miller to understand why players are suspicious of having their performance rolled up into a single black-box number that’s often negative and implies that their contributions are fungible. The specific term “replacement level” evokes the “replacement players” who crossed the picket line during the 1994-95 MLBPA strike. In the interest of common language I am using “replacement” in the Simple WAR Calculator interface and throughout this document, but I strongly encourage the sabermetric community to consider updating our syntax.)
Finally, the simplest part is translating the intermediate runs above replacement into wins above replacement. Thanks to the Pythagorean Theorem of Baseball, the fittingly dorky name for the formula quantifying the intuitive relationship between a team’s run differential and its record, we know that it takes about 10 marginal runs scored (or prevented) to take a .500 team from 81 to 82 wins. Applying this denominator to RAR lets us declare WAR.
For more details, I recommend reading FanGraphs, Baseball-Reference, and openWAR’s calculation documentation.
Why do I need to calculate WAR?
The short answer is, you don’t. If the league you want to analyze is serious enough that modeling player value actually matters, surely somebody is already doing it. But any sports fan will tell you that whether you need to do something is the wrong question. Finding new ways to put numbers to what happens on the field is itself a worthy goal.
Which is why, over a decade after I stopped supporting the original Simple WAR Calculator, I still got regular emails from folks who used it for their rec teams, simulation leagues, and video game rosters asking for access to the deprecated spreadsheets. To all the longtime users who have reached out over the years, thank you for your patience and persistence. I hope the new version was worth the wait.
About the Simple WAR Calculator
When should I use the Simple WAR Calculator?
There are three general situations in which I would recommend it:
Estimating WAR where it is otherwise unavailable. This is the most fun application, and based on the messages I’ve received in recent years, it is the most popular one. From intramural squads to video game teams to Strat-O-Matic decks, low-level and even fictional teams can have passionate followings. I tested the calculator with stats from my still-ongoing MVP Baseball 2005 franchise. I hope others put it to similar use.
Translating hypotheticals into holistic value. A scouting report on your team’s top prospect says they have 25-homer power potential, plays plus defense at third base, is a below-average runner, and may strike out too much. How good a player is that? Or imagine a well-reputed hitter is in a slump, fueled in part by an uncharacteristically low BABIP. How valuable would they be if a few more balls fell for hits? The calculator can offer some answers.
Exploring where value comes from. WAR can feel like a black box; the calculator offers a peek inside. What kind of ERA improvement would a pitcher have to see out of the bullpen for them to be more valuable as a reliever than a starter? If a super-utility player is both an average defensive shortstop and a Gold Glove-caliber left fielder, at which position are they more valuable? If the worst fielder in baseball history weren’t allowed to DH, how well would they need to hit in order to be a viable MLB player? My goal is to make WAR feel more approachable and tangible by enabling these kinds of simulations.
Is this a replacement for other versions of WAR?
No! The tradeoff of making WAR easy to calculate is oversimplifying the conventional steps. It is not remotely intended as a challenge to the more-rigorous versions hosted elsewhere on the internet, on either mathematical or philosophical grounds. If you put an MLB player’s stats into the Simple WAR Calculator and the results are different than what you see elsewhere, you can assume that this is expected behavior and [insert your preferred precalculated WAR flavor here] is more correct. (Unless the output is so off that there may be a bug, in which case please drop me a note!)
The only instance in which I recommend the Simple WAR Calculator when other versions are available is as a baseline for hypotheticals. For example, if you wanted to know how much better a player would be if they took more (or allowed fewer) walks, using the difference in Simple WAR Calculator outputs will provide the most apples-to-apples comparison. You can then add that delta to the external WAR variant of your choosing for the best estimate of the player’s counterfactual value.
How do the calculations work?
For position players, the first step is translating the inputs into a format like wRC+, a holistic estimate of a batter’s productivity at the plate compared to an average player. The original (xwRC+) version relies on Fielding Independent Offense (FIO), a formula developed by former Miami Marlins analyst Bradley Woodrum that predicts a hitter’s wRC+ based on a handful of more-accessible inputs. (This comes with the significant caveat that both the run environment and the meaning of wRC+ have changed since FIO was released in 2011.) The OPS+ version’s eponymous statistic has nothing do with wRC+, but they are closely correlated and similarly scaled, so the former is a reasonable stand-in for the latter. The calculator uses the specified pro rata metric and the leaguewide rate of runs scored to define how much more (or less) offense the player created than the average hitter would have in the same number of plate appearances. It then translates the user inputs for fielding ability and baserunning prowess into run-value estimates based on playing time and the empirical distribution of MLB players. There is also an adjustment for how relatively difficult (or easy) is to play the given defensive position.
Depending on which version you use, the process for pitchers starts with calculating FIP or kwERA to estimate what a player’s ERA would be given neutral sequencing and batted-ball outcomes. The calculator then compares the pitcher’s rate of runs allowed (whether based on inputted ERA or RA9, or the relevant ERA estimator) to the baseline for their role. From this we derive how many runs they saved (or gave up) compared to an average pitcher given the same number of innings. Relievers also get a partial adjustment based on how they are used, as runs prevented (or allowed) in high-leverage situations are more valuable (or damaging) than they are in mop-up duty.
The final steps are the same for all players. Replacement runs, proportional to plate appearances or innings pitched, reset the baseline in recognition that below-average players can still have value. All the relevant run estimates sum up to runs above replacement, which convert linearly into WAR.
Want to dig even deeper? You can find all the code for the calculator here.
Which calculator version should I use?
For position players, it depends what your goal is. The original (xwRC+) version is based on simpler inputs corresponding to more dimensions of skill, so it is easier to use, customize, and explore hypotheticals; I say that all also makes it more fun. However, the OPS+ version aligns more closely with other sources of WAR, and thus is probably more accurate.
For pitchers, the first question is which oversimplified view of player evaluation bothers you less: the implication of the ERA and especially RA9 versions that any runs scored (or prevented) can be fully blamed on (or credited to) the person on the mound, or the assumption of the FIP and especially kwERA versions that what happens when the batter hits the ball is none of the pitcher’s business. If your eyes glazed over while you read that sentence, use whichever version is the easiest to navigate given the inputs you have available. Note that having a good estimate for the league average is very important for the ERA and RA9 versions, but does not impact the ultimate results for FIP and kwERA.
Full Glossary of Inputs and Outputs
BABIP (Batting Average on Balls in Play)
The proportion of batted balls within the field of play that fall for hits. While some players can sustain notably high or low BABIPs, extreme values tend to regress towards the norm (usually around .300) over time. The 2024 MLB average was .291. Used to calculate xwRC+.
Baserunning Performance
The quality of a batter’s baserunning skill. This is expressed on the 20-80 scale, a bell-curve distribution that MLB scouts use on which 50 is the league average, 80 is Billy Hamilton, and 20 is Billy Butler. Used to calculate Baserunning Runs.
Baserunning Runs
An estimate of a batter’s baserunning value relative to an average hitter. This assumes a range of value equal to +/- 12 runs relative to the league average over a full season. A function of Baserunning Performance and Plate Appearances.
Batting Runs
A holistic estimate of a batter’s value at the plate relative to an average hitter, considering both quality of performance and quantity of playing time. A function of League Runs per PA, Plate Appearances, and either OPS+ or xwRC+.
Defensive Performance
The quality of a fielder’s defense relative to their position. This is expressed on the 20-80 scale, a bell-curve distribution that MLB scouts use on which 50 is the league average, 80 is Ozzie Smith, and 20 is Adam Dunn. Used to calculate Defensive Runs.
Defensive Runs
An estimate of a batter’s defensive value relative to an average fielder at their position. This assumes a range of value equal to +/- 30 runs relative to the league average over a full season. A function of Defensive Performance and Games Played.
ERA (Earned Run Average)
The rate at which a pitcher allows earned (not resulting from errors) runs, extrapolated over nine innings. Used to calculate Pitching Runs.
FIP (Fielding Independent Pitching)
An estimate of what a pitcher’s ERA would have been given neutral sequencing and ball-in-play outcomes. A function of Hit by Pitches, Home Runs, Innings Pitched, League ERA, Strikeouts, and Walks.
Games Played
The number of games a batter has played. Used to calculate Defensive Runs and Positional Runs.
gmLI (Game-Entering Leverage Index)
The average relative importance of the situations in which a reliever enters the game, as measured by the potential change in Win Probability for the first batter faced. Used to calculate Leverage Runs.
Hit by Pitches
The number of batters a pitcher has hit. Used to calculate FIP.
Home Runs
The number of home runs a batter has hit or a pitcher has allowed. Used to calculate FIP and xwRC+.
Innings Pitched
The number of innings a pitcher has thrown. Used to calculate FIP, kwERA, Pitching Runs, and Replacement Runs.
kwERA (Strikeout and Walk Based ERA)
An estimate of what a pitcher’s ERA would have been given neutral sequencing and batted-ball outcomes. A function of Innings Pitched, League ERA, Strikeouts, and Walks.
League ERA (Earned Run Average)
The rate at which the league allows earned (not resulting from errors) runs, extrapolated over nine innings. Used to calculate FIP, kwERA, and Pitching Runs.
League OBP
The rate at which the average player in the league reaches base safely via a hit, a walk, or a hit by pitch. Used to calculate OPS+.
League RA9 (Runs Allowed per Nine Innings)
The rate at which the league allows runs (including resulting from errors), extrapolated over nine innings. Used to calculate Pitching Runs.
League Runs per PA
The rate at which the league generates offense, calculated as total runs scored divided by plate appearances. Used to calculate Batting Runs.
League SLG
The rate at which the league collects bases per at bat. Used to calculate OPS+.
Leverage Runs
An adjustment to a reliever’s value based on their usage, reflecting that preventing runs in high-leverage outing is particularly valuable (and allowing them in low-leverage game states is less problematic), while allowing them in close-and-late situations is disproportionately damaging (and preventing them in mop-up duty is less helpful). A function of gmLI and Pitching Runs.
On-Base Percentage
The rate at which a batter reaches base safely via a hit, a walk, or a hit by pitch. You can think of it as batting average that counts walks and beanballs. Used to calculate OPS+.
OPS+ (On-Base Plus Slugging Percentage Plus)
A holistic estimate of a batter’s pro rata offensive performance, based on how their OBP and SLG compare to the respective league averages. A function of League OBP, League SLG, OBP, Park Factor, and SLG.
Park Factor
The estimate of how easy it is to score runs in the stadiums where the player has played, relative to the rest of the league. An average field is 100 and higher values mean more runs scored. Per FanGraphs’ numbers, the only team for whom the current baseline is more than six points off the norm (after considering that teams play half their games on the road) is the Colorado Rockies (113). If you are already adjusting for this in your League input (where applicable), leave the Park Factor at 100. Used to calculate OPS+, Pitching Runs, and xwRC+.
Pitching Runs
A holistic estimate of how many runs a pitcher prevents, considering both quality of performance and quantity of innings. A function of Innings Pitched, League ERA, Role Adjustment, and either ERA, FIP, kwERA, or RA9.
Plate Appearances
The number of chances a batter has had to hit. Used to calculate Baserunning Runs, Batting Runs, and Replacement Runs.
Positional Runs
An estimate of a batter’s positional value, based on the relative difficulty of playing each defensive position. Based on the commonly accepted values as listed on FanGraphs. A function of Games Played and Primary Position.
Primary Position
The defensive position that a fielder plays most often. Used to calculate Positional Runs.
Primary Role
The role in which a pitcher is used most often. Used to establish the default Role Adjustment.
RA9 (Runs Allowed per Nine Innings)
The rate at which a pitcher allows runs (including resulting from errors), extrapolated over nine innings. Used to calculate Pitching Runs.
Replacement Level
The estimated difference in value between a league-average player and the performance one would expect from a waiver claim or minor-league call-up. The default values are -20 runs per 600 plate appearances (or one run per 30 PA) for batters and -18.5 runs per 200 innings pitched (about one run per 11 IP) for pitchers. Used to calculate Replacement Runs.
Replacement Runs
An adjustment to player value, resetting the baseline from the league average to what one would expect from a waiver claim or minor-league call-up. A function of Replacement Level and either Innings Pitched or Plate Appearances.
Role Adjustment
An adjustment to League ERA, accounting for the fact that it is harder to pitch as a starter than as a reliever. The default value is +7 points for starters and -11 points for relievers, in line with the 2024 MLB averages by role. Used to calculate Pitching Runs.
Runs Above Replacement
The sum total of run-value estimates for the various dimensions of a player’s game. A function of some combination of Baserunning Runs, Batting Runs, Defensive Runs, Leverage Runs, Pitching Runs, Positional Runs, and Replacement Runs.
Runs per Win
The expected number of runs added or prevented to improve an average team’s record by one game. Usually around 10 and correlated with the level of league offense. For 2024, FanGraphs estimated this at 9.683. Used to convert Runs Above Replacement into Wins Above Replacement.
Slugging Percentage
The rate at which a batter collects bases per at bat. You can think of it as batting average that double-counts doubles, triple-counts triples, and quadruple-counts home runs. Used to calculate OPS+.
Stolen Bases
The number of bases a baserunner has stolen. Used to calculate xwRC+.
Strikeouts
The number of strikeouts a batter or pitcher has accrued. Used to calculate FIP, kwERA, and xwRC+.
Walks
The number of walks a batter has taken or a pitcher has allowed. Used to calculate FIP, kwERA, and xwRC+.
Wins Above Replacement
A holistic estimate of a player’s impact on their team’s record. A function of Runs Above Replacement and Runs per Win.
xwRC+
A holistic estimate of a batter’s pro rata offensive value, based on Bradley Woodrum’s Fielding Independent Offense (FIO) formula that predicts a player’s weighted runs created plus (wRC+) from a set of simpler inputs. Higher is better, with 100 representing a league-average hitter. Note that both the run environment and the meaning of wRC+ have changed since FIO was released in 2011. A function of BABIP, Home Runs, Park Factor, Plate Appearances, Stolen Bases, Strikeouts, and Walks.
Terms of Use
The Simple WAR Calculator is currently free to use and I have no plans to change that.
If you are using the calculator as reference for an article, blog post, or published work, please provide attribution and a link back as appropriate.
Feel free to borrow and modify the code with attribution for personal research and hobbyist projects. Please do not use this code for commercial purposes.
Got a question? Find a bug? Discover a particularly cool application of the calculator? Drop me a note!
This is great! An inside joke I had last year was comparing my father’s slash line in his beer league (45+) to major leaguers. This takes it to the next level.