Automated Surge and Slump Detection with Rolling Charts
This season I went add/drop crazy. I made 344 moves (adds/drops/trades). The next highest person in my league made 167. There were times when it was so incredibly uncomfortable to drop a quality player, releasing him to the waiver wire. When sharks are circling the boat, it’s not a good time to take a dip. However, as I’ve mentioned many times before, one of the leagues I care most about is a shallow 10-team, 5×5 roto league where turning and burning is almost a requirement, and turn and burn I did!
All season I was looking for indicators that would predict small clumps of player performance. xwOBA did a tremendous job of evaluating in-season talent. But, this offseason I will be looking for more ways to catch those small clusters of player performance that seem to elude me. When MLB The Show releases its monthly awards I’m usually like, “What? Really? How did I miss that?” To be fair, those players were usually rostered during that time, but it’s the ones that sneak onto the list that I’m trying to create a system for.
Let’s use Tyler O’Neill as an example. O’Neill ended the 2021 season with a .384 wOBA, better than the .314 league average. But, one look at his rolling chart shows significant variation in his 15-Game Rolling wOBA. Here is the standard chart that we create on FanGraphs:

These charts are, in some ways, versions of control charts and while I’m still researching which type of control chart will work best in this situation, I think a baseline version could be created, simply by adding on to what we already have here. I simply clicked on the very useful ‘Export Data’ button, added one standard deviation above and below O’Neill’s season average, and included a league average wOBA:

