The transaction model
For every player on a 40-man roster, the probability that within the next 90 days he is designated for assignment, optioned, traded, released or non-tendered, or nothing happens. It is a gradient-boosted classifier trained on 184,676 player-snapshot rows from 2011-2026: every dated 40-man roster (Opening Day, June 1, July 1, the day after the deadline, September 1, season's end, the reserve-list filing, tender day, the Rule 5 draft) and what the transaction log says happened next.
It sees only what was knowable on the snapshot date: roster status, option years used and option days, times optioned this season, service time where published, age and years since debut, how and when the player joined the club (including a trade or claim in the last 60 days), his prior DFAs, outrights, claims and trades and how recent they were, IL days this season, the club's 40-man and 60-day IL counts and depth at his position, the club's record, the time of year, FanGraphs WAR for the last two seasons and his rank at his position on the club, last season's stat line, and this season's line once September arrives. It does not see contracts, projected arbitration salaries, or anything a front office knows about health or intent.
Held-out accuracy, season by season
Each season is predicted by a model trained on all the others. Log loss is lower-is-better; the base rate is a model that knows only the time of year. AUC is one-versus-rest: 0.5 is a coin flip, 1.0 is perfect ordering.
| Season | Rows | Log loss | Base rate | AUC Stays | AUC Designated | AUC Optioned | AUC Traded | AUC Released |
|---|---|---|---|---|---|---|---|---|
| 2013 | 12,207 | 0.4741 | 0.6694 | 0.852 | 0.888 | 0.943 | 0.771 | 0.878 |
| 2014 | 12,241 | 0.5312 | 0.7124 | 0.812 | 0.889 | 0.948 | 0.704 | 0.898 |
| 2015 | 12,232 | 0.5228 | 0.7059 | 0.831 | 0.891 | 0.945 | 0.731 | 0.868 |
| 2016 | 12,302 | 0.4904 | 0.6889 | 0.851 | 0.896 | 0.945 | 0.721 | 0.879 |
| 2017 | 12,234 | 0.485 | 0.703 | 0.856 | 0.898 | 0.948 | 0.744 | 0.873 |
| 2018 | 12,272 | 0.5045 | 0.7207 | 0.85 | 0.906 | 0.947 | 0.743 | 0.894 |
| 2019 | 12,318 | 0.4996 | 0.7089 | 0.857 | 0.878 | 0.945 | 0.716 | 0.882 |
| 2020 | 10,775 | 0.5483 | 0.7099 | 0.821 | 0.88 | 0.923 | 0.605 | 0.923 |
| 2021 | 11,386 | 0.5179 | 0.7219 | 0.863 | 0.877 | 0.926 | 0.784 | 0.878 |
| 2022 | 12,532 | 0.5404 | 0.7814 | 0.858 | 0.889 | 0.935 | 0.754 | 0.923 |
| 2023 | 12,427 | 0.5442 | 0.7555 | 0.842 | 0.887 | 0.932 | 0.73 | 0.905 |
| 2024 | 12,457 | 0.5207 | 0.756 | 0.855 | 0.893 | 0.929 | 0.778 | 0.934 |
| 2025 | 12,527 | 0.5923 | 0.814 | 0.838 | 0.895 | 0.916 | 0.779 | 0.898 |
| 2026 | 2,578 | 0.6372 | 0.9043 | 0.821 | 0.866 | 0.874 | 0.846 | 0.876 |
| Pooled | 160,488 | 0.5227 | 0.7301 | 0.845 | 0.889 | 0.936 | 0.735 | 0.896 |
Calibration
Held-out predictions sorted into ten bins per outcome: what the model said against what happened.
| Designated | Predicted | Actual | n |
|---|---|---|---|
| bin 1 | <1% | <1% | 16,049 |
| bin 2 | <1% | <1% | 16,049 |
| bin 3 | <1% | <1% | 16,049 |
| bin 4 | 1% | <1% | 16,048 |
| bin 5 | 1% | 1% | 16,049 |
| bin 6 | 2% | 2% | 16,049 |
| bin 7 | 4% | 4% | 16,048 |
| bin 8 | 7% | 8% | 16,049 |
| bin 9 | 14% | 16% | 16,049 |
| bin 10 | 37% | 35% | 16,049 |
| Optioned | Predicted | Actual | n |
|---|---|---|---|
| bin 1 | <1% | <1% | 16,049 |
| bin 2 | <1% | <1% | 16,049 |
| bin 3 | <1% | <1% | 16,049 |
| bin 4 | <1% | <1% | 16,048 |
| bin 5 | <1% | <1% | 16,049 |
| bin 6 | 1% | 1% | 16,049 |
| bin 7 | 4% | 5% | 16,048 |
| bin 8 | 14% | 16% | 16,049 |
| bin 9 | 34% | 37% | 16,049 |
| bin 10 | 64% | 63% | 16,049 |
| Traded | Predicted | Actual | n |
|---|---|---|---|
| bin 1 | <1% | <1% | 16,049 |
| bin 2 | <1% | 1% | 16,049 |
| bin 3 | 1% | 1% | 16,049 |
| bin 4 | 1% | 2% | 16,048 |
| bin 5 | 1% | 2% | 16,049 |
| bin 6 | 2% | 3% | 16,049 |
| bin 7 | 2% | 3% | 16,048 |
| bin 8 | 3% | 4% | 16,049 |
| bin 9 | 5% | 5% | 16,049 |
| bin 10 | 12% | 10% | 16,049 |
| Released / non-tendered | Predicted | Actual | n |
|---|---|---|---|
| bin 1 | <1% | <1% | 16,049 |
| bin 2 | <1% | <1% | 16,049 |
| bin 3 | <1% | <1% | 16,049 |
| bin 4 | <1% | <1% | 16,048 |
| bin 5 | <1% | <1% | 16,049 |
| bin 6 | <1% | <1% | 16,049 |
| bin 7 | <1% | 1% | 16,048 |
| bin 8 | 1% | 1% | 16,049 |
| bin 9 | 1% | 2% | 16,049 |
| bin 10 | 7% | 8% | 16,049 |
The roster-aware tender model
A second model for the offseason question only: at the September 1 and season-end snapshots, for players two-plus years past their debut, will he still be on the 40-man after the tender deadline? It rebuilds each club's returning depth at his role (starters, relievers, catchers, infielders, outfielders, split by games-started share; departing free agents removed), ranks it by a Marcel-style projection from FanGraphs WAR history, and records his rank, the projection at the last job slot for the role (SP 8, RP 9, C 3, IF 8, OF 7), and his margin over it.
| Features | Log loss | AUC | Rows |
|---|---|---|---|
| His own mechanics and record only | 0.2392 | 0.904 | 20,962 |
| Plus rank among the club's returners | 0.2268 | 0.9163 | 20,962 |
Starters kept through the offseason by rank among returning starters, 2013-2025: rank 0 to 5: 97% (n 3218); rank 5 to 8: 92% (n 1216); rank 8 to 10: 84% (n 268); rank 10 to 13: 89% (n 71). Base rate kept 87%.
What was tried
Feature groups added one at a time to the previous model, each scored leave-one-season-out. “Tender window” is the reserve-list filing and tender-day snapshots only. Lower log loss and higher AUC are better. All groups were adopted.
| Configuration | Log loss | Log loss, tender window | AUC designated | AUC released, tender |
|---|---|---|---|---|
| Roster mechanics, history, this season's line, depth (previous model) | 0.534 | 0.4041 | 0.8821 | 0.9062 |
| + FanGraphs WAR history (two seasons, this season, wRC+, FIP, change) | 0.5298 | 0.3993 | 0.8876 | 0.9124 |
| + starter / reliever share | 0.5336 | 0.4037 | 0.8822 | 0.9064 |
| + WAR rank within the club's position group | 0.5331 | 0.404 | 0.883 | 0.9085 |
| + IL days this season, 60-day IL | 0.5333 | 0.4039 | 0.8822 | 0.9054 |
| + moves in the last year, Rule 5 pick, days since last move | 0.5319 | 0.4052 | 0.8822 | 0.9048 |
| + club record and run differential | 0.5297 | 0.4036 | 0.8829 | 0.9051 |
| All groups together (current model) | 0.5227 | 0.3996 | 0.8893 | 0.9144 |
What it leans on
Total split gain by feature, top 20.
| phase | 169,579 |
| yrs_since_debut | 154,203 |
| war_cur | 120,639 |
| war_prev | 65,374 |
| age | 58,328 |
| days_since_txn | 42,481 |
| days_with_club | 39,882 |
| days_to_end | 33,232 |
| war_prev2 | 31,268 |
| mls_start | 31,202 |
| day_of_year | 31,194 |
| opts_this_season | 31,154 |
| opt_days_this_season | 29,691 |
| prior_dfa | 26,171 |
| war_gap_group | 25,565 |
| status_code | 21,758 |
| team_pct | 20,619 |
| team_rd | 20,439 |
| c_pa | 18,675 |
| war_delta | 15,359 |
Base rates and limits
Over any 90-day window since 2011: stays put 77%, optioned 12%, designated 7%, traded 3%, released / non-tendered 1%. Trades are the hardest outcome to anticipate from roster mechanics alone. Historical service time is only available from 2020, so earlier seasons lean on years since debut. Retrained nightly as of 2026-09-14.