by bpleone

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.

settled picks (ledger)public, append-only — no revisions model calibration (ECE)raw model → calibrated curation ROI swingdropping proven-negative families closing line valuebeat-the-close rate, published either way

The pipeline — five stages, run autonomously
01 · INGEST

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.

02 · MODEL

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.

03 · CALIBRATE

Distrust the model

The raw model is overconfident. A per-family isotonic transform — learned from settled outcomes — bends each probability toward what actually happened.

04 · CURATE

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.

05 · GRADE

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.

The models — no black boxes
EngineUsed forHow it works
Bayesian + PoissonMLB game linesTeam strength as a Bayesian posterior; runs as a Poisson process → fair moneyline & total.
3-way PoissonSoccer / World CupFIFA-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-2All team sportsMargin-of-victory Elo and Glicko-2 (rating + RD + volatility) ratings, seeded then learned.
Monte Carlo simMLB / propsPA-level simulation — Knuth-Poisson draws over a base-out state machine (K/BB/1B/2B/3B/HR/OUT).
Gradient-boosted treesPlayer propsRegression trees built from scratch — predict per-player TB / HR / K / H distributions.
MLP + ensembleMeta-modelA 12→16→8→1 net (hand-coded backprop, Xavier init) stacked with the base models by a logistic meta-learner.
The honesty layer — what makes this a desk, not a tout
Calibration · isotonic recalibration

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.

ECE  raw 10.9%  →  calibrated 2.7%   ·   Brier

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.

Curation · proven-negative families

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.

Raw firehose, all families     →   honest book, losers dropped   (in-sample)

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.

Book-shading · defer to the sharp close

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.

Closing line value · the sharp's metric

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.

Self-learning · the loop

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.

Where this is honest

What the numbers do — and don't — mean

Want to pull the thread? Model cards (per sport) →   Calibration map →   Strategy simulator →   Closing line value →   Track record →