About the Tennis Model
Prematch predictions for ATP, WTA, and ATP Challenger singles — built from structure, not a black box, and published with the guardrails visible.
One engine, every market
We don't fit a separate model per betting market. Each player carries two skills — how often they win points on serve, and on return, relative to tour baseline — estimated from millions of historical points with an uncertainty-aware filter (a Kalman-style update: new evidence moves a rating in proportion to how much we already know). Those two numbers per player feed an exact scoring simulator that plays out the match point by point under real tennis scoring — games, tiebreaks, sets, best-of format.
Because the simulator produces the full distribution of outcomes, one engine prices everything coherently: win probability, fair odds, set-score probabilities, expected total games, and the totals ladder all come from the same simulation, so they can't contradict each other.
Context the ratings alone can't see
On top of the skill ratings, the model adjusts for context that moves matches: player age curves, accumulated fatigue from recent workload, surface transitions (a clay specialist's first week on grass), and the gap between a player's overall and surface-specific record. Each context feature earned its place by improving out-of-sample accuracy on a decade of matches — anything that didn't got cut, and the backtest page shows the ladder rung by rung.
Final probabilities are calibrated so that when we say 70%, it happens about 70% of the time — our expected calibration error is a fraction of a percentage point, and you can check it on the backtest page.
Where the market fits
We show our number next to the market's price on every match, and the backtest states plainly that the closing line remains a stronger predictor than any model we've built — ours included. When our probability and the market's no-vig probability disagree sharply, we assume the market knows something we don't (a late injury, a retirement whisper) and we withhold the EV claim rather than advertise a phantom edge. Expected value, where we do publish it, is measured against the best available book price and then graded in public through closing-line value once matches settle.
The guardrails (when we refuse to publish a number)
- Identity first. If we can't confidently match a listed player to our ratings database, the match publishes with no prediction at all — we never guess who someone is.
- Divergence abstention. When model and market disagree by more than 20 percentage points, both numbers still publish but no EV is claimed.
- Player-status flags. A daily intelligence pass flags withdrawals, injury risk, and returns from layoff, always with a citable source. Flagged matches show the flag and withhold EV — the flag never silently nudges a probability.
- Longshot guard. EV on heavy longshots is noise amplified by big payouts, so we don't publish it.
- Freshness flags. When a tour's results feed lags (ATP Challenger, currently), affected sections say so visibly instead of presenting stale ratings as current.
Evaluation discipline
Every published claim is walk-forward: models are trained only on matches before the ones they predict, ratings update only after a match completes, and nothing is scored in-sample. The backtest covers a decade of tour matches, split by tour, tier, and season, with the market baseline in every table.