# deeplottery `deeplottery`는 로또 번호를 예측하는 프로젝트가 아니라, **전체 조합(45C6)을 규칙 기반으로 필터링해 후보를 줄이는 시스템**입니다. 핵심은 `BallFilter` 엔진이며, 운영 실행(`final_practice.py`)과 검증(`final_FilterTest.py`)이 분리되어 있습니다. ## 목표와 설계 의도 - 목표: 통계/패턴 기반 규칙으로 비효율 조합을 제거하고 후보군을 관리 가능한 크기로 축소 - 설계 의도: - 필터 규칙은 `final_BallFilter.py` 한 곳에서 관리 - 운영 추천 생성과 과거 회차 검증을 분리하여 반복 개선 - 같은 엔진을 운영/검증에서 공통 사용해 일관성 유지 ## 전체 아키텍처 1. 데이터 수집/갱신 - `DataCrawler.py`가 로또 API를 호출해 `resources/lotto_history.json`, `resources/lotto_history.txt` 갱신 2. 필터 엔진 로딩 - `final_BallFilter.py`의 `BallFilter`가 과거 당첨 이력을 메모리로 적재 3. 운영 후보 생성 - `final_practice.py`가 다음 회차 기준 전체 조합을 순회하며 `BallFilter.filter()`로 통과 조합만 저장 4. 필터 성능 검증 - `final_FilterTest.py`가 과거 당첨번호를 기준으로 어떤 필터가 당첨을 걸렀는지/통과시켰는지 분석 ## 핵심 파일 설명 - `final_BallFilter.py` - 프로젝트 핵심 엔진 - `extract_final_candidates()`에서 규칙 기반 탈락 사유(`set`)를 생성 - `filter()`는 실사용 진입점이며, 반환 `set`이 비어 있으면 통과 - `final_practice.py` - 운영 실행 스크립트 - `predict1()` 고정 11조합을 유지 - `predict2()`는 1차 필터 통과 조합을 만든 뒤, 2차 포트폴리오 선별로 최종 추천 수를 제한 - 총 추천 개수는 고정수 포함 최대 70게임(70,000원) 상한을 적용 - 결과를 `resources/recommend_ball.biz_25.json`에 저장하고 Telegram 전송 - `final_FilterTest.py` - 검증/분석 스크립트 - `find_filter_method()`로 회차별 필터 적중 통계 확인 - `find_final_candidates()`로 특정 회차 후보군 재생성 - `DataCrawler.py` - 과거 이력 파일 수집/보강 - 네트워크 실패 재시도/백오프 및 누락 회차 보완 처리 - `TelegramBot.py` - 추천 결과 메시지 전송 - `resources/` - `lotto_history.json`: 회차별 원본 JSON 라인 데이터 - `lotto_history.txt`: 회차별 CSV 형태 요약 데이터 - `recommend_ball.biz_25.json`: 회차별 추천 결과 저장 파일 ## 실행 방법 Python 실행은 Miniconda `ncue` 환경을 사용합니다. ```bash conda activate ncue python DataCrawler.py python final_FilterTest.py python final_practice.py ``` ## 동작 방식 상세 - 입력: 1~45에서 6개 조합 전체 - 처리: - 1차: `BallFilter` 규칙 필터 적용 - 2차: 고정 11조합을 유지한 채, 겹침도 기반 포트폴리오 선별로 후보 축소 - 출력: - 탈락 조합: 탈락 사유 집합 반환 - 최종 추천 조합: 예산 상한(최대 70,000원) 내에서 저장/전송 주요 규칙 범주 예시: - 합/평균 및 전주 대비 차이 - 앞 3개/뒤 3개 합 패턴 - 고저 비율, 끝자리 패턴, AC 값 - 배수 개수(3/4/5/6 등) - 최근 N주 출현 빈도/중복 관련 규칙 - 비선호 2개/3개 조합 제거 규칙 ## 디렉터리 현재 상태 (2026-05-08) ### 최상위 파일/디렉터리 현황 - 실행/핵심 - `DataCrawler.py` - `final_BallFilter.py` - `final_FilterTest.py` - `final_practice.py` - `final_Practice.py` (구버전 스크립트) - `TelegramBot.py` - 레거시 참조 파일 - `BallFilter_22.py`, `BallFilter_25.py` - `1_FilterTest_22.py`, `1_FilterTest_25.py` - `2_FilterTestReview_22.py`, `2_FilterTestReview_25.py` - `3_Practice_22.py`, `3_Practice_25.py` - `fixed10.py` - 데이터/설정 - `resources/` - `requirements.txt` - `scripts/` ### Git 작업 트리 상태(요약) - 수정됨: `DataCrawler.py`, `README.md`, `final_BallFilter.py`, `final_practice.py`, `resources/lotto_history.json`, `resources/lotto_history.txt` - 삭제됨: `filter_model.py`, `final_filter_params.py`, `train.py`, `valid.py` - 신규(미추적): `resources/recommend_ball.biz_25.json` ## 주의 사항 - 이 프로젝트는 통계적 휴리스틱 기반의 후보 축소 도구이며 당첨을 보장하지 않습니다. - 필터가 강해질수록 후보 수는 줄지만, 실제 당첨 조합을 배제할 위험도 함께 증가합니다.