The amount of baseball is already starting to worry me. I'm suffering from a bit of analysis overload, as part of my breakneck efforts to create a forecasting system for The Graphical Player 2008. (It's mostly done, and I'll be able to share some of my results in the very near future.)
This is all by way of prefacing the battiness that's about to ensue.
A few months ago, I wrote the beginnings of a baseball simulator--something like Strat-o-Matic or Diamond Mind, only without the pretty user interface or, uh, most of the features. Right now, my program simulates a baseball game where:
- Relief pitchers are chosen at random (Hi Ned!)
- There are no errors (you're welcome, Ryan)
- Stolen bases, caught stealings, double plays, wild pitches, and a bunch of other stuff happen at precisely pre-determined rates that are more or less correct but ultimately made up by me.
Braun and Pena. And Braun. And Pena.
The nice part about having your own simulator is that you can do anything you want with it. So, for some reason I woke up the other day wondering what would happen if our Ryan Braun faced the other Ryan Braun. I could've just run some numbers and figured out what the AVG/OBP/SLG of those matchups would be, but how interesting is that?
So I decided to pit them against each other in the simulator. But I couldn't be done yet: there's no competition. Each team has to have batters and pitchers, and it wouldn't be very interested to have a visiting team made up of Brauns and Brauns against a home team made up of Brauns and Brauns.
In fitting with the Braun-Braun theme, I gave our Ryan Braun's team a pitching staff full of Tony Penas, and I gave the other Braun's team a lineup full of, uh, Tony Penas. As you can see, I value cleverness over parity. (You may dispute whether I achieved cleverness, but you can't argue that I failed at parity.)
Remember, I said my simulator has nothing in it for defense. I can only imagine how rough life would be for relief pitcher Tony Pena if Ryan Braun was playing every position behind him. By contrast, the other Ryan Braun would probably have it good with the other Tony Pena behind him.
Also, my program doesn't penalize pitchers for being tired -- it leaves the starter in for 100 pitches or so, and then brings in a succession of relievers for 20-30 pitches each, preferably at the beginning of an inning. Did I mention I don't like Tony LaRussa? So however good pitchers Pena and Braun are, they are consistently at that skill level from inning 1 to inning 9.
The Results
So far, I ran the simulator through ten games. (It's fast; I could've done thousands, but really, who cares?) Here are the results, with the MIL Braun / AZ Tony team first:
- 10 - 3
- 8 - 1
- 9 - 1
- 1 - 3
- 5 - 0
- 8 - 0
- 5 - 4
- 16 - 1
- 20 - 0
- 26 - 2
More proof that anything can happen in baseball. That 1-3 game, even the 5-4 game, is quite a surprise.
For those of you interested in wading through the somewhat cryptic output of my program, I've included the play by play of the 26-2 game after the jump.
For each inning, there is a blank line between the top of the inning (Braun at bat) and the bottom of the inning (Pena at bat). The two numbers at the end of each inning are the score up to that point.
The play descriptions should be self-explanatory...S = single, D = double, T = triple. The brackets with numbers in them show the status of the bases at the end of each play. Don't ask why 3 and 2 are reversed.
Inning 1
K
{'1': '', '3': '', '2': ''}
OUT
{'1': '', '3': '', '2': ''}
OUT
OUT
{'1': '', '3': '', '2': ''}
S
{'1': 'Pena', '3': '', '2': ''}
OUT
{'1': 'Pena', '3': '', '2': ''}
OUT
0 0
Inning 2
W
{'1': 'Braun', '3': '', '2': ''}
K
{'1': 'Braun', '3': '', '2': ''}
OUT
{'1': 'Braun', '3': '', '2': ''}
W
{'1': 'Braun', '3': '', '2': 'Braun'}
W
{'1': 'Braun', '3': 'Braun', '2': 'Braun'}
OUT
OUT
{'1': '', '3': '', '2': ''}
OUT
{'1': '', '3': '', '2': ''}
OUT
0 0
Inning 3
S
{'1': 'Braun', '3': '', '2': ''}
S
{'1': 'Braun', '3': '', '2': 'Braun'}
OUT
{'1': 'Braun', '3': '', '2': 'Braun'}
Wild pitch / passed ball
OUT
T
{'1': '', '3': 'Pena', '2': ''}
OUT
{'1': '', '3': 'Pena', '2': ''}
OUT
{'1': '', '3': '', '2': ''}
OUT
1 1
Inning 4
K
{'1': '', '3': '', '2': ''}
OUT
{'1': '', '3': '', '2': ''}
HR
{'1': '', '3': '', '2': ''}
S
{'1': 'Braun', '3': '', '2': ''}
W
{'1': 'Braun', '3': '', '2': 'Braun'}
Caught Stealing at base 2
K
{'1': '', '3': '', '2': ''}
K
{'1': '', '3': '', '2': ''}
OUT
2 1
Inning 5
HR
{'1': '', '3': '', '2': ''}
OUT
{'1': '', '3': '', '2': ''}
HR
{'1': '', '3': '', '2': ''}
OUT
{'1': '', '3': '', '2': ''}
K
OUT
{'1': '', '3': '', '2': ''}
W
{'1': 'Pena', '3': '', '2': ''}
T
{'1': '', '3': 'Pena', '2': ''}
OUT
4 2
Inning 6
OUT
{'1': '', '3': '', '2': ''}
S
{'1': 'Braun', '3': '', '2': ''}
OUT
{'1': 'Braun', '3': '', '2': ''}
OUT
OUT
{'1': '', '3': '', '2': ''}
OUT
{'1': '', '3': '', '2': ''}
OUT
4 2
Inning 7
S
{'1': 'Braun', '3': '', '2': ''}
S
{'1': 'Braun', '3': '', '2': 'Braun'}
S
{'1': 'Braun', '3': 'Braun', '2': 'Braun'}
W
{'1': 'Braun', '3': 'Braun', '2': 'Braun'}
OUT
{'1': 'Braun', '3': 'Braun', '2': 'Braun'}
D
{'1': '', '3': '', '2': 'Braun'}
HR
{'1': '', '3': '', '2': ''}
K
{'1': '', '3': '', '2': ''}
S
{'1': 'Braun', '3': '', '2': ''}
S
K
{'1': '', '3': '', '2': ''}
OUT
{'1': '', '3': '', '2': ''}
OUT
10 2
Inning 8
NEW PITCHER
S
{'1': 'Braun', '3': '', '2': ''}
HR
{'1': '', '3': '', '2': ''}
OUT
{'1': '', '3': '', '2': ''}
D
{'1': '', '3': '', '2': 'Braun'}
S
{'1': 'Braun', '3': 'Braun', '2': ''}
W
{'1': 'Braun', '3': 'Braun', '2': 'Braun'}
W
{'1': 'Braun', '3': 'Braun', '2': 'Braun'}
D
{'1': '', '3': 'Braun', '2': 'Braun'}
HR
{'1': '', '3': '', '2': ''}
S
{'1': 'Braun', '3': '', '2': ''}
NEW PITCHER
OUT
{'1': 'Braun', '3': '', '2': ''}
W
{'1': 'Braun', '3': '', '2': 'Braun'}
OUT
OUT
{'1': '', '3': '', '2': ''}
OUT
{'1': '', '3': '', '2': ''}
OUT
18 2
Inning 9
S
{'1': 'Braun', '3': '', '2': ''}
S
{'1': 'Braun', '3': '', '2': 'Braun'}
OUT
{'1': 'Braun', '3': '', '2': 'Braun'}
S
{'1': 'Braun', '3': '', '2': 'Braun'}
W
{'1': 'Braun', '3': 'Braun', '2': 'Braun'}
OUT
{'1': 'Braun', '3': 'Braun', '2': ''}
S
{'1': 'Braun', '3': '', '2': 'Braun'}
S
{'1': 'Braun', '3': 'Braun', '2': ''}
Wild pitch / passed ball
W
{'1': 'Braun', '3': 'Braun', '2': 'Braun'}
HR
{'1': '', '3': '', '2': ''}
W
{'1': 'Braun', '3': '', '2': ''}
NEW PITCHER
D
{'1': '', '3': 'Braun', '2': 'Braun'}
K
K
{'1': '', '3': '', '2': ''}
OUT
{'1': '', '3': '', '2': ''}
OUT
26 2