u/bwista

+10.8% ROI in my MLB strikeout model's first live month, a teardown of why I don't trust it

Posting the full teardown because this is the one sub where the methodology is the point.

KIT is a hierarchical Bayesian model that predicts a full strikeout PMF for a starting pitcher. Negative binomial likelihood, because strikeout counts are overdispersed and a Poisson underfits the tail, pooled across pitchers and handedness. I place a bet when the model's implied P(under) or P(over) diverges far enough from the book's no-vig price to clear an EV threshold. Inputs are the usual pitcher form, velocity, whiff and spin trends, plus the opposing offense's rolling strikeout tendencies. That last input is rolling team rates rather than the posted lineup, which is why the model is comfortable pricing six or more hours before first pitch.

April was the first real-money month. 96-86 over 184 settled bets, +$966 on about $8,900, +10.86%. Here is why I think that number is mostly seasonal softness and noise.

The bets were 86% one-directional. 159 unders, 25 overs. Unders +$1,280 at +16.7%, overs -$315 at -25%. Effectively all the profit is on one side. A one-sided book is a directional bet on a market regime, not a demonstrated pricing edge, unless you can show conditional selection within that side. Most of what follows is me trying to show that and failing.

I ruled out a standing mispricing first. Over 113,053 closing main lines the no-vig under price is calibrated, implied 50.5% against a realized 51.3%, residual 0.8pp, every populated bucket within about 2pp of the diagonal. K-prop unders are not structurally underpriced, so the direction had to come from something conditional rather than a price you can flat-bet.

The one real effect is seasonal. Bucketing the historical under gap by month across those same closing lines, the under is genuinely underpriced in cold weather. A flat under returns about +3.6% in March, stays positive in April, then flips negative in May (worse than -7%) and stays dead June through September. April 2026 happened to be a softer-than-usual April, gap near 3.6pp. My live sample sat entirely inside that window, so calendar timing explains the direction of the bets with no model skill required. I did not find a door, I stood in front of one that props open every spring and shuts in May.

The selection signal dissolves under resampling. The most defensible skill claim was my alternate unders, 47 bets placed exactly one strikeout below the consensus main line, which returned +24.1% against a blind below-the-line rule that loses about 8% on the same population. That gap looks like the model picking the good ones out of a bad pool, which is the one thing a flat-bet backtest cannot see. Then I stress it. Fragility ladder: the top 5 of those 47 bets are about 105% of the profit, so the other 42 are collectively negative, and dropping the top 5 takes the subset to -1.4%. Bootstrap the per-bet P/L 10,000 times and the 95% interval is [-16%, +65%], with about 12% of resamples losing money. Hit rate was 48.9% against a 36.2% breakeven, which sounds like a lot until you see that interval. At n=47, or even n=159, you cannot separate a real conditional edge from five lucky tails.

CLV, the actual truth-teller, is thin, and I had to clean it before trusting it. Two corrections mattered. First, the EV figure my tracker logs is the market-derived no-vig EV at placement, not my model's edge, so it cannot be used as evidence of skill. Second, my exchange fills inflate mean CLV because of how exchange pricing moves relative to sportsbook closes, so they have to come out for a clean read. After that, CLV averages under 2pp and only 39% of bets beat the closing price. If I were actually beating the market you would expect that well above half. Early placement, median around eight hours out into morning lines that have not sharpened, is a real and repeatable mechanism, but the thin CLV says I am barely converting it into anything.

The profit pooled exactly where the limits fall. About three-quarters of it came from books that throttle winners, and the throttling already started. theScore halved my limits and took nothing after the 22nd, BetRivers limited me after a single $14 bet, and DraftKings, the open book I leaned on most, lost me money. An edge that only exists in the accounts that cut you off is not a sustainable edge.

So: real money, probably not a real edge. Seasonal regime plus a small early-line timing effect plus variance. I am taking it into June for the only honest test, more out-of-sample, while the books close the door.

A few open problems I would genuinely want this sub's read on.

  1. What's the right benchmark for measuring CLV? I track closing line value, but I'm not settled on which closing price to grade against. The options I'm weighing are the best closing price at the same book I bet at, the best closing price anywhere in the market, the fair no-vig market consensus, or a sharp reference like Pinnacle or an average of sharp books. Each one tells a slightly different story about whether I had an edge. Which do you treat as the real benchmark, especially for a bet placed hours before close at a soft book?
  2. Calibrating a model that refits faster than calibration data accumulates. I refit weekly, but a leak-free isotonic calibration layer needs months of out-of-sample results to be anything but noise, and every refit resets the pool. Backfilling 200 to 300 pairs just produces garbage curves. How do you maintain a live calibration layer when your model's lifetime is shorter than the timescale your calibration data needs? Pool across model versions and eat the stationarity assumption, switch to a parametric calibrator that survives small samples, or just stop refitting so often?
  3. Edges that only appear after the line moves against you. Plenty of my bets don't clear my EV threshold at open. The gap only opens up after the market moves against the model's side. Betting those feels like textbook adverse selection. I'm taking the side the market is walking away from, usually for a reason I don't have. Occasionally it's a real overreaction I'm fading correctly, and at this sample size I can't tell the two apart. Lately I skip any bet where the line has already moved against the model by more than a set percentage, which kills the obvious adverse-selection cases but almost certainly throws out some correct fades too. Is a flat movement threshold the right instrument, or is there a cleaner way to separate an overreaction worth fading from a move that is correctly pricing something the model missed?

Full writeup with charts: https://medium.com/@billyweingarten/blinded-by-the-win-526a024e6788

reddit.com
u/bwista — 12 days ago