Pages

Wednesday, June 24, 2020

Introducing the MLB Showdown 2000-2001 Sim League

My biggest frustration with baseball video games as well as MLB Showdown seasons are how the stats don't match up to real-season stats, unless you play a full 162 games. As a result, you frequently see crazy outlier seasons that can only happen with a short schedule.

In video games it is possible to run 162 game seasons if you sim, but in MLB Showdown it takes a very long time of dice rolls to reach this point. 

I am therefore happy to say that I finally have written Python code to allow me to run a full season for my drafted teams. I will be blogging a series of posts in the next few days to weeks that will follow the course of a simulated 162-game season for a drafted 24-team league. Here is the rough outline for how it will progress:

  1. This post: Introducing the League and Rules 
  2. Introducing the Eastern Conference teams
  3. Introducing the Western Conference teams
  4. Results after 40 games
  5. Results after 80 games
  6. Results after 120 games
  7. Full season results
  8. Full season awards
  9. Playoffs (this may be broken down into several posts)
League Format
There are two conferences, Eastern and Western, each with three divisions of four teams, for a total of 24 teams. The team breakdown is shown below:




Each team will play 14 games against every team in their division (42 total games), and 6 games against every other team in the league (120 total games). 

I am still deciding how to run the playoffs, but my current thought will be to have the top team from each division making the playoffs, seeded 1-3 by record in each conference. Each conference will also have two wild card teams, seeded 4-5 by record. Seeds 4 and 5 will play in a best of 3 wild card playoff. After that, the playoffs will progress to the Division Series, Championship Series, and World Series, with the standard 5-7-7 game schedule used in the MLB. 

Roster Format and Draft
Rosters consist of 25 men; 13 position players and 12 pitchers, subject to the following rules:
  • All teams will use the DH, and the depth position players must be able to spell every position player. The simulation will randomly choose rest days, with every starting position player resting with a 10% likelihood, aside from the catcher, who rests with a 20% likelihood.  
  • Teams will use a 5-man starting rotation.
  • Teams will use a 6-man bullpen, and have an additional 6th starter who will be used in a bullpen role if necessary. 
  • Relievers are able to pitch no more than 2 games in a row. 
  • A player appearing in two sets may only be used once. Preference was generally given to foils over commons, with a few exceptions.
In order to hit the pitcher requirements, I needed to combine my 2000 and 2001 cards, and used almost every player that appears between the two sets. 

To draft, I placed all players in a document, and rated every player - pitchers by control, outs, and innings; and hitters by hitting, speed, and fielding. Each player was scaled versus his position, so the same card ends up more valuable in a position that is less stacked than one that is filled with studs. After compiling the values above average,  I followed the following procedure, where I split the draft into several segments. In each segment, I manually drafted players to teams by selecting the best player available according to my value calculation, assuming the position was needed by the drafting team.
  1. Draft 18 players per team (9 for the starting lineup, 5 for the rotation, top 4 relievers)
  2. Draft 3 players per team (2 final relievers, and the long reliever)
  3. Draft the 4 bench players for each team
  4. Move the bench players around between teams as needed to ensure that all teams have replacements for every member of their starting lineup.
Game Lineups
I will feed my Python code a list of rosters (rotation, bullpen, lineups depending on who is resting) and a schedule. The order of the schedule will be randomized. Pitching matchups will also be randomized within a series - if two teams play each other in a 4 game series, for example, and pitchers 1-4 are slated to start for one team, they will pitch those 4 games in a random order. This helps keep situations where #1 starters only face off against other #1s. 

At the start of a game, lineups will be chosen randomly by a random number generator. There is a 40% chance of drawing the regular lineup, 20% of drawing the lineup with the backup catcher, and 10% each of four lineups, each replacing two non-catcher starters. This helps result in an uneven number of games played by regular starters, to help simulate the variance of wear and tear on different players. 

My code does not PR or PH at the moment. This will be implemented for the playoffs (although I probably plan on slow-playing the playoffs).


Pitching Rules
Pitching changes will be made when a starter/reliever exceeds his inning allowance on his card. Several house rules are in effect:
  • Instead of every 3 runs resulting in -1 IP, a pitcher loses an IP after 4 runs, another after 6 runs, and then 1 for every additional run after that.
  • A starter who is throwing a shut-out or a no-hitter receives an extra +1 IP. 
    • If after this additional inning the starter is throwing a no-hitter, they gain an extra +1 IP. 
    • If after the additional inning, the starter is throwing a shutout with 0 walks and <3 hits, they gain an extra +1 IP. 
    • No more than 2 IP may be added to any starter from their base.
    • The minute a starter is no longer in compliance with those conditions, they lose the extra IP, even if it is mid-inning.
Relievers are chosen based on game situation, due to some logic I have coded in. Closers are generally reserved for the 9th inning or save situations. The top pitchers in the bullpen are prioritized in close games, the bottom ones in blowouts. 

Relievers may only pitch 2 of every 3 games.

The emergency starter is only brought in if no relievers are available, or if the starter gets pulled in the 4th inning or before. 

Other House Rules
  • Stolen bases - players will automatically try to steal if their stolen base chance is >70%. Teams are limited to 7 manager steals per game (I used to limit it to 5, but players still were not stealing many bases a year so I raised it.)
  • Single+ - a single+ results in a steal attempt, with the runner getting +7 against the catcher's arm. These do not count toward manager steals.
  • Double play attempts may be made third to first if the batter is speed B or C, and home to first if the batter is speed C.
  • Teams always attempt the double-play and allow a fast runner on third to score, unless it is a close game in the 8th inning or later. 
  • Extra base attempts are made depending on likelihood of success. The two-out bonus and going-home bonus are both set to +3 instead of +5. 
  • As this is hard-coded into my simulation, at the moment all teams have the same strategic decision when sending runners, stealing, or going for double-plays. I do plan down the road in a future simulation to make different managers have different strategies so each team plays slightly differently.
Stats Recorded:
  • For pitchers: G, GS, IP, H, BB, K, SV, BSV. Right now I derive ERA, WHIP, and K/9, but it is easy to add other pitcher rate stats based on the ones I record. 
  • For hitters: G, PA, AB, H, BB, 1B, 2B, 3B, HR, R, RBI, SB, CS. Right now I derive AVG, SLUG, OBP, OPS, wOBA, but can add more rate and value stats later based on the ones I record.
  • Additionally, I am recording the following achievements:
    • For pitchers: CG, Shutouts, No-hitters, Perfect Games, 15+ K games
    • For hitters: 5+ H games, 6+ RBI games, 3+ HR games, Walkoffs, Cycles
  • Let me know if there are other stats you want me to record! I will try to do so before I run the season, if there is time.
Awards:
  • I plan to post polls at the end of the season, to vote on MVP and CY Young. I also will have first and second team All-Pros, in the style of the NFL.
Next steps:
  • My next few posts will breakdown the 24 teams rosters.
  • After that, I will run the code to have each team play their first 40 games, and post those stats. I will continue running the season in 40 game increments. The simulation only takes about 8 minutes to run a full season (I have ran around 100 beta tests so far), but I want to break it up nicely so people can track how teams are doing and how things change throughout the year. 






2 comments:

  1. BAH Gawd you cracked the code! this is awesome i cant wait to hear how it plays out

    ReplyDelete
  2. I like your rules here as well.

    ReplyDelete