personal project · not betting advice

Tennis Odds Engine

A model that generates its own win probabilities for ATP/WTA matches from match history alone — Elo, form, head-to-head, surface and venue splits — then checks itself against real bookmaker closing lines. No market data goes into the predictions; the market is only used here to grade us.

Training data

Matches trained on
1,741,054
1967-12-25 → 2026-06-02
Main tour
359,005
ATP + WTA
Challenger
239,530
pre-main-tour history
ITF / Futures
1,142,519
cold-start warm-up
Last retrained
2026-09-19
08:15 UTC

Accuracy vs. Elo vs. the real market

All numbers below are on matches from 2024 onward that were never used in training — a true out-of-time holdout, not a lookback.

AccuracyLog lossBriern
Elo only 65.6% 0.6101 0.2118 14,150
Our model 66.9% 0.5964 0.2061 14,150
Real market (Pinnacle, de-vigged) 68.3% 0.5885 0.2023 11,052

Matched 11,052 / 14,150 main-tour 2024+ matches to closing odds (78% coverage). We pick the same favorite as the market 90% of the time.

Calibration: our model vs. the market

When a predictor says "70% to win," does that side actually win about 70% of the time? The closer a line sits to the diagonal, the more trustworthy its numbers are.

What the model weighs most

elo_pre_diff
surface_elo_pre_diff
p2_career_matches_before
p1_career_matches_before
p2_days_since_last_match
p1_surface_matches_before
p1_days_since_last_match
p2_surface_matches_before
p1_elo_pre
p2_elo_pre
p1_career_win_pct_before
p2_season_win_pct_before
rank_diff
p1_venue_win_pct_before
p1_season_win_pct_before

Upcoming match tips

Live predictions for upcoming matches are coming soon — this needs a fixtures feed wired in (in progress). For now, everything above is measured against past matches the model never trained on.

Got an idea to make this better?

Feature ideas, a stat you'd want tracked, a bug in the numbers — all welcome.