Sobre el proyecto
Este proyecto comenzó como un único scraper de Selenium para Eurojackpot y creció hasta convertirse en un pequeño pipeline de datos. Recopila datos de sorteos de lotería según un horario, los almacena en SQLite y los usa para pronosticar los Ingresos Brutos de Juego (GGR) trimestrales de OPAP SA, luego valida cada pronóstico contra las cifras que OPAP reporta realmente. El autor lo describe como un proyecto educativo/de hobby: el modelo es una regresión simple entrenada con muy pocos puntos de datos, y no constituye asesoramiento de inversión.
Arquitectura y componentes:
- Scrapers: eurojackpot_api.py usa una API JSON reverse-engineered detrás del frontend Angular de eurojackpot.com (wlinfo/WL_InfoService), que devuelve apuestas, desgloses completos de niveles de premios, números ganadores para cualquier fecha y fechas de sorteos desde 2012. eurojackpot_playwright.py es un respaldo si ese endpoint cambia. joker_scraper.py y lotto_scraper.py usan Playwright contra allwyn.gr, que devuelve 403 a clientes HTTP simples y no ofrece API usable; _allwyn_common.py contiene la lógica compartida de parsing de páginas. opap_ir_scraper.py es un scraping de mejor esfuerzo de los comunicados de prensa de relaciones con inversores de OPAP.
- Base de datos: db/schema.sql define el esquema SQLite; db/repository.py es la capa de acceso a datos sqlite3.
- Pipeline: scrape_latest.py se ejecuta en un horario vía GitHub Actions; backfill_history.py rellena históricamente los sorteos de Eurojackpot hasta 2012; build_quarterly_features.py agrega sorteos en características por período de reporte; load_manual_ggr.py carga data/manual/opap_quarterly_ggr.csv.
- Pronóstico: dataset.py une características con GGR real; train_model.py entrena regresión Ridge/GradientBoosting con validación cruzada; predict.py pronostica el próximo período aún no reportado; backtest.py realiza un backtest walk-forward.
Fuentes de datos y limitaciones: Eurojackpot tiene una API JSON real y es la fuente principal. Las páginas de resultados de Joker/Lotto publican el total de columnas jugadas (una cifra genuina de apuestas a 1€/columna) más tablas de niveles de premios, pero solo se extrae el sorteo actual; el backfill histórico requeriría automatizar el formulario de búsqueda del sitio, lo cual no está implementado. El GGR reportado por OPAP proviene de investors.opap.gr, pero los diseños de los PDFs financieros varían, por lo que opap_ir_scraper.py es de mejor esfuerzo y no es la fuente de verdad. En su lugar, data/manual/opap_quarterly_ggr.csv se popula manualmente a partir de comunicados de prensa reales de OPAP, con cada fila citando su URL de origen, y es contra lo que el backtest evalúa.
Pronóstico y backtesting: el modelo predice el GGR del segmento numerical_lotteries de OPAP a partir de apuestas y pagos agregados de Eurojackpot/Joker/Lotto. backtest.py recorre la historia hacia adelante, entrenando solo en períodos estrictamente anteriores, prediciendo y comparando, escribiendo data/backtest_report.csv con MAPE por período y si predijo correctamente crecimiento versus caída. Necesita al menos dos períodos poblados en el CSV manual y se vuelve más significativo a medida que se añaden más reportes.
Ejecución local: instalar requirements y Chromium de Playwright, luego ejecutar los módulos del pipeline en orden (scrape_latest, backfill_history, load_manual_ggr, build_quarterly_features, train_model, backtest, predict).
CI/CD: scrape.yml ejecuta scrape_latest diariamente y commitea la BD actualizada; backtest.yml se ejecuta aproximadamente trimestralmente y bajo demanda vía workflow_dispatch, cargando el CSV manual, construyendo features, reentrenando, haciendo backtest, prediciendo el próximo período y commiteando resultados.
El README señala la composición del GGR por segmento (loterías, apuestas deportivas, VLTs, casino online, instantáneas/pasivas) e incluye un disclaimer original de que el proyecto no calcula ganancias reales exactas, ya que impuestos, marketing y costes operativos están fuera de alcance.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.