We Backtested Our Own Model

Under the Hood

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.

DrCover MLB  •  Model Version A  •  Sample: Mar 25 – Jun 2, 2026
The short version
  • 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 honest caveat — and it’s a real one: that +13.6% comes from 177 bets. That’s encouraging early signal, not a finished result. A run that hot over a few hundred bets can still cool off, and the overall program isn’t provably profitable yet — the margin of error around break-even is wide. We’re also measuring against the prices we logged, not certified closing lines. So: promising, reported honestly, and something we’ll keep tracking in the open rather than declaring victory on.

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:

  1. 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.
  2. Fix the lopsided lineup. So every player projection looks like a believable stat line.
  3. 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.
  4. 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.

All figures reflect model performance over the stated sample and are not a guarantee of future results. Nothing here is a guarantee of profit. Bet responsibly, and only what you can afford to lose. If gambling stops being fun, call 1-800-GAMBLER.