Every plate appearance is simulated from what these players actually did, with the era they played in divided back out. This page is the whole method, in order.
Every player's line is counted from Retrosheet play-by-play — the real event files, not a projection or a rating somebody assigned. A player's record is split by the hand of the pitcher he faced, so a left-handed hitter carries separate numbers against lefties and righties.
| Pool | 1,000 batters and 998 pitchers, chosen by value relative to their own era |
|---|---|
| Eras covered | 1910s through 2020s |
| Outcomes | K · BB · HBP · 1B · 2B · 3B · HR · OUT |
Eight mutually exclusive outcomes per plate appearance. Everything else — errors, wild pitches, stolen bases, times through the order — is layered on top of that core.
A pitcher who faced sixty left-handed batters in his career has a home-run rate against lefties that is mostly noise. Using it raw would let a fluke become a permanent trait. So every rate is pulled toward a baseline in proportion to how little we know:
k is roughly the number of plate appearances at which a stat
is half signal and half noise. It differs by outcome, because some
settle down much faster than others:
| Strikeouts | k = 60 |
|---|---|
| Walks | k = 120 |
| Home runs | k = 170 |
| Doubles and triples | k = 1,610 |
With a full career behind it the observed rate dominates and the baseline barely matters. With sixty plate appearances the baseline does most of the work, which is the point.
A 1968 pitcher and a 2001 hitter did not play the same game. Comparing their raw rates would tell you more about the baseball than the players. So neither one's rates are used directly. Each contributes a ratio — how far above or below his own league he was — and those ratios are applied to a common baseline:
This is the odds-ratio method (Log5, in Bill James' formulation), generalised so the two sides can come from different decades. The neutral baseline is anchored on the 2010s run environment. An elite home-run hitter facing an elite home-run suppressor lands sensibly between them rather than at either extreme, which is exactly what the ratio form buys you.
A ratio doesn't survive the trip intact. In the 1920s almost nobody was swinging for the fences, so the few who did stood miles above the average — Babe Ruth was five times his league's home run rate. Handing that whole multiplier to a modern baseline projects him at 88 home runs a season, which is not a translation so much as an accident of arithmetic.
The spread of skill is measurable, and it narrows steadily:
| 1920s | home run skill, spread 0.71 |
|---|---|
| 1950s | 0.61 |
| 1990s | 0.44 |
| 2010s | 0.32 |
So what carries across is a player's standing in his own league rather than his raw ratio — a man two deviations above his era arrives two deviations above the neutral one. Applied at full strength that flattens the greats too far, putting Ruth behind today's sluggers; part of the old spread was era, but part was a genuinely thinner league. The engine splits the difference, which is the one number here that is a judgement rather than a measurement.
The blended rates give a probability for each of the eight outcomes. One draw from the season's random number generator picks one. Runners advance on a set of rules that depend on the outcome, how many are out, and who is on base.
The eight probabilities are computed independently and so do not sum to one; they are renormalized into a proper distribution before anything is drawn.
Batters do measurably better each time they see the same pitcher in a game. That is applied as a multiplier on every batter-positive outcome:
| 1st time through | 0.95× |
|---|---|
| 2nd | 1.00× |
| 3rd | 1.05× |
| 4th | 1.09× |
This is the effect that makes a fresh reliever genuinely worth more than a tiring starter, rather than a matter of taste. Relievers are chosen by leverage — the closer is held for the situation that needs him — and carry workload between games, so an arm used hard yesterday is unavailable or less effective today.
Reached-on-error is not invented offense. In the source data the
OUT bucket already contains every ball a fielder mishandled;
a share of it is un-folded back into runners, at a rate set by the fielding
behind the pitcher. Total plate appearances and the batter-versus-pitcher
distribution are unchanged.
The rate works on the miss, not the catch: a .976 defense misses .024 of
what a .984 defense misses .016 of, so it commits half again as many
errors. Runs that score only because of one are unearned, and the error is
charged to whoever was standing where the ball went — which is what the
box score's E: line names.
Wild pitches and passed balls are separate, because they happen during a plate appearance rather than resolving one. Stolen bases use the runner's own attempt and success rates, regressed the same way everything else is, against the catcher and pitcher holding him on.
A roster is exactly 24 players, and the shape is fixed:
| Lineup | C, 1B, 2B, 3B, SS, LF, CF, RF, DH |
|---|---|
| Bench | 2 |
| Rotation | 5 starters |
| Bullpen | 8 relievers |
Because the slots are exact, "can this club field a team" is a real question with a real answer — it is decided by matching players to slots, not by counting them. A club holding two shortstops and nobody in center looks fine position by position and still cannot take the field, which is precisely the shape a careless trade produces.
Left alone, a club starts its best man at each position and bats them in the order the research favors — best hitter second, next-best fourth. A manager can override both: who starts, and where each man bats.
The same matching decides whether an order is legal, so a change that benches the only center fielder is refused rather than quietly accepted. And a new order applies from the next game onwards, never backwards — see below.
A season is not stored as a list of results. It is stored as a seed plus the transactions that happened, and replayed on demand. Same seed, same season, every time.
That is why a trade cannot simply change a roster, and a manager cannot simply re-bat his club: doing either would rewrite games already played. Instead every completed move — a trade, a signing, a new batting order — records the game it took effect at, and the club of any moment is rebuilt by replaying the log up to that point.
| Trades | Both managers agree, then the league gets 24 hours to look. A majority of uninvolved human managers can veto; silence approves. |
|---|---|
| Free agents | Claims sit for 8 hours. If two clubs want the same player the worse record wins. |
| Injuries | Roughly one per club per 20 games. Anything costing 10+ games moves the player to the injured list, which opens his roster spot. |
Injuries are drawn from the same seeded generator as everything else, so they reproduce exactly on replay. Computer-run clubs patch injury holes from the wire on the same rules and the same clock a human faces.
Worth stating plainly, so the output is read for what it is: