Об этом проекте

Проект начался с одного скрапера на Selenium для Eurojackpot и вырос в небольшой конвейер данных. Он по расписанию собирает данные лотерейных тиражей, хранит их в SQLite и использует для прогноза квартального валового игрового дохода (GGR) OPAP SA, а затем проверяет каждый прогноз по показателям, которые фактически публикует OPAP. Автор описывает проект как учебный/хобби-проект: модель представляет собой простую регрессию, обученную на очень малом числе наблюдений, и не является инвестиционной рекомендацией. Архитектура и компоненты: - Скраперы: eurojackpot_api.py использует реконструированный JSON API за Angular-фронтендом eurojackpot.com (wlinfo/WL_InfoService), который возвращает ставки, полную разбивку по призовым категориям, выигрышные номера для любой даты и даты тиражей с 2012 года. eurojackpot_playwright.py служит запасным вариантом на случай изменения endpoint. joker_scraper.py и lotto_scraper.py используют Playwright для allwyn.gr, который возвращает 403 обычным HTTP-клиентам и не предоставляет пригодного API; _allwyn_common.py содержит общую логику разбора страниц. opap_ir_scraper.py выполняет попытку сбора пресс-релизов OPAP для инвесторов. - База данных: db/schema.sql определяет схему SQLite; db/repository.py является слоем доступа к данным на основе sqlite3. - Конвейер: scrape_latest.py запускается по расписанию через GitHub Actions; backfill_history.py выполняет обратную загрузку тиражей Eurojackpot до 2012 года; build_quarterly_features.py агрегирует тиражи в признаки по отчётным периодам; load_manual_ggr.py загружает data/manual/opap_quarterly_ggr.csv. - Прогнозирование: dataset.py объединяет признаки с фактическим GGR; train_model.py обучает регрессию Ridge/GradientBoosting с перекрёстной проверкой; predict.py прогнозирует следующий ещё не отражённый в отчётности период; backtest.py выполняет бэктест методом walk-forward. Источники данных и ограничения: у Eurojackpot есть реальный JSON API, и он является основным источником. Страницы результатов Joker/Lotto публикуют общее число сыгранных колонок — реальную сумму ставок из расчёта 1 евро за колонку — и таблицы призовых категорий, но скрапится только текущий тираж; историческая обратная загрузка потребовала бы работы с формой поиска на сайте, которая не реализована. Опубликованный OPAP GGR берётся с investors.opap.gr, но макеты финансовых PDF различаются, поэтому opap_ir_scraper.py работает по принципу best-effort и не является эталонным источником. Вместо него data/manual/opap_quarterly_ggr.csv вручную заполняется на основе реальных пресс-релизов OPAP, каждая строка содержит ссылку на источник, и именно этот файл используется для оценки бэктеста. Прогнозирование и бэктест: модель предсказывает GGR сегмента numerical_lotteries OPAP на основе агрегированных ставок и выплат Eurojackpot/Joker/Lotto. backtest.py проходит по истории вперёд, обучаясь только на строго более ранних периодах, делая прогноз и сравнивая его с фактом, записывая data/backtest_report.csv с MAPE по каждому периоду и указанием, верно ли был определён рост или снижение. Требуется как минимум два заполненных периода в ручном CSV, и по мере добавления отчётов результаты становятся более показательными. Локальный запуск: установите зависимости и Chromium для Playwright, затем запускайте модули конвейера в порядке (scrape_latest, backfill_history, load_manual_ggr, build_quarterly_features, train_model, backtest, predict). CI/CD: scrape.yml запускает scrape_latest ежедневно и коммитит обновлённую базу данных; backtest.yml запускается примерно раз в квартал и вручную через workflow_dispatch: загружает ручной CSV, строит признаки, переобучает модель, выполняет бэктест, прогнозирует следующий период и коммитит результаты. README описывает состав GGR по сегментам (лотереи, спортивные ставки, VLT, онлайн-казино, моментальные/пассивные лотереи) и содержит оригинальную оговорку: проект не вычисляет точную реальную прибыль, поскольку налоги, маркетинг и операционные расходы выходят за его рамки.