The red lines can be thought of as upper and lower control limits. When a player’s rolling wOBA goes above the upper limit, good! Claim! When a player’s rolling wOBA goes below the lower limit, bad! Drop! But, the real usage of this strategy would not be in the visualization, but in the ingestion of daily player data to flag players who go above and below these thresholds, creating a list of recommended adds and drops. The data would look something like this in table form:
| Date | wOBA | UCL | LCL | flag |
|---|---|---|---|---|
| 2021-05-31 | 0.433 | 0.444 | 0.301 | — |
| 2021-06-01 | 0.451 | 0.444 | 0.301 | surge |
| 2021-06-02 | 0.483 | 0.444 | 0.301 | surge |
| 2021-06-03 | 0.483 | 0.444 | 0.301 | surge |
| 2021-06-04 | 0.462 | 0.444 | 0.301 | surge |
| 2021-06-05 | 0.478 | 0.444 | 0.301 | surge |
| 2021-06-06 | 0.462 | 0.444 | 0.301 | surge |
| 2021-06-08 | 0.489 | 0.444 | 0.301 | surge |
| 2021-06-09 | 0.522 | 0.444 | 0.301 | surge |
| 2021-06-11 | 0.507 | 0.444 | 0.301 | surge |
| 2021-06-12 | 0.482 | 0.444 | 0.301 | surge |
| 2021-06-13 | 0.483 | 0.444 | 0.301 | surge |
| 2021-06-14 | 0.470 | 0.444 | 0.301 | surge |
| 2021-06-15 | 0.421 | 0.444 | 0.301 | — |
| 2021-06-16 | 0.421 | 0.444 | 0.301 | — |
If this system were in place, Tyler O’Neill was flagged, and you picked him up on the second day of his surge, you would have collected 13 hits, four doubles, three home runs, eight runs, seven RBI, and a .395 OBP across a span of 11 days. But, things went downhill after that surge, leading to an end of June slump period of six days, a climb back to season average, and then a return to a slump during the end of July. This long slump period really doesn’t look too terrible with 23 hits, four doubles, two home runs, 13 runs, five RBI, and a .323 OBP, but a swap out with a “surging” player during that time period would have been beneficial. So, who surged during that time period? I’m still working on that. But, in real-time, this system would have marked O’Neill as “slumping”, giv you a list of “surging” players, and allowed you to make decisions from there.
This is a work in progress, heavy on the work portion. I’ve used Tyler O’Neill here because he was the player that was on and off the wire in my league. Your league may be different, it may be deeper, but the system can be applied to all players. It’s too much work to analyze player rolling charts one after the other, looking for surging/slumping players. I’m hoping by next season, I’ll have this system in place and will be able to write about the players who are flagged on a weekly basis, and then we can all turn and burn together.
I made 432 moves in my 12 team head to head league. Most of that is daily pitcher and hitter streaming. I essentially reserve 2 to 3 roster spots for filling whatever need I have that day. Accordingly, I keep my bench for hitters small while rostering as many closers as I can. Infinite moves allowed obviously.
That all being said, I still think any “hot hand” analysis is bullshit. You should just always use RoS projections when deciding who should be on your roster, aside from daily streams.
Hot hand analysis is only valuable in so much as it may point out a player that requires closer scrutiny. Sometimes the hot player is just hot, other times he’s signaling a skills change.
I see two issues with this.
First, this is all well and good if you’re looking back on a season. But how do you define these upper and lower bounds in the middle of a season? Sure, you know now that O’Neill’s season wOBA was .384, but you couldn’t possibly have known that in June. I mean, look at that relatively awful April! To use this in season, you could create your UCL and LCL based on something like the player’s projected wOBA and standard deviations based on the player’s historical in-season SDs.
Second, this shouldn’t really be player dependent, it should be league dependent. Kevin Newman’s UCL by this method is .298 for 2021, while Bryce Harper’s LCL is .346 for 2021. So if there was a time frame where Newman’s 15 day wOBA exceeded .298 at the same time that Harper’s was lower than .346, this would indicate that Newman is surging and Harper is slumping, even though Harper’s wOBA exceeds Newman’s by more than 40 points. This is obviously an extreme example, but I do believe the point stands.
However, by making it league dependent, all you are basically doing is creating a “last 15 day” filter. Furthermore, as Joseph Meyer pointed out, past returns don’t indicate future results. I really don’t think this provides any added value to even a shallow league, Yahoo already has a “past 14 days” filter which basically does what this does.
This is really interesting because I usually don’t notice a hot streak (or a cold streak) until it’s in the middle of it. Because of this, over the last couple years, in terms of long term pick-ups, I’ve gobbled up guys off the waiver, or at least put them on my watch list, if they’ve been in a cold spell for their last 15 or so. or especially if they’ve really bottomed out in their last 15 – figuring they have nowhere to go but up.
I usually pick up hot hitters if, obviously, there’s a change in their profile that points to their performance staying elevated, or if I’m streaming hitters.
But I’m very interested to see how the rest of this project goes! Good stuff!
I can’t imagine playing in a league with that many moves. It seems like at some point it’s just luck – good or bad – that will help you win or lose. The league I’m in would not be good for for you since we charge for each move over a certain agreed upon number.
intrigued, but doubting this route. won my 10 team weekly where I made 180 moves and the 2nd place finisher made the second largest number of moves, about 50. However, I don’t see that the type of streaming that you propose worked and rather think that it hindered, Harrison Bader being a poster-boy. Rather this streaming worked not due to streaming hot players but due to my ability to 1) stream to max AB’s so my counting stats prevailed, 2) to not get hung up on seller’s remorse that leads players to hold onto to flailing players thereby leave the vast FA pool available to, mainly, me, where I could more quickly drop the wounded and try on value picks like Adames, and 3) because I was so freewheeling and paid attention to standings I could quickly flex my team by stocking up on players who could advance me in desirous categories, in my case I went from nearly last to 2nd in HR/RBI and completely surprised the competition by going with 5 closers until I gained a good hold in that category. Along the way you do get a Schwindel and a couple rotations of Votto but not for quick hot streaks norm, did I find, for weekly matchups. Good hitters beat matchups every time. Chasing hot streaks seems to me a fool’s errand. But I that your article led me to think that thru. Thanks.
You want to grab him when he crosses over the bottom threshold, not the top one.