method · config v1.3.0 · built 2026-09-18

How the scores work

First the story, then the numbers.

In plain English

Say you open the Betts trade, see Dodgers 99 · Red Sox 1, and ask: how did they get that? Here is the whole method, with no jargon that isn't explained on the spot. The exact weights and the tests the model has to pass are further down.

It all runs on one question: how many wins did each player give the team that got him?

Baseball has a stat for that — WAR, Wins Above Replacement. It rolls everything a player does (hitting, fielding, baserunning, pitching) into one number: "this guy was worth about five more wins than a random Triple-A call-up would have been." A 0 is a scrub, a 2 is a solid starter, a 5 is an All-Star, 8 and up is MVP territory.

Two websites calculate WAR — Baseball-Reference and FanGraphs — and they disagree a little, because they measure defence and pitching differently. So we average them. That is what consensus WAR means on this site: the two versions split down the middle, so nobody can say we picked the one that flatters their guy.

But wins only count while he is on your team.

If the Dodgers trade for a player, he is great for three years, and then he leaves for the Yankees and wins an MVP, the Dodgers get no credit for the MVP year. We walk through his career one season at a time, starting at the trade, and stop the moment he shows up in another uniform. A year lost to injury or the minors doesn't count either way — it doesn't end the streak.

And we look at a few different lengths of time, because "did the trade work?" depends on when you ask.

Then a check on how good he was when he actually played.

WAR adds up, so an ordinary player who stays six years can pile up more of it than a star who stayed two. To catch that we also look at a rate stat — how good he was per plate appearance or inning rather than in total. For hitters it is wRC+ (100 is an average hitter, 150 is elite, 70 is bad); for pitchers it is FIP− (100 is average, 70 is elite, 130 is bad — lower is better, so we flip it round to match). If he barely played, this part is skipped rather than guessed.

Then money.

Not strictly on-field, but you will see it in the score. For trades since 1985 we know roughly what a win cost on the free-agent market that year, so we can say "he produced $60M worth of wins and was paid $20M — that's $40M of surplus." A superstar on a huge contract can produce a pile of WAR and still come out even here, because the club paid full price for it.

So how does that become a number like 87?

We don't just add things up. We take every player who has ever been traded — about 17,000 of them — and line them all up. A player's score is where he lands in that line. An 87 means he did better for his new club than 87% of everyone who has ever been traded. A 50 is dead average. That is also why nobody scores exactly 100: no one is at the very front of the line.

For a player, four of those rankings are mixed together: the years-you-bought WAR (40%), the short-term WAR (20%), the rate stat (15%) and the money (25%).

For a club, it is the same idea but net: what they got minus what they gave up — and "what they gave up" means what those players went on to do for the other club. The mix is money (65%), the years-you-bought WAR (15%), the whole-tenure WAR (15%) and the short-term WAR (5%). Money is heavy there because it is the only piece that already accounts for both the talent and what was paid for it. Before 1985 there is no money data, so those trades use the WAR parts only.

One more thing: recent trades are marked provisional.

After one year you know about 40% of how a trade will turn out; after three, about 80%. Below that line the page tells you the number is still cooking.

So what stats did they actually look at?

The honest answer: WAR, sliced four ways, plus one rate stat and a price tag. Not batting average, not home runs, not saves, not Gold Gloves, not how clutch he was, not how many games he missed. WAR is meant to contain most of that, but it is one lens, and every part of the score is looking through it.

The details

Every number below is the one the engine used. Change a weight in the config and this section changes with it.

The scale

Every score is a percentile among its pool, and the number shown is the percentile: a 91 beat 91% of the pool, a 50 is dead average, a 9 was beaten by 91%. There is no 20–80 scale and no letter grade. Colour follows one rule everywhere — the headline, every component beneath it, the rankings and the web — a diverging ramp centred on 50 that runs towards worse below it and better above it, in five bands: far worse 0–20, worse 20–40, even 40–60, better 60–80, far better 80–100. Pre-1985 trades have no money component and are scored on the talent components renormalised.

Player Trade Score

How did this piece work out for the club that got him?

ComponentMeasuresOverWeight
productionconsensus WAR (mean of bWAR and fWAR)the control window40
impactconsensus WAR (mean of bWAR and fWAR)the trade season and the next20
qualitywRC+ for hitters, 200 − FIP− for pitchers, weighted by playing timethe control window15
valuemarket value of the WAR minus salary paidthe control window25

Franchise Trade Score

How did this trade work out for this club? Value carries most of the weight because surplus already prices talent at that season's dollars per win and nets out what was paid; production, immediate impact and durability are the talent-only views around it.

ComponentMeasuresOverWeight
net productionWAR received minus what the players sent produced elsewherethe control window15
net impactWAR received minus what the players sent produced elsewherethe trade season and the next5
net valuesurplus received minus surplus sentthe control window65
durabilityWAR received minus what the players sent produced elsewherethe whole tenure15

The control window

A club is credited with what a player did over the years the trade conveyed: the larger of the reserve years left by service time (six minus service, at least one; eight before 1976), the years left on his contract including club options, and the years of an extension signed before his first regular-season game with the club. What he did after a later free-agent contract is a separate decision and counts only toward durability.

Confidence

A score is provisional while less than 80% of the tenure's eventual value is knowable — 41% after one year, 67% after two, 80% after three, measured over 6,180 player-club tenures.

Calibration

Trades the model must get right, checked on every build. Expectations and actuals are percentiles; the band in brackets is what the page says beside them.

CaseCheckExpectedActualStatus
1900 Mathewson, CIN to NYGfid=SFG9599.9 (far better)pass
1900 Mathewson, CIN to NYGfid=CIN50.1 (far worse)pass
1964 Brock for Brogliofid=STL9599.8 (far better)pass
1964 Brock for Broglioplayer_key=brocklo019597.9 (far better)pass
1965 Frank Robinson, CIN to BALfid=BAL9599.3 (far better)pass
1971 Nolan Ryan for Fregosifid=LAA9599.8 (far better)pass
1982 Sandberg, PHI to CHCfid=CHC9599.3 (far better)pass
1987 Smoltz for Alexanderfid=ATL9091.9 (far better)pass
1987 Smoltz for Alexandercomponent=net_impact, fid=DET6097.8 (far better)pass
1990 Bagwell for Andersenfid=HOU9799.0 (far better)pass
1990 Bagwell for Andersenfid=BOS31.1 (far worse)pass
1997 Pedro Martinez, MON to BOSfid=BOS9099.6 (far better)pass
2012 Boston-Los Angeles (the blend test)fid=BOS6064.4 (better)pass
2012 Boston-Los Angeles (the blend test)component=net_production, fid=LAD8599.2 (far better)pass
2020 Betts, BOS to LADfid=LAD7599.0 (far better)pass
2020 Betts, BOS to LADbadge=LAD won the World Series in 2020, fid=LADpass
2016 Chris Sale, CHW to BOS (Boston ahead, not a rout)fid=BOS50–9086.6 (far better)pass
2016 Chris Sale, CHW to BOS (Boston ahead, not a rout)fid=CHW10–5013.4 (far worse)pass
1899 Louisville-Pittsburgh syndicate transferkind=syndicatepass
1899 Louisville-Pittsburgh syndicate transferno_ratings=truepass