Predicting High-K Fantasy Viability

Continuing my recent theme of diving deeper into topics I’ve covered previously, I wanted to revisit my analysis looking at the impact of debut k-rate on the probability of fantasy viability.
Back in June, I found that, unsurprisingly, k-rate had a marked impact on whether or not a player would reach various measures of viability. This was particularly stark (again, unsurprisingly) at higher k-rates:
| Group | $1+ | $5+ | $10+ | $20+ |
|---|---|---|---|---|
| < 35% | 38.5% | 36.9% | 28.4% | 18.0% |
| >= 35% | 12.5% | 13.3% | 10.7% | 5.9% |
That’s basically where that analysis ended though. I paid some brief lip service to the notion of back-testing by looking roughly at incidence rates of viability from 2020+ debutants, but it wasn’t a particularly robust exercise and it didn’t say anything about what traits eventually lead to viability despite a penchant for strikeouts nor about the individual prospects of recent high-k debutants.
So while it’s great to confirm what our eyes and common sense tell us, I wanted to go one step further. I think I’ve been pretty successful even if the results are likewise fairly straightforward (TL;DR: old prospects bad, power good). Read on to find out more.
Research Question and Data Issues
Before getting too deep in the weeds for this article, I strongly recommend at least skimming the one I wrote earlier in the summer for explanations for how I measure fantasy viability, what a logistic regression is, and some other background analysis. I also recommend looking into my treatise on relievers (already linked above) to refresh yourself on the analysis techniques you’ll find below.
…
Are you back? Great. The question I wanted to answer here is twofold:
- Among the high-k rate debutant population, what other traits are associated with fantasy viability?
- How can we use that information to model the likelihood of recent debutants to reach fantasy viability?
Once I started specifying some models I immediately ran into a problem: rising strikeout rates over time. Because strikeouts are proliferating to such a high degree, there is a “rising tides shift all boats” effect. In other words, eventual fantasy viability is becoming more frequent among high k-rates debutants:
This created a host of issues. For one, it was clustering all of my “hits” in the back end of the data sample. Mechanically, this was a problem because it only gave my training sample scraps to work with. But even more sinister was that it was introducing bias into the model because the sort of player getting caught in a “>35% k-rate” net in 2020 is generally much different than a player from much earlier in the sample. This caused my blind model tests to significantly underestimate instances of viability across the board, and caused my sparser viability models (particularly $20) to have trouble even rank ordering probabilities correctly, let alone measuring them with any sort of precision.
In my previous analysis, I battled these year effects by controlling for them in the regression, and presented “predicted” results by calibrating on a base year of 2019. This technique worked because, as I mentioned before, my “blind test” wasn’t very rigorous, and served mainly as a footnote for the rest of the causal inference-lite exercise. Because my current substantive aim is prediction, controlling for year in the same manner would be problematic because while my coefficients on each year’s environment would do a great job of removing the impact of any given year on how k-rate interacts with viability, they wouldn’t say anything about how future years’ k-rate environments will look.
One way to account for that is to try model it explicitly by introducing a trend or making some other assumption about how we expect league strikeout rates to behave over the coming years. I took a couple rough stabs at it by using basic trend line and rolling average models but that wasn’t successful and I eventually scrapped it. What I settled on was side-stepping the problem, in a way: turning each player’s debut k-rate into a z-score.
To this end, I split Retrosheet event data into 60-PA samples for all players in each year, and calculated the mean and standard deviation strikeout rates for these samples. Now, since players overwhelmingly don’t finish their seasons with plate appearance totals that are multiples of 60, I had to devise a way to account for this. I set the code to take the remainder n after dividing a player’s plate appearances by 60, and randomly select an offset from 0 to n, and start the 60-plate appearance counts from there. I would then discard the plate appearances from before the offset start, and after the last multiple of 60 finished grabbing PAs.
To put some actual numbers on it, consider a player with 579 plate appearances. The remainder is 579 – [ 9 * 60 ] = n = 39. Take a random number between 0 and 39, start collecting plate appearances from that number, and once the ninth batch of 60 is tabulated, discard the remaining. This mechanic might seem trivial but it’s important because if I don’t incorporate it then the plate appearance samples aren’t random; they would most likely be systematically leaving out some not insignificant number of plate appearances toward the end of the season across the league.
One note: this measure is still imperfect. You might still introduce some bias in this measure if we expect players who do not accrue at least 60 plate appearances in a given year to strike out in a manner different from players who do. I looked into it, and unsurprisingly, these players do. This is relevant because 44% of 60-PA debuts (and 59% of high-K debuts) overlap between two seasons, which means they are not being caught in the calculation pool.
But – plate appearances from players who don’t accrue 60 in a season only constitute roughly 2% of the total in all non-shortened seasons across the sample (strike and Covid years run higher to varying degrees). These exclusions are also going to be balanced out by the plate appearances being excluded by the “remainder” calculation as well. Overall, this results in block means generally not greater than .1% or .2% (e.g. 14.1% vs. 14.3%) lower than the league k-rate in a given year, so any effect this has is going to be small. Further, it doesn’t, in my opinion, invalidate the results. My aim with this measure is to account for the effect of a particular season’s strikeout environment, which this still does. If you, dear reader, are fluent in predictive modeling and have a better suggestion, I’m happy to take it in the comments.
In any case, once I made this adjustment, I looked at what the modern k-rate environment looks like translated into z-scores:
| z-Score | First-60 K% |
|---|---|
| -3.0 | Below 0% |
| -2.5 | 2.10% |
| -2.0 | 6.00% |
| -1.5 | 10.00% |
| -1 | 13.90% |
| -0.50 | 17.90% |
| 0 | 21.80% |
| 0.50 | 25.80% |
| 1.0 | 29.70% |
| 1.5 | 33.70% |
| 2.0 | 37.60% |
| 2.5 | 41.60% |
| 3.0 | 45.50% |
From these data I ultimately settled on 1.5 standard deviations above the mean as my 35% k-rate cutoff replacement. I could have used 1.67, which is what 35% more cleanly translates to, but I like round numbers and, full transparency, using 1.5 resulted in slightly cleaner (but not directionally different) model results. So that’s what I went with. Here is what that mark looks like over time:

This helps illustrate what I was talking about earlier; my sample was getting heavily biased because a 35% k-rate was probably closer to 2.5 or 3 standard deviations above the mean in the earlier years of my sample but is only approximately 1.5 above the mean in more recent seasons. Looking at the proportion of viable fantasy performers over time by this measure (1.5 standard deviations) instead:

These trends are so beautifully flat that they could bring a tear to your eye. There are some quirks in the data – the bands of variance, interestingly, are notably tighter around Y2K – but using this variable should (and did) significantly improve our model results (for technical reasons about why this is the case, you can read up on stationarity).
Using this measure also had the added benefit allowing me to reach further back in time to build a bigger sample. I chose players who debuted in 1977 or later somewhat arbitrarily, but also because that was when the league expanded to 26 teams. Replacement levels get weird around expansion eras and the preceding decade and a half prior to that point featured twice as much expansion as we’ve seen in the five since. So using 1977 as a cutoff felt as good as any other year.
Variable Choice
Circling back to my first question above:
- Among the high-k rate debutant population, what other traits are associated with fantasy viability?
I kept my scope here pretty narrow. I wanted the statistics I used to be readily available over a long history (so no Statcast), easily interpreted, and the densest store of potential information. To accomplish this, I gathered z-score scaled versions of k-rate, bb-rate, and ISO. I also used age at debut as a potential independent variable. My thinking here was that k-rate and bb-rate tell us how discerning a player is at the plate, and ISO is a great, if blunt, tool to measure a player’s contact quality. I didn’t use other rate stats like batting average, OBP, slugging, or OPS because the information gleaned from each of those should mostly be contained within the variables I chose. K-rate will be heavily correlated with batting average, walk rate will be heavily correlated with OBP and OPS, ISO likewise with all of the above.
ISO and age turned out to be the most promising independent variables, and we actually didn’t need fancy analysis to ascertain that:


