2022 Infield Optimization

What was the best possible fantasy combination of infielders (1B, 2B, SS, 3B) this season? That is an easy question to answer if you use the year-to-date settings on the auction calculator and you simply look at the best player at each position. It would look like this:

1B: Paul Goldschmidt, $33.7

2B: Jose Altuve, $25.2

SS: Trea Turner, $32.5

3B: José Ramírez, $31.2

But, if you were in a 12-team roto snake draft and were able to get both José Ramírez and Trea Turner, you likely played in a league full of clowns. J-Ram’s average draft position (NFBC) was 3.2 while Turner’s was 1.2. It’s unlikely any fantasy teams had both of those top players. So, what was the best possible infield within reasonable ADP? Here’s how I tried to answer this question.

First, I downloaded our auction calculator’s 2022 YTD values. Then, I subset that dataset down to only look at players who returned over $5 in value. This is an arbitrary cut-off but it helps to include players who may have been one-category performers. In addition to this subset, I also remove everything except for ADP and category Z-scores. I tried to maximize the sum of these z-scores rather than dollar values because I wanted to avoid positional adjustments and only focus on producing the best category scores possible. I also took the first position for each player in the dataset and marked that as their position. For example, Bobby Witt Jr. is listed as a 3B/SS, but my process treats him like a 3B. Finally, I randomly select one player at each position and create a team, summing each player’s z-scores by category and I do that 30,000 times. Here’s the python code if you are interested:


import pandas as pd

ytd22 = pd.read_csv('steamerytd22.csv')
opt = ytd22[['Name', 'POS', 'mAVG', 'mRBI', 'mSB', 'mHR', 'mR', 'ADP', 'Dollars']]
opt=opt.loc[opt['Dollars']>5]
opt['POSa'] = opt['POS'].str.split('/').str[0]
infield = opt.loc[opt['POSa'].isin(['1B','2B','3B','SS'])]

team_list=[]
for i in list(range(0,30000)):
first = infield.query('(POSa == "1B")').sample(n=1)
second = infield.query('(POSa == "2B")').sample(n=1)
third = infield.query('(POSa == "3B")').sample(n=1)
ss = infield.query('(POSa == "SS")').sample(n=1)
frames = [first, second, third, ss]
points = sum(pd.concat(frames)[['mAVG', 'mRBI', 'mSB', 'mHR', 'mR']].sum(axis=1))
ADP = pd.concat(frames)['ADP'].to_list()
names = pd.concat(frames)['Name'].to_list()
summary = {'Team':names, 'ADP':ADP, 'Points':points}
team_list.append(summary)

Ready for the results? Here’s the computer program’s best team within a reasonable ADP:

Paul Goldschmidt, 1B

Jose Altuve, 2B

Trea Turner, SS

Manny Machado, 3B

Points: 81.4

 

In order to achieve this sicko-squad you would have taken Turner first (ADP, 1.2), Machado second (ADP, 22.6), Goldschmidt third (ADP, 47.6), and Altuve fourth (ADP, 74.8). Notice that you would have been making reach picks for both Goldschmidt and Altuve. How sweet it must feel now after listening to your league mate say something like, “Goldschmidt in the third round? Looks like someone didn’t do their homework”. You can now call/text/email/snail-mail that person and let them have it because Goldschmidt ended the year as the number one first baseman by default (12-team) auction calculator settings.

There you have it. That’s my ultimate 2022 fantasy infield. These four players, taken in the first four rounds and accumulating 81.4 z-score points. Can you do better?





8 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Mattmember
1 year ago

Why all the math? You could have done it in your head.