Joaquín Borja León ProyectosProjects

Sports Value Detector

Calcula sus propias probabilidades para mercados de fútbol y tenis y las compara con la cuota de cierre de casas de referencia, el listón más exigente. Ningún modelo la bate de forma consistente, y el proyecto lo cuenta tal cual.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.

Proyecto personalPersonal project2026

PeriodoPeriod
2026
EquipoTeam
Proyecto personalPersonal project
ContextoContext
Datos gratuitos, validación temporal y backtestsFree data, temporal validation and backtests
Mi papelMy role
Todo: datos, modelos, backtests y panelEverything: data, models, backtests and dashboard
TecnologíasTech stack
  • Python
  • pandas
  • NumPy
  • scikit-learn
  • SQLite
  • FastAPI
  • React
  • pytest

Distancia a la línea de cierreDistance to the closing line

Log loss del modelo menos log loss de la cuota de cierre. Cuanto más corta la barra, más cerca del mercado.Model log loss minus closing-line log loss. The shorter the bar, the closer to the market.

MercadoMarketDistanciaGapModelo y cierreModel and close
Más/menos 2,5 golesOver/under 2.5 goalsFútbol, 5 ligasFootball, 5 leagues+0,009+0.0090,683 frente a 0,6740.683 vs 0.674
1X2Fútbol, 5 ligasFootball, 5 leagues+0,015+0.0150,993 frente a 0,9780.993 vs 0.978
Ganador del partidoMatch winnerTenis, ATPTennis, ATP+0,026+0.0260,626 frente a 0,6040.626 vs 0.604

Lectura:Takeaway: cuanto más líquido es un mercado, más difícil es acercarse a él. Si hay margen, está en los mercados con menos volumen.the more liquid a market, the harder it is to approach. Any edge lives in lower-volume markets.

Validación fuera de muestra: fútbol 2025/26 contra el cierre de Bet365 y tenis 2025 contra el de Pinnacle.Out-of-sample validation: football 2025/26 against the Bet365 close and tennis 2025 against the Pinnacle close.

Resultados reales del proyecto, recogidos en su README.Real results from the project, as reported in its README.

Qué haceWhat it does

  • Reúne 5 ligas de fútbol en 5 temporadas (unos 8.900 partidos) y unos 13.000 partidos de la ATP, cruzando dos fuentes con un 99,8 % de coincidencia.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.
  • Calcula probabilidades con modelos propios y las compara con la cuota de cierre.Computes probabilities with its own models and compares them with the closing odds.
  • Registra cuotas de mercados sin histórico gratuito, como córners y tarjetas, para construir uno propio.Logs odds for markets with no free history, such as corners and cards, to build its own.
  • Un panel con FastAPI y React para explorar partidos, backtests y calibración.A FastAPI and React dashboard to explore matches, backtests and calibration.

Cómo está hechoHow it is built

  • Sin fugas de información. Las variables se calculan en una sola pasada cronológica, y hay tests que truncan y alteran el futuro para comprobar que el pasado no cambia.No leakage. Features are computed in a single chronological pass, and tests truncate and perturb the future to check the past does not change.
  • Validación temporal con dos temporadas distintas fuera de muestra, para no elegir un modelo por suerte.Temporal validation on two separate held-out seasons, so no model is picked by luck.
  • Modelos: regresión logística para el 1X2, Dixon-Coles para los goles y Elo por superficie con regresión logística para el tenis.Models: logistic regression for 1X2, Dixon-Coles for goals and surface Elo with logistic regression for tennis.
  • Escepticismo con los aciertos: un backtest con un ROI del +1,0 % resultó ser ruido (+0,24 sigmas) y se descartó.Skeptical of wins: a backtest with a +1.0% ROI turned out to be noise (+0.24 sigma) and was discarded.

En cifrasIn numbers

distancia mínima al cierresmallest gap to the close
+0,009+0.009
partidos analizadosmatches analysed
~22.000~22,000
tests automáticosautomated tests
86

¿Hablamos?Let’s talk

Soy de Sevilla y ahora vivo en Madrid. Me gusta que las cosas funcionen de principio a fin: diseñar el sistema, escribir el código, desplegarlo y medir si de verdad responde bien.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.

Si buscas a alguien para backend, datos o IA aplicada, escríbeme y te respondo.If you’re looking for someone for backend, data or applied AI work, write to me and I’ll get back to you.