프로젝트 소개
이 프로젝트는 Eurojackpot용 단일 Selenium 스크레이퍼로 시작했다가 작은 데이터 파이프라인으로 확장되었습니다. 정해진 일정에 따라 복권 추첨 데이터를 수집하고 SQLite에 저장하며, 이를 사용해 OPAP SA의 분기 GGR(Gross Gaming Revenue)을 예측합니다. 그런 다음 각 예측을 OPAP이 실제로 보고한 수치와 비교해 백테스트합니다. 저자는 이 프로젝트를 교육/취미 프로젝트로 설명합니다. 모델은 매우 적은 데이터 포인트로 학습하는 단순 회귀 모델이며 투자 조언이 아닙니다.
아키텍처 및 구성 요소:
- 스크레이퍼: eurojackpot_api.py는 eurojackpot.com의 Angular 프런트엔드 뒤에 있는 역공학 JSON API(wlinfo/WL_InfoService)를 사용합니다. 이 API는 모든 날짜의 베팅 금액, 전체 등위별 상금 내역, 당첨 번호와 2012년까지의 추첨 날짜를 반환합니다. eurojackpot_playwright.py는 해당 엔드포인트가 변경될 경우를 위한 대안입니다. joker_scraper.py와 lotto_scraper.py는 Playwright를 사용해 allwyn.gr에 접근합니다. 해당 사이트는 일반 HTTP 클라이언트에는 403을 반환하고 사용 가능한 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는 2012년까지의 Eurojackpot 추첨 데이터를 채웁니다. 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는 워크포워드 백테스트를 수행합니다.
데이터 소스와 제한 사항: Eurojackpot에는 실제 JSON API가 있으며 주요 데이터 소스입니다. Joker/Lotto 결과 페이지는 플레이된 컬럼 수(컬럼당 €1인 실제 베팅 금액)와 등위별 상금 표를 공개하지만, 현재 추첨 데이터만 스크레이프합니다. 과거 데이터를 채우려면 사이트의 검색 폼을 조작해야 하며 구현되어 있지 않습니다. OPAP이 보고한 GGR은 investors.opap.gr에서 가져오지만 재무 PDF 레이아웃이 다양하기 때문에 opap_ir_scraper.py는 최대한의 수집 방식이며 기준 데이터 소스는 아닙니다. 대신 data/manual/opap_quarterly_ggr.csv가 실제 OPAP 보도자료에서 수동으로 채워지고 각 행에 출처 URL이 인용되어 있으며, 백테스트 평가의 기준이 됩니다.
예측 및 백테스트: 모델은 집계된 Eurojackpot/Joker/Lotto 베팅 금액과 지급액에서 OPAP의 numerical_lotteries 부문 GGR을 예측합니다. backtest.py는 과거를 순서대로 진행하며 엄격하게 이전 기간의 데이터만으로 학습하고 예측한 뒤 비교하여 기간별 MAPE와 성장 대 하락 예측의 적중 여부를 data/backtest_report.csv에 기록합니다. 수동 CSV에 채워진 기간이 최소 두 개 이상 필요하며 보고서가 더 많이 추가될수록 더 의미 있는 결과가 됩니다.
로컬 실행: requirements와 Playwright의 Chromium을 설치한 다음 파이프라인 모듈을 순서대로 실행합니다(scrape_latest, backfill_history, load_manual_ggr, build_quarterly_features, train_model, backtest, predict).
CI/CD: scrape.yml은 매일 scrape_latest를 실행하고 업데이트된 DB를 커밋합니다. backtest.yml은 대략 분기마다 그리고 workflow_dispatch를 통한 요청 시 실행되며, 수동 CSV를 로드하고 특징을 생성하고 모델을 재학습하며 백테스트하고 다음 기간을 예측한 뒤 결과를 커밋합니다.
README에는 부문별 GGR 구성(복권, 스포츠 베팅, VLT, 온라인 카지노, 인스턴트/패시브 복권)이 설명되어 있습니다. 또한 세금, 마케팅, 운영 비용이 범위 밖이므로 이 프로젝트가 실제 현실의 정확한 수익을 계산하지 않는다는 독자적인 면책 조항이 포함되어 있습니다.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.