Methodology
The market is a number. We trade the gap between the book's number and ours. That only works if our number is honest — so this page shows the work: how every game and prop is modeled, why the raw model is deliberately distrusted, and how we measure ourselves against the close. No black boxes. Every model below is hand-coded; every metric is computed from a public, append-only ledger.
Real data, free first
Schedules, box scores, lineups, weather, umpires, and live DraftKings odds — pulled from MLB Stats API, ESPN, Baseball Savant, Open-Meteo. Game lines need no paid key.
Hand-coded probability
Sport-specific models turn features into a fair win/total/prop probability. Bayesian + Poisson, Monte Carlo, gradient-boosted trees, a small MLP — all from scratch.
Distrust the model
The raw model is overconfident. A per-family isotonic transform — learned from settled outcomes — bends each probability toward what actually happened.
Drop what loses
Market families that lost money over a real sample are hard-excluded from every board. This — not the model — is where the ROI lives.
Settle & learn
Every pick lands in the ledger, settles against the box score, and feeds calibration + CLV. The loop trains on raw predictions, never its own calibrated output.
| Engine | Used for | How it works |
|---|---|---|
| Bayesian + Poisson | MLB game lines | Team strength as a Bayesian posterior; runs as a Poisson process → fair moneyline & total. |
| 3-way Poisson | Soccer / World Cup | FIFA-tier elo blended with in-tournament record; per-side expected goals on an exp scale → independent-Poisson grid → 1X2 / O2.5 / BTTS. Soccer needs the draw (~25% of group games). |
| Elo + Glicko-2 | All team sports | Margin-of-victory Elo and Glicko-2 (rating + RD + volatility) ratings, seeded then learned. |
| Monte Carlo sim | MLB / props | PA-level simulation — Knuth-Poisson draws over a base-out state machine (K/BB/1B/2B/3B/HR/OUT). |
| Gradient-boosted trees | Player props | Regression trees built from scratch — predict per-player TB / HR / K / H distributions. |
| MLP + ensemble | Meta-model | A 12→16→8→1 net (hand-coded backprop, Xavier init) stacked with the base models by a logistic meta-learner. |
A displayed 70% really hits ≈ 70%
Left alone, the raw model is overconfident — it says 80% when the real rate is closer to 68%. We learn a per-family monotonic isotonic transform (predicted probability → realized rate) from the settled ledger: prediction-bucketed, Bayesian-shrunk, pooled by adjacent-violators, with family-average and identity fallbacks for thin samples.
It generalizes: in a one-off 70/30 held-out validation (fit on 70% of the ledger, tested on the unseen 30%, run 2026-06), ECE still collapsed 12.6% → 5.4%. A regression test fails the build if the transform ever stops improving ECE, stops being monotonic, or stops being identity-safe.
The model finds edges; curation throws out the bad ones
A market family is proven-negative once it has lost money over a real sample (n ≥ 25, net ≤ −5u). Those families are hard-excluded from every board we surface. This is the single highest-impact lever in the whole system — and it's not modeling, it's discipline.
We publish both numbers — the raw firehose and the curated book — on the Strategy Simulator, where you can replay the entire ledger yourself with any filter and reproduce the track record exactly.
Model overconfidence can't print a fake edge
On game lines, the closing market is sharp. Rather than trust a model probability that diverges wildly from a sharp close, we shrink toward the de-vigged book line — weight w = min(0.80, |gap| × 3). A 53%-vs-67% disagreement gets pulled most of the way to the book; the raw model number is kept alongside, for divergence tracking and learning, but the displayed pick is shaded.
Same mechanism across MLB moneylines and the World Cup match model. Display-only — it never contaminates the raw signal the learning loop trains on.
Did the market move to our side?
Winning a bet can be luck. Beating the close is the metric that survives variance: for every game we lean, did the line move toward our side by the time it closed? We snapshot the de-vigged line open→close from free odds and measure the move. It's the cleanest proof of edge independent of any single result.
And we publish it even when it's below 50%. Right now the MLB game-line model doesn't consistently beat the close — so the CLV page says exactly that. A desk that only shows you its wins isn't a desk.
It gets sharper, without learning from itself
Every few hours: settle fresh results → recompute per-family shrinkage weights → run an integrity audit (Wilson confidence intervals, Brier, ECE, guard checks) → refresh the isotonic map. Crucially, the loop trains on each pick's raw p_predicted, never the calibrated output — so it can't chase its own tail. Guards block any "learning" that a small or noisy sample would otherwise over-fit.
What the numbers do — and don't — mean
- Calibration makes the model true, not profitable. Pricing at your own fair odds is 0-EV by construction. Calibration's job is to make a displayed 70% actually mean 70% — so that real book edges are real, not artifacts of overconfidence.
- ROI comes from curation, not the model. The curated book is just the raw firehose with the proven losers removed. We show the losing firehose right next to it so the lift is auditable. Held out (cut-set frozen on early data, scored on the unseen window) it stays positive but is concentrated in a couple of families — so we publish the per-family decomposition and the robust, small-sample-flagged-excluded figure, not just the headline.
- CLV is published in both directions. Below-50% beat-the-close rates stay on the site. The metric only means something if you can't hide from it.
- Variance is real and the sample is finite. Every probability is a long-run statement. Short runs deviate. Bet accordingly — and only what you can afford to lose. 21+. 1-800-GAMBLER.
Want to pull the thread? Model cards (per sport) → Calibration map → Strategy simulator → Closing line value → Track record →