Sobre o projeto
Este projeto começou como um único scraper Selenium para Eurojackpot e se transformou em um pequeno pipeline de dados. Ele coleta dados de sorteios de loterias de forma agendada, armazena tudo no SQLite e usa esses dados para prever a receita bruta de jogos (GGR, Gross Gaming Revenue) trimestral da OPAP SA, depois avalia cada previsão contra os valores efetivamente reportados pela OPAP. O autor descreve o projeto como educacional/hobby: o modelo é uma regressão simples treinada com pouquíssimos pontos de dados e não constitui aconselhamento de investimento.
Arquitetura e componentes:
- Scrapers: eurojackpot_api.py usa uma JSON API recriada por engenharia reversa por trás do frontend Angular do eurojackpot.com (wlinfo/WL_InfoService), retornando valores apostados, detalhamento completo das categorias de prêmios, números sorteados para qualquer data e datas de sorteio desde 2012. eurojackpot_playwright.py é um fallback caso esse endpoint mude. joker_scraper.py e lotto_scraper.py usam Playwright contra o allwyn.gr, que retorna 403 para clientes HTTP simples e não oferece uma API utilizável; _allwyn_common.py contém a lógica compartilhada de análise das páginas. opap_ir_scraper.py faz uma raspagem best-effort dos comunicados de relações com investidores da OPAP.
- Banco de dados: db/schema.sql define o esquema do SQLite; db/repository.py é a camada de acesso a dados via sqlite3.
- Pipeline: scrape_latest.py é executado em uma agenda via GitHub Actions; backfill_history.py preenche o histórico de sorteios do Eurojackpot até 2012; build_quarterly_features.py agrega os sorteios em features por período de relatório; load_manual_ggr.py carrega data/manual/opap_quarterly_ggr.csv.
- Previsão: dataset.py junta as features ao GGR real; train_model.py treina regressões Ridge/GradientBoosting com validação cruzada; predict.py prevê o próximo período ainda não reportado; backtest.py executa um backtest walk-forward.
Fontes de dados e limitações: o Eurojackpot tem uma JSON API real e é a fonte principal. As páginas de resultados de Joker/Lotto publicam o total de colunas jogadas (um valor genuíno de apostas a €1/coluna), além de tabelas de categorias de prêmios, mas apenas o sorteio atual é raspado; o preenchimento histórico exigiria usar o formulário de busca do site, o que não foi implementado. O GGR reportado pela OPAP vem de investors.opap.gr, mas os layouts dos PDFs financeiros variam; por isso, opap_ir_scraper.py é best-effift e não é a fonte da verdade. Em vez disso, data/manual/opap_quarterly_ggr.csv é preenchido manualmente a partir de comunicados reais da OPAP, com cada linha citando sua URL de origem, e é contra esse arquivo que o backtest avalia os resultados.
Previsão e backtest: o modelo prevê o GGR do segmento numerical_lotteries da OPAP a partir de valores apostados e prêmios pagos agregados de Eurojackpot, Joker e Lotto. O backtest.py percorre o histórico em walk-forward, treinando apenas com períodos estritamente anteriores, prevendo e comparando, e grava data/backtest_report.csv com o MAPE por período e indicando se o modelo acertou se haveria crescimento ou queda. Ele precisa de pelo menos dois períodos preenchidos no CSV manual e se torna mais significativo conforme mais relatórios são adicionados.
Execução local: instale os requirements e o Chromium do Playwright e, em seguida, execute os módulos do pipeline na ordem (scrape_latest, backfill_history, load_manual_ggr, build_quarterly_features, train_model, backtest, predict).
CI/CD: scrape.yml executa scrape_latest diariamente e commita o banco de dados atualizado; backtest.yml é executado aproximadamente a cada trimestre e sob demanda via workflow_dispatch, carregando o CSV manual, construindo features, retreinando, fazendo backtest, prevendo o próximo período e commitando os resultados.
O README observa a composição do GGR por segmento (loterias, apostas esportivas, VLTs, cassino online, instants/passive) e inclui um disclaimer original de que o projeto não calcula o lucro real exato, já que impostos, marketing e custos operacionais estão fora do escopo.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.