Using Projected Standings to Set Strategy
Each year, before the season, I try to run a set of projected standings for my leagues. It’s not super difficult, though you do have to set aside probably about one hour per league to set it up. But once you have these projections, they can be extremely useful in figuring out your strengths and weaknesses, and giving yourself a realistic outlook for your team.
The specifics below are based on ottoneu, but the theory can be applied to any format.
To set up the standings, I simply download my league rosters, put each team on it’s own tab, separate the pitchers and hitters, and then use the FanGraphs depth charts (though you can use whatever projections you want) to pull in the stats for each player.
Once I do that, I go team-by-team and project playing time for each player. I aim to have each team fill out their full innings pitched, first by maxing out RP innings (as those tend to be more value on a per-inning basis), then by filling in from the best to the worst SP. Similarly, I fill out 650 PA per position on offense, starting with the best players and working my way down.
To do the “max” RP innings, I assume each team will get every inning from their top 5 RP, and 50% of the innings from up to two more RP. I aim for 650 PA per position because I find that is about accurate in practice. For example, last year in league 184 (FanGraphs Staff League), teams used had between 4,784 and 8,064 AB+BB+HBP (the closest proxy to PA I can get at this point). The bottom three teams, however, were out of contention and not trying to use up games, and outside those three, the minimum was 6,931. That works out to a range of 578 to 671 PA per team. The top four teams averaged 656.
You can then calculate how much each player will contribute to each category, get team totals and create a projected set of standings.
But the real key is what you do WITH those projections. For example, check out these standings.
| Team | R | HR | OBP | SLG | K | ERA | WHIP | HR/9 | Offense Points | Pitching Points | Total Points | Place |
| Points Leaders | 950 | 263 | 0.335 | 0.436 | 1559 | 3.18 | 1.15 | 0.81 | 30 | 44 | 74 | 1 |
| Knebel Gazers | 951 | 296 | 0.330 | 0.450 | 1436 | 3.30 | 1.19 | 0.82 | 38 | 28 | 66 | 2 |
| Pass the Popcorn | 925 | 271 | 0.328 | 0.443 | 1554 | 3.13 | 1.14 | 0.86 | 23 | 42 | 65 | 3 |
| Detroit Stars | 966 | 259 | 0.342 | 0.447 | 1485 | 3.48 | 1.21 | 0.88 | 40 | 23 | 63 | 4 |
| Fisher Bunnies | 947 | 258 | 0.341 | 0.441 | 1449 | 3.31 | 1.18 | 0.82 | 32 | 30 | 62 | 5 |
| Veeck – as in Wreck | 899 | 249 | 0.334 | 0.439 | 1502 | 3.13 | 1.16 | 0.79 | 17 | 43 | 60 | 6 |
| I’ll Figure it out Later | 935 | 249 | 0.344 | 0.433 | 1495 | 3.30 | 1.19 | 0.83 | 25 | 31 | 56 | 7 |
| The Frugal Team | 935 | 286 | 0.327 | 0.445 | 1479 | 3.36 | 1.18 | 0.93 | 28 | 26 | 54 | 8 |
| Blue Team Bravo | 930 | 271 | 0.327 | 0.436 | 1440 | 3.51 | 1.22 | 0.89 | 18 | 17 | 35 | 9 |
| Alou Bros | 941 | 242 | 0.333 | 0.451 | 1294 | 3.87 | 1.25 | 1.10 | 29 | 4 | 33 | 10.5 |
| Gabe H. Cuod | 926 | 234 | 0.334 | 0.437 | 1425 | 3.52 | 1.19 | 0.98 | 18 | 15 | 33 | 10.5 |
| Mariachi Arod | 917 | 218 | 0.331 | 0.440 | 1379 | 3.65 | 1.23 | 0.95 | 14 | 9 | 23 | 12 |
My team (Fisher Bunnies) is in 5th and pretty balanced. In fact, even looking category by category, my team has 6, 7, 8, 9 or 10 points in every category.
A couple days ago, that was not true. A couple days ago, I had a real problem. My starting SS, Jhonny Peralta, was only being projected for 250 PA on my roster and on top of that hole, my team was OBP/R heavy, and light on SLG/HR.
So I took action – I traded away a $17 Carlos Santana, $3 Michael Saunders, and $8 Zach Britton for $30 Troy Tulowitzki and $1 Ben Paulsen (plus enough cash to free up a little bit of cap room). The deal leaves me needing a 5th RP, but it also made some big improvements.
The most obvious is that I needed a SS better than JJ Hardy, and now I have one. But Paulsen is also a better fit for me than Saunders. Neither was going to have a huge impact on my team, but I swapped some R and OBP from Saunders for some HR and SLG in Paulsen.
I also focused on moving Carlos Santana in particular because his approach leads to a very high on-base, but while he has 25-HR power, his exceedingly low average doesn’t leave much room for solid SLG out of a 1B. With him gone, my 1B/Util are Freddie Freeman and Mark Teixeira, who are actually quite balanced between them. Sure, I could have just benched Santana, but he was semi-expendable, based on my needs. If my roster had been the opposite – power heavy, light on OBP and R – I would have tried to trade Teixeira instead.
The other thing I use these projections for is to evaluate trades. I can easily pull a player out of my lineup, put a new acquisition in his place, and see if my team moves up or down the standings. In this same league, I had an opportunity to acquire an OF I am really high on and was asked for Jake Odorizzi. By the Depth Charts projections, Odorizzi is only my 5th starter, and this OF would have been in my top two or three, most likely. Yet the net impact on my team? A loss of two points. This surprised me, and I am going to do some further research to understand why this is happening, but so far I have passed on the deal based on the projected standings.
A final note – there has been a ton of talk in the ottoneu world this off-season about measuring surplus, but there can be a big gap between surplus and standings, for two reasons:
- Surplus does not know who you are using. In the Original League, I have the most surplus, but I project to finish third. Part of this is that I have players like Justin Turner who have high surplus value, but very little impact on my team. Turner is behind Kyle Seager at 3B and Joey Votto and Freddie Freeman at 1B, so his PA will be limited.
- Surplus does not know where you are using players. In the FanGraphs Staff league, Brandon Warne has insane surplus, but projects to finish 5th. Why? In part because he has a stacked MI – Manny Machado, Carlos Correa, Xander Bogaerts, and Brian Dozier for $52 TOTAL. He also has an $11 Miguel Sano. But because of the overwhelming depth at SS, he has to play Machado at 3B and Sano at OF. Both of those players have higher surplus if used at other spots – namely SS (or MI) and 3B, respectively. On top of that, he has Joe Mauer as his only 1B eligible bat, which leaves him very weak at that position. The abundance of MI surplus doesn’t get him 1B production, or pitching either.
It can take a good 30-60 minutes to set up projected standings for a league, but it is well worth the effort to understand your needs and evaluate trades.
A long-time fantasy baseball veteran and one of the creators of ottoneu, Chad Young's is the Managing Editor for RotoGraphs, and can be heard on the Keep or Kut Podcast. You can follow him on Bluesky @chadyoung.bsky.social.
I wouldn’t read too much into you losing two points in your SP5 for OF2 trade. It could just be a weird bunching in the standings. I would just focus on their auction values and worry about how the standings shake out later.
Totally valid point. And I should be clear that I did not back off purely because of 2 points – the two points was enough to make me re-evaluate and decide that my pitching was not quite as strong as I thought (And that my OF may not be as weak as I thought).
It’s more directional – “wow, this moves me from 5th to 2nd, I should probably do that unless I have a good reason not to” vs. “wow, this moves me from 2nd to 5th…”
Huh. I’m not the only one that name’s their team after Bunnies.
I name my team after high school sports mascots that I find entertaining.
http://fisherk12.com/senior-high-athletics/the-story-of-the-bunnies-mascot
Other ottoneu teams are Freeport Pretzels, Avon Old Farms Winged Beavers, and Ridgefield Spudders
Someone’s from Hartford, CT?
Probably someone is…but not me. I just like the names.
Did you still max out your innings/PA when you entered the Odorizzi trade?
Who was the OF?
Yes. I basically replaced his innings with the next best option that was not already being used. Theoretically, I could have just dropped Odorizzi and taken the hit on K rather than use lesser pitchers who will hurt my rates, but I want to make sure I treat all teams equally – Admittedly, this does mean that I am probably punishing teams that have less impressive depth but intend to leave games or innings on the table. I overrate their counting stats but underrate their rates.
Because almost our entire league reads here, I am going not going to disclose the trade talks that fell through. If the other owner involved in the Odorizzi for _______ talks wants to share, though, I am fine with that (and I will pass along word if he gives me the go ahead).
Ok, he approved – We were talking Belt. Though at the end of the day, NEITHER of us was willing to do the 1-for-1.
I miss the auction value spreadsheet from last year. Seems I’m going to have to compile a lot of information and make my own this year.
This we discussed on Twitter, but check out this link:
http://www.fangraphs.com/fantasy/ottoneu-surplus-calculator/
Mind giving a more detailed explanation about how you set this up? How do you use FanGraphs depth charts to pull in stats for each player?
A quick step-by-step guide that is probably missing a lot of detail:
1) Go to the depth charts projections and export the hitters data; then switch to pitchers and export that as well.
2) Move the playerid column on both sheets to column A.
3) Put all the hitter data in an Excel tab and all the pitcher data in a separate tab in the same workbook.
4) Export your league’s rosters from ottoneu
5) Put each team from your league in it’s own tab (so you now have 14 tabs – one for each team, one for hitters, one for pitchers)
6) Separate out the hitters and pitchers on each tab (so each team tab has one team, with two lists – hitters and pitchers)
7) for the hitters, you want the following columns added after the data that ottoneu gives you: C PA, 1B PA, 2B PA, SS PA, MI PA, 3B PA, OF PA, U PA, PA Used, PA. After that, it depends on format. For 4×4 you want AB, R, RUsed, HR, HRUsed, OBP, OBP Contribution, SLG, SLG Contribution, wOBA. For 5×5 you want basically the same, but drop OBP and SLG, add AVG, SB and RBI. For points leagues, you just need Pt/PA and Points Accrued
8) do the same thing for pitchers. You need RP IP, SP IP, IP Used, IP, and then the stats for each format. For 4×4 and 5×5 I pull in FIP for pitchers, like I pull in wOBA for hitters.
9) Set the PA Used to be the sum of the C PA, 1B PA, etc. columns. Set R Used to be (R*(PA Used/PA)) and same for other counting stats. For OBP Contribution, set that to OBP*PA. For SLG and AVG, set those contribution columns to (SLG*AB*(PA Used/PA)) (or AVG instead of SLG). For Points leagues, the Pts Accrued should be set to (Pt/PA * PA Used)
10) Use vlookups to pull relevant data off the hitter tab and onto the team tabs (you vlookup off the playerid – the equation you want to use is complicated but looks something like this:
=IFNA(VLOOKUP(C2,Hitter!A:Z,5,FALSE),IFNA(VLOOKUP(D2,Hitter!A:Z,5,FALSE),0)))
Column C on a team tab will be the FGID for MLB players, column D will be for MiLB players. So what you are doing there is saying, “If a player with this MLB ID shows up on the hitter tab, pull in the 5th column for that player; if not, check to see if this player’s MiLB ID shows up and, if so, pull in the 5th column; if not, just put in 0.”
For pitchers, you do the same, but off the pitcher tab.
10) For each team in a roto league, sort hitters by wOBA and pitchers by FIPl in a points league, sort hitters by Pt/PA and pitchers by Pt/IP
11) Fill out the positional PA columns. Basically, moving from the top down, pull in the 650 best PA you can at C, then SS, then 2B, then MI, then 3B, then OF (3250 PA for OF), then 1B, then Util. Note that you may need to adjust as you go – for example, if you have a team with Machado and Correa and Bogaerts, but your best 3B is David Freese, you will start by putting Machado at SS, then Correa mostly at MI and you will barely use Bogaerts. But when you go to fill out 3B, you will want to use Bogaerts before Freese, so you will move Machado to 3B and Bogaerts to SS to make that work.
12) Fill out the pitcher IP columns – I assume teams max out their 5 best RP, then get 50% of each of the next two, if they have them, but no more. Then fill the rest with SP.
13) Note that in 11 and 12, for roto leagues you are sorted by wOBA and FIP which are not perfect proxies for production. You may need to take a seemingly lower rated OF to help a team get more steals, for example, in 5×5.
14) Create sums for each team for 4×4, sum PA Used, R Used, HR Used, OBP Cotnribution and SLG Contribution. The sums of R Used and HR USed are that team’s projected R and HR. For OBP and SLG, take the contribution column sums and divide by PA USed for OBP and AB Used for SLG, which gives you the teams OBP and SLG. Do the same for 5×5 and for pitchers. For pitchers, you should have ERA, WHIP, and HR/9 Contribution columns, like you did for the hitting rates. Those columns should be the stats multiplied by IP and when you divide the sum by IP you will get the rate for the team. For points leagues you just have to sum points accrued and you are done
15) create another new tab called standings and pull in the final stats for each team in each stat. For points, this is all you need to do – pull in pitching points, hitting points, sum them and then see where the teams rank. For roto, you’ll pull in each of the final stats and then use the =Rank equation to figure out how many points each team gets for each stat. You want to reverse order rank – so rank HR, R, etc. ascending (from smallest to largest) and ERA, WHIP, etc. descending (from largest to smallest). That way, you will get 12 points for a small ERA and 1 point for a small AVG (and so on).
16) For roto, sum the rankings columns for a total team score.
There are some great shortcuts in there I didn’t know about, thanks for posting all that!
I have a tab pre built in my draft spreadsheet to auto vlookup the zScore point potential for each player. I do a slow draft so I can watch by pick what the possible standings will be.
For a live draft I can copy in the final grid and get an instant snapshot of the possible standings based on total points. I can also get a quick idea of how good I am by position.
Then I do a 5×5 breakdown with the pivot table tool to break down the 10 categories by team based on my projections.
I like these ideas, the one thing I do not keep up with is a database like this throughout the season to project lineup changes based on trades and overall true trade value.