How we build independent win probability models for prediction markets
Current live platform coverage: NBA, NCAAMB, NCAAWB, CFB, NFL, NHL, MLB. Research and course extensions are called out separately below.
Current Proof Snapshot
73.0% win rate across 1,000 validation trades in 3 sports
Methodology explains the model design. Validation shows the current exported backtest snapshot, and results show live production outcomes.
ZenHodl Weekly
One weekly email with live results, one model insight, and product updates.
A short weekly note for builders, traders, and researchers following the model.
Most sports analytics services derive "fair value" by devigging sportsbook lines — averaging Pinnacle, FanDuel, and DraftKings odds. This gives you a consensus probability that tracks the market by construction. It's useful for sports betting (finding +EV against soft books), but it cannot find prediction market mispricings — because the output already agrees with the market.
ZenHodl models are trained on game state only: score differential, seconds remaining, period, Elo ratings, and sport-specific features. No odds, no lines, no market prices are used as inputs. This makes our output genuinely independent from the market — when our fair probability diverges from the Polymarket ask price, that divergence is a real signal, not noise.
The tradeoff: our models can have a worse Brier score than market-derived models in absolute forecasting terms. But independence is what creates trading value when the output is validated against real market prices. See the validation page for the latest exported backtest snapshot and live results for current production performance.
| Market-Derived | ZenHodl (Independent) | |
|---|---|---|
| Inputs | Sportsbook odds/lines | Score, time, Elo only |
| Output | Tracks market by construction | Genuinely independent |
| Brier Score | Better | Worse |
| Trading Value | Zero (agrees with market) | Possible when independently validated |
We scrape ESPN's play-by-play API across the core sports we model. Each game produces hundreds of snapshots — one per score change or significant event.
Sports: NBA, NCAAMB, NCAAWB, CFB, NFL, NHL, MLB
Data is stored as Apache Parquet files. One row = one game state (score, period, clock, ESPN WP, outcome label).
Module 1 of our course teaches you to build this exact scraper.
Each game state is featurized with 13–16 variables. We deliberately keep the feature set small — overfitting to noise destroys trading value.
| Feature | Sports | Description |
|---|---|---|
| score_diff | All | home_score − away_score |
| seconds_remaining | All | Total game seconds left |
| period | All | Current period/half/inning |
| time_fraction | All | Fraction of game elapsed (0→1) |
| elo_diff | All | Home Elo − Away Elo |
| pregame_wp | All | ESPN pre-game win probability (fixed prior) |
| score_diff_x_tf | All | Lead × time elapsed (interaction) |
| score_diff_sq | All | Lead² (quadratic, captures blowouts) |
| is_home_batting | MLB | 1 if home team is batting |
| down, distance | CFB/NFL | Football situation |
| yard_line | CFB/NFL | Field position |
| possession_home | CFB/NFL | 1 if home has the ball |
| pace features | NBA | total_score, ortg_diff, drtg_diff |
We use sport-specific models — no one-size-fits-all approach. The sections below distinguish the current live platform from adjacent research and course material.
The live platform currently covers NBA, NCAAMB, NCAAWB, CFB, NFL, NHL, MLB with sport-specific state models, calibration layers, and execution filters. We do not force one shared architecture across all sports.
Logistic regression with isotonic spline calibration. We tested XGBoost, random forests, and neural nets. The key finding: simpler models produce better trading value because they don't overfit to noise in the training data. XGBoost achieves a better Brier score but worse c/trade. We select models by trading value, not accuracy.
Some sports justify extra complexity, but only when validation shows the added model risk is worth it. We optimize for durable trading value, not just a prettier forecast metric.
NHL and MLB use state-aware probability models with sport-specific context features and calibration. They follow the same principle as the rest of the live platform: independent fair probabilities first, then market comparison and execution filtering.
Some additional model families appear in the course and research stack even when they are not part of the current 7-sport live product surface.
Poisson goal models are a natural fit for three-way markets because they estimate home-win, draw, and away-win probabilities directly from scoring rates instead of forcing a binary approximation.
Series markets in esports map cleanly to binomial or map-level models. These modules are part of the broader research/course ecosystem, but they are not the same thing as today’s live 7-sport product surface.
Spread and total models require a different setup from moneyline markets: regression on remaining margin or total, then a distributional layer to convert that forecast into cover/over probabilities.
Our backtests are designed to avoid the common mistakes that inflate results.
We believe in showing failures alongside successes.
Read the proof, inspect live results, or go straight to the live platform.