We Backtested Our Own Model. Here’s Everything We Found.
Most pick services show you wins and hide losses. We’re doing the opposite. Here’s exactly how our MLB model has performed across 872 games — the good, the bad, and what we’re fixing next.
- Our model makes money when it bets against the market — our contrarian picks returned +13.6%, while overall we’re about break-even.
- It’s not all working. Two of our three bet types are still below break-even, and we found two specific bugs in how the model scores games.
- We know exactly what’s wrong and how to fix it. This post walks through all of it, in plain English — including the parts that aren’t proven yet.
How the model works (in 30 seconds)
For every game, we grade each starting pitcher, each hitter in the lineup, and each bullpen. Then we simulate the game thousands of times — like playing it out on a computer over and over — and count how often each team wins, and how many runs score. Those simulations become our win probabilities and our picks.
A backtest means we go back and check those predictions against what actually happened. Here’s what 872 real games told us.
Where the model makes money
Picking winners is the wrong way to judge a betting model. What matters is return — whether the picks made money at the actual prices you’d have gotten, after the sportsbook’s cut. So we settled every moneyline pick as a real flat bet at the best available price across the major books. Here’s what we found, and it surprised us.
Overall, betting every pick came out roughly break-even — about +0.4% return, which is statistically a wash. But the interesting part is what happens when you split the picks by whether we agreed with the betting market or disagreed with it:
|
+13.6%
Return when we fade the market (177 bets)
|
−4.8%
Return when we side with the favorite (491 bets)
|
That gap is the whole story. When our model lands on the same side as the market, we’re betting favorites at short prices where being right just isn’t worth enough — and we lose money. But when our model disagrees with the market and takes the other side, we’re getting longer prices on underdogs, and those picks returned +13.6%. In plain terms: our edge is contrarian. The model earns its keep specifically when it’s willing to go against the crowd.
The full scoreboard — all three bet types
We bet (and grade ourselves on) three markets. We’re showing you all three — including the parts that aren’t working.
| Bet type | Pick accuracy | Status |
|---|---|---|
| MoneylinePicking the winner | 55.3% | ~Break-even (edge is contrarian) |
| TotalsOver / under on runs | 51.7% | Below break-even |
| Run lineMargin of victory | 47.5% | Losing |
A quick note on reading this: accuracy alone doesn’t tell you if a bet type makes money — the price matters just as much. Our moneyline is our best market (and as shown above, genuinely profitable on its contrarian picks), but overall it’s hovering near break-even, not running away with it. Totals and run line are both losing right now. We’d rather show you that than hide it, because the next section explains exactly why — and it’s fixable.
What we found under the hood: two bugs
When we dug into why the run-based bets (totals and run line) lag behind, we found two specific problems in the simulation. Neither is in how we grade players — our grades are solid. Both are in how the simulation turns those grades into a final score.
Bug #1 — Our simulated games leave too many runners stranded
Here’s a strange thing the backtest revealed: our simulation produces more baserunners than a real game (about 19 hits per game vs a real 15), but fewer total runs (8.05 vs a real 8.80).
How can both be true? Because in our simulation, runners get on base but don’t come around to score often enough. In real baseball, about 57% of the time a hit eventually leads toward a run. In our sim, it’s only 41%. We’re basically loading the bases and then leaving everyone there.
| How efficiently hits become runs | Our sim | Real baseball |
| Runs per hit | 0.41 | 0.57 |
This one bug explains the contradiction and why our run-line bets struggle — if the simulated scores are distorted, anything based on the final margin suffers.
Bug #2 — The lineup is lopsided
In a real game, every spot in the batting order produces roughly similar offense — the leadoff hitter gets a few more at-bats than the 9th hitter, but not dramatically more. Our simulation got this badly wrong: it gave the top of the order way too much, and the bottom almost nothing. Our projected 9th-place hitter was getting credited with almost no production at all, which anyone who watches baseball can see is unrealistic.
This mostly affects our individual player projections (the per-player stat lines you see on game pages), and we’re fixing it so those numbers actually look like real baseball.
One more honest number
Our winner picks are good, but our confidence levels aren’t perfectly calibrated yet. In plain terms: when we say a team has a 57% chance, sometimes it’s really closer to a coin flip. Our high-confidence picks (65%+) hold up well, but the middle tier needs tightening. We’re working on making our stated confidence match reality more precisely.
What we’re doing about all of it
Here’s our plan, in order:
- Fix the stranded-runners bug first. This is the big one — it should improve our run totals and run-line bets at the same time. Our target is simple: get our simulated scoring efficiency to match real baseball.
- Fix the lopsided lineup. So every player projection looks like a believable stat line.
- Re-run this exact backtest to confirm the fixes worked. We’re not going to claim improvement — we’re going to measure it against the same 872 games and show you.
- Tighten our confidence levels so a 57% pick really means 57%.
And importantly — we left our player grading alone. The backtest proved it’s already doing its job: our A-grade pitchers really do allow fewer runs than our F-grade pitchers, cleanly, every time. The talent evaluation works. The fixes are all in the simulation math that sits on top of it.
We built this model to find real edges, and being honest about where it falls short is the only way it gets better. We’ll post the follow-up once the fixes are in — with the same full numbers, win or lose.