MLB Model Detail
Model version v2.0 — last updated 2026-08-20.
What the Model Predicts
Seven markets, priced independently. Each has its own trained ensemble, its own calibration curve, and its own edge threshold. A game can produce a pick in some markets and none at all in others.
- Full-game moneyline — which side wins outright
- Full-game spread — which side covers a 1.5-run line
- Full-game totals — over or under the posted total
- First-5-innings moneyline — which side leads through five
- First-5-innings spread — which side covers F5 −0.5
- First-5-innings totals — over or under the F5 total
- NRFI — no run scored in the first inning
The Core Inputs
The model reads no odds. It never sees the market it is being asked to beat. The features it does see fall into six blocks:
Team form
Rolling offensive and defensive rates from game-by-game logs — runs per 9 innings, xwOBA, ISO, K rate, BB rate, wRC+. All windows are strictly backward-looking: the value on a given game date uses only games completed before that date. An automated test rebuilds the entire feature matrix on a truncated history and asserts no earlier value changes.
Starting pitchers
Season-line stats from FanGraphs (ERA, FIP, xFIP, SIERA, K-BB%, xERA), rolling recent form, opponent-batting-hand splits, and Statcast underlying rates (rolling xwOBA-against, barrel% allowed, hardhit% allowed, whiff%, chase% over the trailing 30 days, minimum 200 pitches). SP-vs-opposing-lineup edge is computed as the delta between the starter's rate stat and the opponent lineup's rate stat over the same window.
Bullpen depth
Weighted-by-IP bullpen aggregates (bp_era, bp_fip, bp_whip, bp_k_bb_pct, bp_quality_score), plus a workload feature — bp_ip_last_3d — that flags fatigued pens. This block was late-added after auditing a stretch where the model kept picking teams with fresh-looking bullpen numbers that were actually gassed from the previous weekend.
Park and environment
Park run factor, park HR factor, and a weather block: temperature, humidity, dew point, wind speed, and a park-orientation-aware wind-toward-CF component. Weather was added to the OU candidate pool after a single-feature ablation showed +4pp ROI vs the pre-weather baseline; ablations on ML and spread showed the same features cost roughly 2pp on those markets, so they are excluded there.
Umpire
Home-plate umpire zone tendencies (called strike rate, edge call rate) joined by ump ID. Ump features flow to totals and F5-totals markets only.
F5 and NRFI signal blocks
The F5 markets get an SP-quality edge feature that emphasizes starter matchup over overall team strength — since the first five innings are almost always the two starting pitchers' innings. NRFI gets a leadoff-quality feature and a 1st-inning scoring-rate rolling average for each team.
Method
Each market's ensemble is five sklearn models — logistic regression, LDA, XGBoost, MLP, and random forest — averaged unweighted. That average is passed through a calibration curve fit on out-of-fold predictions from a 5-fold CV on the training window. The calibrator is isotonic by default.
The calibrated probability is compared to the market's implied probability (vig-stripped from the average of a sharp-book basket — Pinnacle, Lowvig, BetOnlineag for full-game markets; Pinnacle + FanDuel for F5, since Lowvig and BetOnlineag don't publish F5). The gap is the edge. Kelly sizing runs on that edge at a quarter-Kelly fraction, capped at 10% of bankroll.
Every calibration and every feature is retrained on a moving window that never includes future data relative to the game being predicted. When a market's calibration drifts, a walk-forward parameter sweep re-runs the whole pipeline and the winning configuration replaces the incumbent.
What Changed This Season
The model shipped in March at v1.0 with three markets (moneyline, spread, totals). What's on the site now is v2.0, arrived at through eleven documented calibration events. The material ones:
- April 4 — Moneyline dropped after four weeks. No detectable edge on the initial feature set.
- May 9 — Spread dropped. Same reason; the model was chasing variance.
- June 18 — Both markets reinstated after a 2026-aware recalibration found +33.8% ML / +26.8% spread walk-forward ROI on a clean training window.
- June 24 (v1.1) — Removed the market itself as a feature. Prior versions had allowed ml_odds, spread_odds, and total_odds into the candidate pool; a leakage audit found the spread model's calibration gap collapsed from 17pp to 2.6pp once these were pulled. Every market retrained.
- June 25 (v1.2 → v1.3) — Feature-count tuning after ablation showed ML gained 10.6pp ROI on ~20 features vs 13; OU gained 4.5pp on ~25 vs 30. Weather features added to OU after standalone ablation showed +4pp ROI.
- July 16 (v1.4) — F5 and NRFI markets went live end-to-end.
- July 21 (v1.6) — Patched a subtle season-snapshot leak: pitcher and reliever features had been pulling season-final stats on the training set. All rate features now do as-of-date lookups.
- August 15 (v2.0) — Statcast Phase D. Rolling xwOBA-against, barrel% allowed, hardhit% allowed, whiff%, and chase% per starter (30d, min 200 pitches) plus team-batting xwOBA. Nine Statcast features selected across six of the seven markets after retrain.
The version history is public — every change lands as a git commit before that day's picks are stamped.
What We Do Not Model
- Lineup construction the day of. Managers post lineups an hour or two before first pitch. The model doesn't react — it uses team-level batting aggregates. On days when a team rests three regulars, the model doesn't know.
- In-game injury news that breaks after our stamp. We stamp picks hours before first pitch precisely because that is what “pre-game” means. If the starter gets scratched at 6:15 PM ET for a 6:35 game, our stamp still stands as-was — we don't chase it.
- Umpire crew chief effects on non-plate umps. Only home-plate ump is joined.
- Bullpen usage patterns. We know how much a pen has thrown; we don't model who a manager is likely to use.
Never Used As Inputs
Betting odds of any kind. This has been audited four times — after every retrain — and there is an automated check that readsfeatures_used.json,market_features.json,feature_grades.json, and medians.pkl and fails CI if any market-derived field is present.
Validation
Strictly walk-forward. Every prediction on the site was made using only data that existed before the game was played. There is no in-sample back-slapping in the numbers we publish.
Every pick is committed to a public Git repo, cryptographically timestamped via OpenTimestamps + Rekor, and mirrored to a public proofs endpoint before first pitch. Any pick published on the site can be independently verified against the Bitcoin blockchain — the timing is not something you have to take our word for.