Sports Value Detector
It prices football and tennis markets with its own models and compares them with the closing odds of sharp bookmakers, the toughest bar there is. No model beats it consistently, and the project says so plainly.
- Period
- 2026
- Team
- Personal project
- Context
- Free data, temporal validation and backtests
- My role
- Everything: data, models, backtests and dashboard
- Tech stack
- Python
- pandas
- NumPy
- scikit-learn
- SQLite
- FastAPI
- React
- pytest
Distance to the closing line
Model log loss minus closing-line log loss. The shorter the bar, the closer to the market.
| Market | Gap | Model and close | |
|---|---|---|---|
| Over/under 2.5 goalsFootball, 5 leagues | +0.009 | 0.683 vs 0.674 | |
| 1X2Football, 5 leagues | +0.015 | 0.993 vs 0.978 | |
| Match winnerTennis, ATP | +0.026 | 0.626 vs 0.604 |
Takeaway: the more liquid a market, the harder it is to approach. Any edge lives in lower-volume markets.
Out-of-sample validation: football 2025/26 against the Bet365 close and tennis 2025 against the Pinnacle close.
What it does
- Gathers 5 football leagues over 5 seasons (about 8,900 matches) and about 13,000 ATP matches, joining two sources with a 99.8% match rate.
- Computes probabilities with its own models and compares them with the closing odds.
- Logs odds for markets with no free history, such as corners and cards, to build its own.
- A FastAPI and React dashboard to explore matches, backtests and calibration.
How it is built
- No leakage. Features are computed in a single chronological pass, and tests truncate and perturb the future to check the past does not change.
- Temporal validation on two separate held-out seasons, so no model is picked by luck.
- Models: logistic regression for 1X2, Dixon-Coles for goals and surface Elo with logistic regression for tennis.
- Skeptical of wins: a backtest with a +1.0% ROI turned out to be noise (+0.24 sigma) and was discarded.
In numbers
- smallest gap to the close
- +0.009
- matches analysed
- ~22,000
- automated tests
- 86
Gallery




Let’s talk
I’m from Seville and now live in Madrid. I like things to work end to end: designing the system, writing the code, deploying it and measuring whether it really holds up.
If you’re looking for someone for backend, data or applied AI work, write to me and I’ll get back to you.