Unsurprisingly, being younger and hitting for more power upon your debut portends better odds for fantasy viability. If you wanted to stop here (please don’t) you could and still have a decent takeaway. Among players whose strikeout rate is greater than 1.5 standard devations above league average, approximately 40% of those who debut at 21 or younger eventually return a $10 viable season, as do about a quarter of those who are simply above average in ISO for their first batch of plate appearances. The story here is pretty clean – age is a useful proxy for prospect status while ISO is not just a proxy but a literal manifestation of a player’s ability to hit for meaningful power. If there are going to be any clues about how they’ll fare, these two stats are probably about as meaningful as any.
Regarding the other two – k-rate and walk rate, I played around with them in the models but ultimately found that they weren’t adding material value to the results so I largely scrapped them from the analysis. This also makes sense to me; by already filtering on k-rate, we’ve preemptively chopped out a lot of meaningful variance the stat can offer, and walk rate is notably noisier in small samples.
Model Results
Onto the meat and potatoes of this analysis. My approach was basically the same as in my tome on relievers – elastic net logistic regressions that I evaluated using a combination of cross validation and back-testing techniques. Here are the base viability frequencies for different levels across different sample populations:
| Sample | Players | $1+ | $5+ | $10+ | $20+ |
|---|---|---|---|---|---|
| Cross-Validation (1977-2020) | 628 | 164 | 139 | 114 | 69 |
| Back-Test Train (1977-2002) | 341 | 90 | 77 | 60 | 40 |
| Back-Test Test (2008-2020) | 213 | 53 | 43 | 37 | 17 |
| Outlook (2021-2025) | 74 | 11 | 10 | 8 | 3 |
One thing to note – these ranges are for debutant seasons, meaning they use players whose debuts fell within the year range depicted. It still takes information from outside the range (for example, 2021+ for the cross validation) to determine whether a player ever becomes fantasy viable. This results in a couple of quirks. First, my cross-validation sample ends at 2020. This means that, for cross-validation, I am not looking at players who’ve debuted later than that point. In my initial k-rate analysis, I found that players rarely take more than six seasons to ever achieve fantasy viability, so that’s where I had to cut the sample off to avoid truncation bias.
The second is that there is a six-year gap between the end of the training data and the beginning of the back-test sample. This is for basically the same reason. Back-testing isn’t really valuable unless it’s blind, and if I’m pretending that I’m in 2008 predicting the next decade and change of debutants, I can’t leverage data from recent years prior to that because I’ll be truncating my training sample.
I see both positives and negatives resulting from this. On the negative side, if I eventually want to predict 2026 debutants, by this setup, I can’t leverage data on debutants from after 2020. But on the flipside, as you’ll see, these models still perform pretty well despite this issue. I take this as a sign that the conclusions I’ve drawn are fairly robust. In any case, cross-validation looked pretty good. As a reminder, you can think of the cross validation as using hitters that the model does know about to predict hitters that it doesn’t. The cross validation results are importantly not blind to the time horizon, though.
| Target | AUC | Brier | Top-20% Capture |
|---|---|---|---|
| $1+ | 0.745 (0.704 to 0.788) | 0.164 (0.148 to 0.180) | 40.9% (35.1% to 46.5%) |
| $5+ | 0.754 (0.709 to 0.798) | 0.147 (0.130 to 0.165) | 42.3% (36.1% to 49.4%) |
| $10+ | 0.757 (0.711 to 0.800) | 0.130 (0.112 to 0.146) | 44.0% (37.2% to 52.6%) |
| $20+ | 0.754 (0.698 to 0.811) | 0.088 (0.072 to 0.107) | 47.2% (37.5% to 58.2%) |
We have AUC values within a pretty tight band all well above a baseline rate of 0.5, and are clustering a plurality of our hits in the bucket that the model rates as the likeliest to succeed. The Brier scores all check out relatively well relative to a baseline rate:
| Target | Model Brier | Base-Rate Brier | Brier Skill |
|---|---|---|---|
| $1+ | 0.1639 (0.1485 to 0.1801) | 0.1930 (0.1762 to 0.2097) | 0.151 (0.099 to 0.205) |
| $5+ | 0.1471 (0.1302 to 0.1646) | 0.1724 (0.1537 to 0.1919) | 0.146 (0.085 to 0.204) |
| $10+ | 0.1295 (0.1117 to 0.1456) | 0.1486 (0.1273 to 0.1679) | 0.128 (0.065 to 0.186) |
| $20+ | 0.0884 (0.0716 to 0.1069) | 0.0978 (0.0792 to 0.1177) | 0.096 (0.033 to 0.162) |
And our tiers are fairly well differentiated with instances of probability that are likewise pretty good:
| Tier | Players | $1+ Predicted (Actual) | $5+ Predicted (Actual) | $10+ Predicted (Actual) | $20+ Predicted (Actual) |
|---|---|---|---|---|---|
| 1 of 5 (Highest) | 126 | 53.0% (52.4%; 66) | 48.2% (46.8%; 59) | 41.7% (38.9%; 49) | 27.1% (26.2%; 33) |
| 2 of 5 | 126 | 33.2% (34.1%; 43) | 28.0% (30.2%; 38) | 22.6% (25.4%; 32) | 13.0% (14.3%; 18) |
| 3 of 5 | 126 | 22.8% (21.4%; 27) | 18.3% (15.1%; 19) | 14.3% (12.7%; 16) | 8.0% (7.1%; 9) |
| 4 of 5 | 125 | 14.7% (17.6%; 22) | 11.3% (16.8%; 21) | 8.6% (13.6%; 17) | 4.8% (7.2%; 9) |
| 5 of 5 (Lowest) | 125 | 6.7% (4.8%; 6) | 4.8% (1.6%; 2) | 3.6% (0.0%; 0) | 2.0% (0.0%; 0) |
Here are the players that our cross-validation model rated as most likely to eventually succeed:
| Rank (out of 628) | Name | Debut | Age | ISO | ISO z | K% | K% z | P($1+) | P($5+) | P($10+) | P($20+) | Highest Reached | Peak $ |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Tom Brunansky | 1981 | 20 | .320 | +2.55 | 21.7% | +1.71 | 82.8% | 80.8% | 80.4% | 68.4% | $5+ | $7.98 |
| 2 | Carlos Delgado | 1993 | 21 | .481 | +3.60 | 26.7% | +1.83 | 81.7% | 79.6% | 75.9% | 59.4% | $20+ | $30.80 |
| 3 | Fred Manrique | 1981 | 19 | .158 | +0.50 | 28.3% | +2.85 | 79.2% | 77.4% | 71.2% | 56.0% | None | -$0.76 |
| 4 | Justin Upton | 2007 | 19 | .214 | +0.55 | 28.3% | +1.68 | 77.7% | 75.3% | 70.7% | 54.6% | $20+ | $31.42 |
| 5 | Jason Heyward | 2010 | 20 | .306 | +1.64 | 30.0% | +1.67 | 78.4% | 74.5% | 68.9% | 55.6% | $10+ | $19.76 |
| 6 | Matt Kemp | 2006 | 21 | .434 | +2.66 | 26.7% | +1.53 | 75.7% | 73.9% | 66.8% | 51.7% | $20+ | $61.76 |
| 7 | Rick Ankiel | 1999 | 19 | .164 | -0.06 | 28.3% | +1.91 | 74.1% | 70.5% | 64.5% | 49.0% | $1+ | $1.16 |
| 8 | Alex Rodriguez | 1994 | 18 | .000 | -1.58 | 33.3% | +2.71 | 70.9% | 68.5% | 63.3% | 41.3% | $20+ | $60.33 |
| 9 | Bobby Estalella | 1996 | 21 | .365 | +1.92 | 28.3% | +1.80 | 71.3% | 67.7% | 61.7% | 45.4% | None | -$7.96 |
| 10 | Dean Palmer | 1989 | 20 | .200 | +0.88 | 35.0% | +3.04 | 73.1% | 67.9% | 61.5% | 45.4% | $10+ | $16.55 |
This tracks neatly; for example, we have a list of 10 players who are all between 68% and 81% likely to hit $5 viability and seven did. The players who the model rated as least likely, correspondingly, are who you’d most expect.
| Rank (out of 628) | Name | Debut | Age | ISO | ISO z | K% | K% z | P($1+) | P($5+) | P($10+) | P($20+) | Highest Reached | Peak $ |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 628 | Alan Zinter | 2002 | 34 | .138 | -0.25 | 41.7% | +3.66 | 0.1% | 0.1% | 0.1% | 0.0% | None | -$18.16 |
| 627 | Eddy Alvarez | 2020 | 30 | .094 | -0.83 | 36.7% | +1.71 | 0.8% | 0.5% | 0.4% | 0.2% | None | -$24.03 |
| 626 | Randy Ruiz | 2008 | 30 | .091 | -0.70 | 28.3% | +1.60 | 0.8% | 0.5% | 0.4% | 0.2% | None | -$39.02 |
| 625 | Jorge Brito | 1995 | 29 | .055 | -1.04 | 30.0% | +2.11 | 1.2% | 0.8% | 0.6% | 0.3% | None | -$22.95 |
| 624 | Anthony Bemboom | 2019 | 29 | .123 | -0.66 | 36.7% | +1.87 | 1.4% | 0.8% | 0.6% | 0.4% | None | -$14.82 |
| 623 | Mandy Romero | 1997 | 29 | .105 | -0.56 | 35.0% | +2.79 | 1.4% | 1.0% | 0.7% | 0.4% | None | -$17.15 |
| 622 | Chris Colabello | 2013 | 29 | .105 | -0.49 | 31.7% | +1.64 | 1.3% | 1.0% | 0.7% | 0.3% | $1+ | $1.33 |
| 621 | Aaron Guiel | 2002 | 29 | .137 | -0.25 | 30.0% | +1.99 | 1.6% | 1.1% | 0.8% | 0.4% | None | -$7.09 |
| 620 | D. T. Cromer | 2000 | 29 | .196 | +0.21 | 28.3% | +1.88 | 2.0% | 1.2% | 0.9% | 0.5% | None | -$41.39 |
| 619 | Matt Skole | 2018 | 28 | .075 | -0.98 | 33.3% | +1.51 | 2.1% | 1.3% | 0.9% | 0.6% | None | -$38.66 |
I have generally not heard of these guys. We do have one $1 viability hit from Chris Colabello, but otherwise, this basically checks out too.
We can also find out which of the two independent variables is adding more value to the forecast by looking at how much AUC drops if we remove it:
| Target | Variable | Coefficient | AUC Drop |
|---|---|---|---|
| $1+ | Debut Age | -0.516 | 0.202 |
| $1+ | First-60 ISO (z) | 0.417 | 0.042 |
| $5+ | Debut Age | -0.545 | 0.225 |
| $5+ | First-60 ISO (z) | 0.451 | 0.048 |
| $10+ | Debut Age | -0.542 | 0.224 |
| $10+ | First-60 ISO (z) | 0.448 | 0.045 |
| $20+ | Debut Age | -0.530 | 0.199 |
| $20+ | First-60 ISO (z) | 0.465 | 0.052 |
First, looking at the sign of the coefficients, it confirms what logic would tell us: higher age upon debut, lower probability. Higher ISO, greater probability. We can also see that debut age comes out to be roughly four to five times more important than ISO in these regressions. This result surprised me at first because I added age into the regressions as a “why not” sort of afterthought. Lo and behold, it ended up the much more powerful predictor of the two. This is intuitive based on the bar charts I showed previously; the differences as age increases are stark. A player goes from roughly 40% likely at age 21 or younger upon debut to 0% at age 25 or older. The difference in ISO, meanwhile, is present but much more muted.
Transitioning to back-testing, where I’m trying to blindly predict the successes of 2008 to 2020 debutants, the variable importance is similar but noisier:
| Target | Variable | Coefficient | AUC Drop |
|---|---|---|---|
| $1+ | Debut Age | -0.550 | 0.174 |
| $1+ | First-60 ISO (z) | 0.461 | 0.043 |
| $5+ | Debut Age | -0.517 | 0.215 |
| $5+ | First-60 ISO (z) | 0.438 | 0.058 |
| $10+ | Debut Age | -0.471 | 0.223 |
| $10+ | First-60 ISO (z) | 0.406 | 0.058 |
| $20+ | Debut Age | -0.532 | 0.152 |
| $20+ | First-60 ISO (z) | 0.348 | 0.080 |
The coefficients are directionally the same and in the same ballpark of magnitude. Likewise, the AUC drops are roughly similar except for the $20 viability model. Going into the more detailed picture of back-test performance, the story basically stays the same:
| Target | AUC | Brier | Top-20% Capture |
|---|---|---|---|
| $1+ | 0.719 (0.636 to 0.798) | 0.163 (0.130 to 0.198) | 43.4% (32.3% to 54.4%) |
| $5+ | 0.775 (0.694 to 0.849) | 0.133 (0.101 to 0.163) | 51.2% (37.1% to 63.6%) |
| $10+ | 0.783 (0.703 to 0.856) | 0.121 (0.089 to 0.154) | 54.1% (38.6% to 67.7%) |
| $20+ | 0.717 (0.587 to 0.838) | 0.069 (0.042 to 0.096) | 47.1% (22.2% to 70.0%) |
Here, we have similar point estimates but wider confidence bands, particularly for the $20 model. Our Brier scores, again, tell a similar picture:
| Target | Model Brier | Base-Rate Brier | Brier Skill |
|---|---|---|---|
| $1+ | 0.1630 (0.1304 to 0.1984) | 0.1871 (0.1605 to 0.2138) | 0.129 (0.038 to 0.229) |
| $5+ | 0.1327 (0.1013 to 0.1630) | 0.1617 (0.1333 to 0.1901) | 0.179 (0.087 to 0.272) |
| $10+ | 0.1210 (0.0893 to 0.1540) | 0.1435 (0.1101 to 0.1740) | 0.157 (0.083 to 0.240) |
| $20+ | 0.0691 (0.0422 to 0.0963) | 0.0748 (0.0496 to 0.1000) | 0.076 (-0.012 to 0.175)* |
Our tier capture is likewise also well differentiated for the top bucket, but our probabilities are drifting; some are close, some are not. This is particularly the case for the top bucket of the $5 and $10 hit rates, which significantly underestimated the instance of viability in the sample. The discrimination between the middle buckets begins to blur a bit as well.
| Tier | Players | $1+ Predicted (Actual) | $5+ Predicted (Actual) | $10+ Predicted (Actual) | $20+ Predicted (Actual) |
|---|---|---|---|---|---|
| 1 of 5 (Highest) | 43 | 44.5% (53.5%; 23) | 38.3% (51.2%; 22) | 29.6% (46.5%; 20) | 20.0% (18.6%; 8) |
| 2 of 5 | 43 | 25.3% (18.6%; 8) | 21.2% (18.6%; 8) | 16.2% (14.0%; 6) | 10.0% (7.0%; 3) |
| 3 of 5 | 43 | 16.6% (27.9%; 12) | 14.0% (16.3%; 7) | 10.9% (14.0%; 6) | 6.2% (4.7%; 2) |
| 4 of 5 | 42 | 10.1% (16.7%; 7) | 8.5% (11.9%; 5) | 6.9% (11.9%; 5) | 3.7% (9.5%; 4) |
| 5 of 5 (Lowest) | 42 | 4.3% (7.1%; 3) | 3.7% (2.4%; 1) | 3.2% (0.0%; 0) | 1.6% (0.0%; 0) |
In short, for this back-testing sample, everything is directionally similar to the cross-validation result but just a little worse across the board. To see if this was something unique to the era window that I was testing, I also performed a series of alternate back-test windows to see how the model did at differing cutoff points:
| Target | Test Debuts | Trained Through | Train n (Hits) | Test n (Hits) | AUC | Top-20% Capture | Brier Skill | Mean Predicted | Actual |
|---|---|---|---|---|---|---|---|---|---|
| $1+ | 1996-2000 | 1977-1990 | 161 (52) | 74 (13) | 0.831 (0.722 to 0.920) | 46.2% (22.2% to 72.7%) | 0.241 (0.050 to 0.418) | 26.90% | 17.60% |
| $1+ | 2001-2005 | 1977-1995 | 234 (69) | 76 (19) | 0.702 (0.571 to 0.820) | 42.1% (20.0% to 60.0%)* | 0.098 (-0.060 to 0.239)* | 23.80% | 25.00% |
| $1+ | 2006-2010 | 1977-2000 | 308 (82) | 83 (21) | 0.728 (0.592 to 0.842) | 42.9% (23.1% to 58.8%) | 0.170 (0.000 to 0.339) | 23.00% | 25.30% |
| $1+ | 2011-2015 | 1977-2005 | 384 (101) | 72 (19) | 0.740 (0.590 to 0.874) | 47.4% (30.0% to 68.8%) | 0.155 (-0.008 to 0.323)* | 21.00% | 26.40% |
| $1+ | 2016-2020 | 1977-2010 | 467 (122) | 89 (23) | 0.696 (0.559 to 0.821) | 43.5% (22.6% to 57.1%) | 0.091 (-0.055 to 0.242)* | 20.00% | 25.80% |
| $1+ | All Windows | Varies | Varies | 394 (95) | 0.729 (0.672 to 0.782) | 42.1% (33.3% to 49.0%) | 0.146 (0.079 to 0.214) | 22.90% | 24.10% |
| $5+ | 1996-2000 | 1977-1990 | 161 (44) | 74 (12) | 0.802 (0.697 to 0.897) | 41.7% (16.6% to 70.0%)* | 0.150 (-0.047 to 0.328)* | 22.50% | 16.20% |
| $5+ | 2001-2005 | 1977-1995 | 234 (58) | 76 (17) | 0.675 (0.538 to 0.802) | 41.2% (16.7% to 61.1%)* | 0.061 (-0.087 to 0.202)* | 19.70% | 22.40% |
| $5+ | 2006-2010 | 1977-2000 | 308 (70) | 83 (17) | 0.740 (0.595 to 0.859) | 47.1% (21.4% to 66.7%) | 0.182 (0.004 to 0.355) | 19.60% | 20.50% |
| $5+ | 2011-2015 | 1977-2005 | 384 (87) | 72 (16) | 0.778 (0.652 to 0.896) | 50.0% (30.0% to 75.0%) | 0.173 (0.036 to 0.317) | 18.10% | 22.20% |
| $5+ | 2016-2020 | 1977-2010 | 467 (104) | 89 (19) | 0.769 (0.635 to 0.882) | 52.6% (28.0% to 69.2%) | 0.157 (0.031 to 0.286) | 17.00% | 21.30% |
| $5+ | All Windows | Varies | Varies | 394 (81) | 0.752 (0.697 to 0.805) | 44.4% (33.8% to 53.3%) | 0.144 (0.080 to 0.212) | 19.30% | 20.60% |
| $10+ | 1996-2000 | 1977-1990 | 161 (35) | 74 (10) | 0.820 (0.712 to 0.918) | 50.0% (20.0% to 80.0%)* | 0.154 (0.001 to 0.293) | 18.30% | 13.50% |
| $10+ | 2001-2005 | 1977-1995 | 234 (45) | 76 (14) | 0.706 (0.555 to 0.840) | 35.7% (15.8% to 63.7%)* | 0.081 (-0.046 to 0.202)* | 15.30% | 18.40% |
| $10+ | 2006-2010 | 1977-2000 | 308 (55) | 83 (15) | 0.790 (0.647 to 0.904) | 53.3% (26.3% to 73.4%) | 0.210 (0.053 to 0.379) | 15.50% | 18.10% |
| $10+ | 2011-2015 | 1977-2005 | 384 (69) | 72 (14) | 0.781 (0.642 to 0.912) | 50.0% (28.6% to 77.8%) | 0.155 (0.030 to 0.288) | 14.20% | 19.40% |
| $10+ | 2016-2020 | 1977-2010 | 467 (84) | 89 (16) | 0.783 (0.659 to 0.886) | 56.2% (28.6% to 73.3%) | 0.140 (0.026 to 0.259) | 13.40% | 18.00% |
| $10+ | All Windows | Varies | Varies | 394 (69) | 0.774 (0.722 to 0.827) | 46.4% (37.5% to 57.1%) | 0.148 (0.093 to 0.208) | 15.30% | 17.50% |
| $20+ | 1996-2000 | 1977-1990 | 161 (24) | 74 (7) | 0.770 (0.618 to 0.902) | 42.9% (0.0% to 85.9%)* | 0.051 (-0.135 to 0.189)* | 12.60% | 9.50% |
| $20+ | 2001-2005 | 1977-1995 | 234 (32) | 76 (6) | 0.705 (0.484 to 0.913)* | 33.3% (0.0% to 86.8%)* | 0.075 (-0.099 to 0.252)* | 10.60% | 7.90% |
| $20+ | 2006-2010 | 1977-2000 | 308 (39) | 83 (9) | 0.793 (0.625 to 0.945) | 55.6% (22.2% to 88.9%) | 0.193 (0.013 to 0.382) | 10.80% | 10.80% |
| $20+ | 2011-2015 | 1977-2005 | 384 (45) | 72 (6) | 0.765 (0.533 to 0.931) | 50.0% (0.0% to 100.0%)* | 0.086 (-0.045 to 0.241)* | 8.70% | 8.30% |
| $20+ | 2016-2020 | 1977-2010 | 467 (54) | 89 (9) | 0.693 (0.514 to 0.862) | 44.4% (0.0% to 71.4%)* | 0.048 (-0.052 to 0.185)* | 8.10% | 10.10% |
| $20+ | All Windows | Varies | Varies | 394 (37) | 0.746 (0.672 to 0.818) | 43.2% (28.6% to 58.3%) | 0.094 (0.022 to 0.165) | 10.10% | 9.40% |
I sound like a broken record, but here, we have a picture that is broadly similar. AUC values are generally in the 0.70 range, and roughly 40% of the hits for each viability level are getting captured in the top quintile of forecasted probabilities. One new piece of information is at the far right of the table: overall predicted instance rates are all pretty close to their observed quantities. I take this cluster of outcomes to indicate that I’m genuinely on to something here but the model could still use some tweaks. That said, I do think it’s saying something about the power of these two variables (ISO and age) that we can build models with data that are (in a sense) quite stale and still get useful, if imperfect results.
Outlook on Recent Debutants:
Going back to the second part of my research question:
- How can we use that information to model the likelihood of recent debutants to reach fantasy viability?
Here is what you all have been waiting for: a list of recent debutants and their respectively probabilities. Please note that 2026 event data are not available from Retrosheet yet, so anyone whose 2025 debut stretched into 2026, or for whom 2026 encompassed their entire debut sample will not be in the analysis. Once Retrosheet releases the data, I will run the model on those players and publish an update.
| # | Name | Debut | Age | ISO | ISO z | K% | K% z | P($1+) | P($5+) | P($10+) | P($20+) | Highest Reached | Peak $ |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Jackson Holliday | 2024 | 20 | 0.182 | 0.23 | 41.70% | 2.49 | 66.20% | 62.50% | 55.40% | 38.10% | N/A | ($2.78) |
| 2 | Akil Baddoo | 2021 | 22 | 0.386 | 2.2 | 43.30% | 2.62 | 61.30% | 57.60% | 50.30% | 34.80% | N/A | $0.00 |
| 3 | Jhonkensy Noel | 2024 | 22 | 0.327 | 1.76 | 36.70% | 1.85 | 56.90% | 52.70% | 45.40% | 30.30% | N/A | ($28.71) |
| 4 | Liover Peguero | 2022 | 21 | 0.196 | 0.44 | 38.30% | 2.04 | 56.10% | 51.40% | 44.20% | 28.60% | N/A | ($26.42) |
| 5 | Eguy Rosario | 2022 | 22 | 0.304 | 1.6 | 35.00% | 1.62 | 55.30% | 50.90% | 43.70% | 28.80% | N/A | ($35.09) |
| 6 | Oneil Cruz | 2021 | 22 | 0.276 | 1.06 | 35.00% | 1.58 | 49.80% | 44.90% | 37.80% | 24.00% | $10+ | $11.71 |
| 7 | Jordan Lawlar | 2023 | 20 | 0 | -1.76 | 38.30% | 2.02 | 46.20% | 40.40% | 33.60% | 19.60% | N/A | ($34.64) |
| 8 | Carson Williams | 2025 | 22 | 0.196 | 0.37 | 38.30% | 2.09 | 42.60% | 37.30% | 30.80% | 18.60% | N/A | ($44.63) |
| 9 | Julio Rodríguez | 2022 | 21 | 0.055 | -1.11 | 41.70% | 2.46 | 40.20% | 34.60% | 28.30% | 16.30% | $20+ | $33.72 |
| 10 | Grant McCray | 2024 | 23 | 0.246 | 0.9 | 43.30% | 2.71 | 35.70% | 30.50% | 24.70% | 14.70% | N/A | ($36.84) |
| 11 | Taylor Trammell | 2021 | 23 | 0.212 | 0.4 | 41.70% | 2.41 | 31.10% | 26.00% | 20.80% | 12.00% | N/A | ($29.03) |
| 12 | Dérmis Garcia | 2022 | 24 | 0.302 | 1.58 | 41.70% | 2.46 | 30.60% | 25.70% | 20.60% | 12.20% | N/A | ($36.03) |
| 13 | Bo Naylor | 2022 | 22 | 0.073 | -0.91 | 38.30% | 2.04 | 30.40% | 25.10% | 20.10% | 11.20% | N/A | ($12.75) |
| 14 | Nick Kurtz | 2025 | 22 | 0.075 | -0.91 | 38.30% | 2.09 | 30.40% | 25.10% | 20.00% | 11.20% | $10+ | $17.20 |
| 15 | Elehuris Montero | 2022 | 23 | 0.172 | 0.17 | 36.70% | 1.83 | 29.10% | 24.10% | 19.20% | 11.00% | N/A | ($23.85) |
| 16 | Graham Pauley | 2024 | 23 | 0.172 | 0.13 | 36.70% | 1.85 | 28.70% | 23.70% | 18.90% | 10.80% | N/A | ($27.85) |
| 17 | Shea Langeliers | 2022 | 24 | 0.276 | 1.3 | 41.70% | 2.46 | 28.20% | 23.40% | 18.60% | 10.90% | $10+ | $17.59 |
| 18 | Alexander Canario | 2023 | 23 | 0.179 | 0.09 | 38.30% | 2.02 | 28.40% | 23.40% | 18.60% | 10.60% | N/A | ($26.55) |
| 19 | Nick Pratto | 2022 | 23 | 0.16 | 0.04 | 35.00% | 1.62 | 28.00% | 23.00% | 18.30% | 10.40% | N/A | ($27.51) |
| 20 | Everson Pereira | 2023 | 22 | 0.056 | -1.19 | 40.00% | 2.23 | 28.10% | 22.90% | 18.10% | 10.00% | N/A | ($34.67) |
| 21 | Edouard Julien | 2023 | 24 | 0.275 | 1.09 | 36.70% | 1.81 | 26.40% | 21.70% | 17.20% | 10.00% | N/A | ($7.77) |
| 22 | Sebastián Rivero | 2021 | 22 | 0.037 | -1.4 | 35.00% | 1.58 | 26.30% | 21.20% | 16.70% | 9.10% | N/A | ($26.49) |
| 23 | Jordan Beck | 2024 | 23 | 0.133 | -0.28 | 38.30% | 2.07 | 25.40% | 20.50% | 16.20% | 9.10% | $1+ | $1.66 |
| 24 | Tyler Locklear | 2024 | 23 | 0.13 | -0.32 | 38.30% | 2.07 | 25.10% | 20.30% | 16.00% | 8.90% | N/A | ($39.60) |
| 25 | Coby Mayo | 2024 | 22 | 0 | -1.68 | 46.70% | 3.14 | 24.10% | 19.20% | 15.10% | 8.10% | N/A | ($5.30) |
| 26 | Garrett Mitchell | 2022 | 23 | 0.111 | -0.49 | 43.30% | 2.67 | 23.80% | 19.00% | 15.00% | 8.30% | N/A | $0.36 |
| 27 | Colby Thomas | 2025 | 24 | 0.222 | 0.64 | 43.30% | 2.72 | 23.00% | 18.50% | 14.50% | 8.30% | N/A | ($26.27) |
| 28 | Matthew Lugo | 2025 | 24 | 0.22 | 0.62 | 36.70% | 1.88 | 22.80% | 18.40% | 14.40% | 8.20% | N/A | ($31.68) |
| 29 | Josh Jung | 2022 | 24 | 0.207 | 0.55 | 43.30% | 2.67 | 22.30% | 17.90% | 14.00% | 7.90% | $5+ | $6.27 |
| 30 | Josh Lowe | 2021 | 23 | 0.094 | -0.81 | 36.70% | 1.79 | 21.40% | 16.90% | 13.20% | 7.20% | $10+ | $16.50 |
| 31 | Brandon Marsh | 2021 | 23 | 0.075 | -1.01 | 35.00% | 1.58 | 20.10% | 15.70% | 12.20% | 6.60% | N/A | $0.35 |
| 32 | Matt Wallner | 2022 | 24 | 0.17 | 0.15 | 40.00% | 2.25 | 19.50% | 15.40% | 12.00% | 6.70% | N/A | ($14.07) |
| 33 | Jordyn Adams | 2023 | 23 | 0.053 | -1.22 | 38.30% | 2.02 | 18.70% | 14.50% | 11.30% | 6.10% | N/A | ($36.82) |
| 34 | Jerar Encarnacion | 2022 | 24 | 0.155 | -0.01 | 41.70% | 2.46 | 18.50% | 14.50% | 11.20% | 6.20% | N/A | ($30.37) |
| 35 | Justyn-Henry Malloy | 2024 | 24 | 0.157 | -0.03 | 40.00% | 2.28 | 18.40% | 14.40% | 11.20% | 6.20% | N/A | ($30.56) |
| 36 | Brenton Doyle | 2023 | 25 | 0.281 | 1.15 | 35.00% | 1.6 | 18.10% | 14.20% | 11.00% | 6.30% | $10+ | $16.46 |
| 37 | Jarren Duran | 2021 | 24 | 0.158 | -0.16 | 38.30% | 1.99 | 17.70% | 13.70% | 10.60% | 5.90% | $20+ | $31.66 |
| 38 | Zach Dezenzo | 2024 | 24 | 0.14 | -0.21 | 35.00% | 1.64 | 17.40% | 13.40% | 10.40% | 5.70% | N/A | ($29.90) |
| 39 | Wade Meckler | 2023 | 23 | 0.019 | -1.56 | 40.00% | 2.23 | 16.70% | 12.70% | 9.80% | 5.20% | N/A | ($20.52) |
| 40 | Stuart Fairchild | 2021 | 25 | 0.241 | 0.7 | 36.70% | 1.79 | 15.50% | 11.90% | 9.20% | 5.20% | N/A | ($24.43) |
| 41 | Ryan Ritter | 2025 | 24 | 0.111 | -0.54 | 38.30% | 2.09 | 15.50% | 11.80% | 9.10% | 5.00% | N/A | ($40.25) |
| 42 | Dalton Rushing | 2025 | 24 | 0.094 | -0.71 | 46.70% | 3.14 | 14.50% | 11.00% | 8.50% | 4.60% | N/A | ($8.16) |
| 43 | Blake Sabol | 2023 | 25 | 0.214 | 0.46 | 45.00% | 2.87 | 14.20% | 10.80% | 8.30% | 4.70% | N/A | ($12.33) |
| 44 | Niko Kavadas | 2024 | 25 | 0.185 | 0.26 | 40.00% | 2.28 | 13.30% | 10.00% | 7.70% | 4.30% | N/A | ($37.03) |
| 45 | Owen Miller | 2021 | 24 | 0.073 | -1.03 | 41.70% | 2.41 | 13.00% | 9.70% | 7.40% | 4.00% | N/A | ($19.38) |
| 46 | Blake Dunn | 2024 | 25 | 0.16 | 0 | 38.30% | 2.07 | 12.00% | 9.00% | 6.90% | 3.80% | N/A | ($34.45) |
| 47 | Johnathan Rodríguez | 2024 | 24 | 0.04 | -1.26 | 38.30% | 2.07 | 11.90% | 8.80% | 6.70% | 3.60% | N/A | ($33.56) |
| 48 | Jacob Melton | 2025 | 24 | 0.037 | -1.32 | 40.00% | 2.3 | 11.70% | 8.60% | 6.60% | 3.50% | N/A | ($33.64) |
| 49 | Connor Wong | 2021 | 25 | 0.154 | -0.2 | 35.00% | 1.58 | 11.20% | 8.30% | 6.30% | 3.50% | $5+ | $6.45 |
| 50 | Dillon Dingler | 2024 | 25 | 0.138 | -0.23 | 36.70% | 1.85 | 11.10% | 8.20% | 6.30% | 3.40% | $20+ | $21.14 |
| 51 | Peyton Burdick | 2022 | 25 | 0.135 | -0.24 | 38.30% | 2.04 | 11.00% | 8.20% | 6.20% | 3.40% | N/A | ($30.44) |
| 52 | DJ Peters 피터스 | 2021 | 25 | 0.137 | -0.37 | 43.30% | 2.62 | 10.50% | 7.70% | 5.90% | 3.20% | N/A | ($23.77) |
| 53 | Jacob Amaya | 2023 | 24 | 0.018 | -1.58 | 35.00% | 1.6 | 10.60% | 7.70% | 5.90% | 3.10% | N/A | ($39.65) |
| 54 | Tim Elko | 2025 | 26 | 0.236 | 0.79 | 35.00% | 1.67 | 10.20% | 7.60% | 5.80% | 3.20% | N/A | ($40.45) |
| 55 | Joey Loperfido | 2024 | 25 | 0.111 | -0.51 | 36.70% | 1.85 | 10.00% | 7.30% | 5.60% | 3.00% | N/A | ($26.24) |
| 56 | René Pinto | 2022 | 25 | 0.103 | -0.58 | 46.70% | 3.09 | 9.70% | 7.10% | 5.40% | 2.90% | N/A | ($23.45) |
| 57 | Bryce Teodosio | 2024 | 25 | 0.074 | -0.9 | 36.70% | 1.85 | 8.60% | 6.20% | 4.70% | 2.50% | N/A | ($32.45) |
| 58 | Denzel Clarke | 2025 | 25 | 0.069 | -0.98 | 53.30% | 3.99 | 8.40% | 6.00% | 4.50% | 2.40% | N/A | ($29.11) |
| 59 | Zack Short | 2021 | 26 | 0.178 | 0.05 | 40.00% | 2.2 | 7.70% | 5.50% | 4.20% | 2.30% | N/A | ($28.88) |
| 60 | Braxton Fulford | 2025 | 26 | 0.123 | -0.41 | 36.70% | 1.88 | 6.50% | 4.50% | 3.40% | 1.90% | N/A | ($27.88) |
| 61 | Trey Cabbage | 2023 | 26 | 0.123 | -0.49 | 43.30% | 2.65 | 6.30% | 4.40% | 3.30% | 1.80% | N/A | ($40.71) |
| 62 | Jermaine Palacios | 2022 | 25 | 0 | -1.7 | 35.00% | 1.62 | 6.30% | 4.40% | 3.30% | 1.80% | N/A | ($40.15) |
| 63 | Oliver Dunn | 2024 | 26 | 0.105 | -0.57 | 36.70% | 1.85 | 6.10% | 4.20% | 3.20% | 1.80% | N/A | ($35.45) |
| 64 | Blaine Crim 블레인 | 2025 | 28 | 0.327 | 1.75 | 35.00% | 1.67 | 5.70% | 4.10% | 3.10% | 1.80% | N/A | ($36.89) |
| 65 | Luken Baker | 2023 | 26 | 0.07 | -1.03 | 36.70% | 1.81 | 5.10% | 3.50% | 2.60% | 1.40% | N/A | ($38.25) |
| 66 | Will Wilson | 2025 | 26 | 0.058 | -1.1 | 40.00% | 2.3 | 4.90% | 3.40% | 2.60% | 1.40% | N/A | ($33.68) |
| 67 | Nick Sogard | 2024 | 26 | 0.019 | -1.48 | 36.70% | 1.85 | 4.20% | 2.90% | 2.20% | 1.20% | N/A | ($20.73) |
| 68 | José Godoy | 2021 | 26 | 0.018 | -1.6 | 35.00% | 1.58 | 4.10% | 2.70% | 2.10% | 1.10% | N/A | ($26.70) |
| 69 | Cody Thomas | 2022 | 27 | 0.091 | -0.71 | 35.00% | 1.62 | 3.50% | 2.40% | 1.80% | 1.00% | N/A | ($34.86) |
| 70 | Tristan Gray | 2023 | 27 | 0.088 | -0.85 | 38.30% | 2.02 | 3.30% | 2.20% | 1.70% | 0.90% | N/A | ($37.45) |
| 71 | Will Robertson | 2025 | 27 | 0.018 | -1.52 | 36.70% | 1.88 | 2.50% | 1.60% | 1.20% | 0.70% | N/A | ($37.66) |
| 72 | Mason McCoy | 2023 | 28 | 0.038 | -1.36 | 35.00% | 1.6 | 1.60% | 1.00% | 0.80% | 0.40% | N/A | ($48.12) |
| 73 | Jack López | 2021 | 28 | 0.037 | -1.4 | 40.00% | 2.2 | 1.60% | 1.00% | 0.80% | 0.40% | N/A | ($35.73) |
| 74 | Jake Hager | 2021 | 28 | 0.02 | -1.57 | 43.30% | 2.62 | 1.50% | 0.90% | 0.70% | 0.40% | N/A | ($40.27) |
Note that in a group of 76 players, roughly the top 15 or 16 would constitute the top 20% as it’s measured in the analyses above. There are a couple of pretty interesting things about this list, but the main takeaway is that I’d probably sell on most of the top 15. I think Jackson Holliday will eventually cross one of these thresholds – he’s already gotten close and is at an age where a lot of top prospects are still in AA or AAA. I was also encouraged by Jordan Lawlar’s production last season. If he can stay healthy for a full year, I bet he ends up fantasy relevant at some point too. If you take those two and think one of the other guys will break through or find some adjustment later in their 20s to eventually register a viable season, this list would start looking a lot better. We do have three clear hits at the $10 level – a 37.5% capture rate – and I’d probably buy Nick Kurtz and Oneil Cruz to eventually crest $20 as well. I think it’s also fair to claim partial credit on Shea Langeliers, who, while not strictly in the top 15, is a whisker away and is within the same general probability tier as Kurtz. It’s also worth noting that all of the hits but Dillon Dingler are in the top half of these rankings. If you cut the board in half and threw a dart, you’d have a ~25% chance at hitting on a player on at least some viability level.
Final Thoughts
I think it’s too early to say whether the model performed definitively worse on this sample, but it’s something that is definitely worth looking into. As I think more about it, I am realizing that I still may not have avoided truncation bias despite building in a six-year buffer. This is because I only checked for $1 viability, not other levels. It’s plausible that a player might spend most of their 20s in the $1-$5 range and spike a $7 or $12 season at age 29 or 30 before falling off again. This would lead to underestimates of higher viability levels, which we did see in the back-test sample. I also think that Covid might have done something weird with the player pool. I postulated about this in my initial k-rate study:
The 2020 season saw by far the highest number of debutant hitters as a percentage of games played. In addition to this, there could be a selection bias in the group of players who were debuting. Teams may have been selective about which players they promoted, and some players simply skipped the season outright. If the type of prospect who did not play in 2020 was on average more talented than one who did, this will dilute the talent pool more than a typical season of debutants would. In 2021, the number of debutants was the second-lowest in the sample (excluding 2020), which could point to teams continuing to be circumspect with their prospects. Then, in 2022, we saw the highest raw number of debutants in the sample. These players could likewise have had their development negatively impacted by the pandemic. This could create a sort of expansionary effect if we assume the debuting players are generally worse than established players, or, at least worse than they otherwise would have been.
If power goofs are being brought up to fill rosters and are facing weaker pitching competition, it follows that their debut might run hot before being figured out by the league. Their probability in a model that isn’t trained on the Covid data would likewise run high. This is something I definitely want to examine in future research – perhaps withholding debutants from 2020 to 2022 will improve the models.
I’m still encouraged by the results here, though. While not entirely surprising, it’s clear that debut age and ISO can help us get a long way toward predicting which players who struggle initially will eventually figure it out enough to help our fantasy teams. And, as with much of the research I’ve done for RotoGraphs, opening this one door could lead to many more: I’m already percolating on how to improve this model, how to build one that could help us parse which players will jump between viability tiers (and when they might do it), and also coming to terms with the fact that I think I need to do an extended look into the impact of Covid on fantasy viability generally. Stay tuned for more in the coming weeks and months.
Jonathan is a contributor for RotoGraphs. He is a Tigers fan living in Philadelphia with his wife and dog and requests that you leave your best pizza topping combinations in the comments.