From d2c9369e3f4dbf4982a5d8adc53f344d4c7b9b7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Fr=C3=B6hlich?= Date: Sat, 12 Sep 2026 10:02:10 +0200 Subject: [PATCH] Rewrite README to match the actual active system Same problem as Eurojackpot had: described the old 3-strategy system (PURE-AI/PURE-PATTERN/ENSEMBLE) and crontab scheduling, neither of which reflects what's actually running. Rewritten to describe the current 4-strategy generator, the EV-optimized quality score, the launchd schedule (update/weekly/watchdog), and the new backup retention. Links to ARCHITECTURE.md for details. Co-Authored-By: Claude Sonnet 5 --- README.md | 479 ++++++++++++++---------------------------------------- 1 file changed, 123 insertions(+), 356 deletions(-) diff --git a/README.md b/README.md index d50af9c..17b39c7 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,57 @@ # Lotto 6aus49 Analyse & Generator -Automatisiertes System zur Analyse von Lotto 6aus49-Daten und Generierung von KI-gestützten Tipps mit Telegram-Benachrichtigungen. +Automatisiertes System zur Analyse von Lotto 6aus49-Daten und Generierung von KI-gestützten Tipps mit Telegram-Benachrichtigungen. Schwesterprojekt von [Eurojackpot](../Eurojackpot) — gleiche Architektur, angepasst an das Lotto-Format (6 Zahlen aus 49 + 1 Superzahl). + +Eine detaillierte Architektur- und Datenfluss-Beschreibung steht in [documentation/ARCHITECTURE.md](documentation/ARCHITECTURE.md). ## 🎲 Features -- **🧠 AI/ML-basierte Tipp-Generierung**: Random Forest, Gradient Boosting & Neural Networks -- **🎨 Pattern-Analyse**: Historische Verteilungsmuster (NNMMHH, etc.) -- **⚡ Hybrid-Optimization**: Multi-objektive Optimierung mit 4 Strategien -- **📚 Real-Time Learning**: Kontinuierliche Anpassung der Modelle -- **🤖 Automatisierung**: Wöchentliche Tipp-Generierung via Cron -- **📲 Telegram-Benachrichtigungen**: Automatische Tipps direkt aufs Smartphone -- **🔄 Data-Updates**: 3 verschiedene Methoden (API, Web-Scraping, Manuelle Eingabe) +- **🧠 AI/ML-basierte Tipp-Generierung**: Random Forest + LSTM (PyTorch) Hybrid-Predictor +- **🎨 Pattern-Analyse**: Historische Verteilungsmuster (N/M/H-Zonen) +- **⚡ 4-Strategien-System**: HYBRID-OPT, BALANCED-SPREAD, HIGH-EV, SOFT-CONTRARIAN mit adaptiver Gewichtung +- **💰 EV-Optimierung**: Quality-Score gewichtet gezielt auf unpopuläre (aber gleich wahrscheinliche) Zahlenkombinationen, um den Gewinnanteil im Trefferfall zu erhöhen +- **📚 Real-Time Learning**: Kontinuierliches Retraining bei neuen Ziehungen +- **🤖 Automatisierung**: Tipp-Generierung & Datenupdate via launchd, mit täglichem Watchdog gegen verpasste Läufe +- **📲 Telegram-Benachrichtigungen**: Automatische Tipps direkt aufs Smartphone, plus Watchdog-Alarm bei Problemen +- **🔄 Data-Updates**: API-Kette (Lottoland → GitHub-Archiv → lottoAPI) mit Web-Scraping- und manuellem Fallback ## 📁 Verzeichnisstruktur -``` +```text Lotto/ -├── README.md # Diese Datei -├── config/ # Konfigurationsdateien -│ ├── notifications.json # Telegram/Email Config -│ └── notifications.json.example # Beispiel-Konfiguration -├── data/ # Generierte Daten -│ └── generated_tips/ # Hier landen die generierten Tipps +├── README.md +├── config/ +│ └── notifications.json # Telegram/Email Config +├── data/ +│ ├── AlleLottozahlen.csv # Ziehungshistorie +│ ├── backups/ # CSV-Backups (automatisch rotiert, letzte 30) +│ ├── ultimate_ml_models/ # Trainierte Modelle (RF + LSTM) +│ └── generated_tips/ # Generierte Tipps ├── scripts/ -│ ├── generators/ # Tipp-Generatoren -│ │ └── ultimate_ai_ml_hybrid_generator.py -│ ├── automation/ # Automatisierungs-Scripts -│ │ └── weekly_tip_generator.py -│ ├── analysis/ # Analyse-Scripts -│ └── utils/ # Hilfsfunktionen -│ ├── notifier.py # Benachrichtigungs-System -│ ├── update_from_api.py # API-basiertes Update -│ ├── update_from_web.py # Web-Scraping Update -│ └── simple_update.py # Manuelle Eingabe -├── results/ # Auswertungen & Grafiken -├── logs/ # Log-Dateien -└── setup_cron.sh # Cron-Job Einrichtung +│ ├── generators/ +│ │ └── ultimate_ai_ml_hybrid_generator.py # aktiver Generator +│ ├── automation/ +│ │ ├── auto_update_and_learn.py # Update + Retraining +│ │ ├── weekly_tip_generator.py # Tipp-Generierung +│ │ ├── com.lotto.update.plist +│ │ ├── com.lotto.weekly.plist +│ │ └── com.lotto.watchdog.plist +│ └── utils/ +│ ├── notifier.py # Telegram/Email +│ ├── update_from_api.py # API-Updater (aktiv) +│ ├── update_from_web.py # Web-Scraping-Fallback (nicht automatisiert) +│ ├── simple_update.py # Manuelle Eingabe +│ ├── watchdog.py # Prüft Daten-/Modell-Aktualität, alarmiert per Telegram +│ ├── validate_csv.py # manuelles Utility +│ ├── verify_draws.py # manuelles Utility +│ └── health_check.py # manuelles Utility +├── documentation/ +│ └── ARCHITECTURE.md +├── results/ # Auswertungen (z.B. Superzahl-Statistik) +├── run_tip_generator.sh +├── run_update_and_learn.sh +├── run_watchdog.sh +└── logs/ ``` ## 🚀 Quick Start @@ -43,19 +59,16 @@ Lotto/ ### 1. Installation ```bash -# Python-Abhängigkeiten installieren -pip install pandas numpy scikit-learn requests - -# Optional: Deep Learning -pip install tensorflow +python3 -m venv venv +source venv/bin/activate +pip install pandas numpy scikit-learn requests torch ``` ### 2. Telegram-Bot einrichten 1. Erstelle einen Bot mit [@BotFather](https://t.me/botfather) -2. Kopiere den Bot-Token -3. Hole deine Chat-ID (z.B. mit [@userinfobot](https://t.me/userinfobot)) -4. Konfiguriere `config/notifications.json`: +2. Kopiere den Bot-Token, hole deine Chat-ID (z.B. mit [@userinfobot](https://t.me/userinfobot)) +3. Konfiguriere `config/notifications.json` (siehe [TELEGRAM_BOT_SETUP.md](TELEGRAM_BOT_SETUP.md)): ```json { @@ -67,360 +80,114 @@ pip install tensorflow } ``` -### 3. Manuell Tipps generieren - -```bash -cd scripts/automation -python weekly_tip_generator.py --force --num-tips 10 -``` - -### 4. Telegram-Bot einrichten (optional) - -Richte einen eigenen Lotto-Bot für Benachrichtigungen ein: - -```bash -# Anleitung lesen -cat TELEGRAM_BOT_SETUP.md - -# Bot-Token in config/notifications.json eintragen -# Siehe detaillierte Anleitung in TELEGRAM_BOT_SETUP.md -``` - -**Kurzanleitung**: -1. Erstelle Bot mit @BotFather auf Telegram -2. Trage Bot-Token in `config/notifications.json` ein -3. Setze `"enabled": true` - -### 5. Automatisierung einrichten - -```bash -# Cron-Job erstellen (Dienstag & Freitag um 9 Uhr) -./setup_cron.sh -``` - -## 📊 Verwendung - -### Tipps manuell generieren - -```bash -# Standard: 10 Tipps -python scripts/automation/weekly_tip_generator.py --force - -# Anzahl Tipps anpassen -python scripts/automation/weekly_tip_generator.py --force --num-tips 20 - -# Nur Historie anzeigen -python scripts/automation/weekly_tip_generator.py --history -``` - -### Generator direkt aufrufen - -```bash -cd scripts/generators -python ultimate_ai_ml_hybrid_generator.py -``` - -### Test-Benachrichtigung senden +Test-Benachrichtigung senden: ```bash python scripts/utils/notifier.py --test ``` +### 3. Tipps manuell generieren + +```bash +python scripts/automation/weekly_tip_generator.py --force --num-tips 10 + +# Nur Historie anzeigen +python scripts/automation/weekly_tip_generator.py --history +``` + +### 4. Daten manuell aktualisieren + Modelle neu trainieren + +```bash +./run_update_and_learn.sh +``` + ## 🧠 Generator-Strategien -Der Ultimate AI/ML Hybrid Generator verwendet **4 verschiedene Strategien**: +Der Ultimate AI/ML Hybrid Generator (`scripts/generators/ultimate_ai_ml_hybrid_generator.py`) verteilt pro Lauf 10 Tipps über 4 Strategien, deren Gewichtung sich anhand der bisherigen Trefferleistung selbst anpasst (Startwerte in Klammern): -1. **PURE-AI** (30%): Basierend ausschließlich auf Machine Learning Predictions -2. **PURE-PATTERN** (25%): Historische Pattern-Analyse (NNMMHH-Kombinationen) -3. **HYBRID-OPT** (30%): Multi-objektive Optimierung (AI + Pattern + Diversity) -4. **ENSEMBLE** (15%): Best-of-all kombiniert alle Ansätze +1. **HYBRID-OPT** (40%): AI-Score + historisches Pattern-Gewicht kombiniert +2. **BALANCED-SPREAD** (30%): erzwingt Verteilung über N/M/H-Zonen, kontrollierter Summenbereich +3. **HIGH-EV** (20%): 2–3 Zahlen >31, meidet empirisch belegte populäre Einzelzahlen — auf EV statt Trefferwahrscheinlichkeit optimiert +4. **SOFT-CONTRARIAN** (10%): bevorzugt in den letzten 30 Ziehungen unterrepräsentierte Zahlen -### Ausgabe-Beispiel: +### Warum EV statt Trefferwahrscheinlichkeit? -``` -Nr 6 Numbers SZ Strategy AI-Score Pattern-W Confidence Quality ----------------------------------------------------------------------------------------- - 1 7-14-21-28-35-42 3 PURE-AI 0.7234 0.3456 0.7123 ⭐ 0.756 - 2 2-11-19-27-36-45 7 HYBRID-OPT 0.6891 0.4123 0.6987 🌟 0.689 - 3 5-12-23-31-38-47 6 PURE-PATTERN 0.5234 0.5678 0.6234 🌟 0.621 -... +Lotto-Ziehungen sind unabhängige Zufallsereignisse — kein Modell kann die +Trefferwahrscheinlichkeit über den statistischen Erwartungswert heben. Der +Quality-Score optimiert deshalb bewusst auf **Expected Value**: unpopuläre +Zahlenkombinationen haben bei einem Treffer weniger Mitgewinner und damit eine +höhere Auszahlung. Details und Quellen dazu in +[documentation/ARCHITECTURE.md](documentation/ARCHITECTURE.md#3-design-entscheidung-quality-score--ev-optimierung). + +## 🔄 Daten aktualisieren + +Der automatisierte Workflow (`auto_update_and_learn.py`) nutzt +`LottoAPIUpdater.fetch_from_all_apis()`: Lottoland zuerst (liefert die +neueste Ziehung meist noch am Ziehungstag), GitHub-Archiv für die Historie. +Für manuelle Läufe stehen zusätzlich bereit: + +```bash +# Web-Scraping-Fallback (lotto.de) - nicht in der Automatisierung verdrahtet +python scripts/utils/update_from_web.py + +# Letzter Fallback: manuelle Eingabe / CSV-Import +python scripts/utils/simple_update.py ``` -## 📈 Performance Tracking +Jedes Update erstellt automatisch ein Backup unter `data/backups/` und +rotiert alte Backups (behält die letzten 30). -Alle Generierungen werden in `data/generated_tips/generation_history.json` getrackt: +## 🐶 Watchdog -```json -{ - "generations": [ - { - "timestamp": "2024-11-27T09:00:00", - "num_tips": 10, - "file": "weekly_lotto_tips_20241127_090000.csv", - "avg_confidence": 0.6834, - "avg_quality": 0.6521 - } - ] -} -``` +`scripts/utils/watchdog.py` läuft täglich (`com.lotto.watchdog.plist`) und +prüft, ob die letzte Ziehung in den Daten älter als 5 Tage ist bzw. ob die +Modelle noch auf einem älteren Stand trainiert sind als die neueste Ziehung. +Das fängt genau den Fall ab, dass ein `StartCalendarInterval`-Job verpasst +wurde (z.B. weil der Rechner im Schlaf war) — launchd holt das selbst nicht +nach. Bei einem Problem kommt ein Telegram-Alarm, sonst bleibt es still. ## 🤖 Automatisierung -### Cron-Job Zeitplan +Läuft über **launchd** (`~/Library/LaunchAgents/`), nicht crontab: -Der `setup_cron.sh` Script richtet folgende Zeitpunkte ein: - -- **Dienstag 09:00**: Tipps für Mittwoch-Ziehung -- **Freitag 09:00**: Tipps für Samstag-Ziehung - -### Cron-Job manuell einrichten - -```bash -crontab -e -``` - -Füge hinzu: - -```bash -# Lotto 6aus49 - Dienstag & Freitag 09:00 -0 9 * * 2,5 cd /path/to/Lotto && python3 scripts/automation/weekly_tip_generator.py >> logs/weekly_tips.log 2>&1 -``` +| Job | Plist | Zeitplan | +| --- | --- | --- | +| Update & Learning | `com.lotto.update.plist` | Mi + Sa, 20:00 Uhr | +| Tipp-Generierung | `com.lotto.weekly.plist` | Di + Fr, 21:00 Uhr | +| Watchdog | `com.lotto.watchdog.plist` | täglich, 21:30 Uhr | ## 📲 Telegram-Benachrichtigungen -Bei erfolgreicher Generierung erhältst du automatisch: +Bei erfolgreicher Tipp-Generierung bzw. nach jeder ausgewerteten Ziehung +verschickt `LottoNotifier` automatisch eine Zusammenfassung (bester Tipp, Ø +Confidence/Quality, Trefferauswertung). Der Watchdog nutzt denselben Kanal +für Alarme. -- ⭐ **Bester Tipp** (höchste Confidence) -- 📊 **Statistiken** (Ø Confidence & Quality) -- 🏆 **Top 3 Tipps** nach Confidence sortiert +## 📈 Performance Tracking -Beispiel-Nachricht: +Alle Generierungen werden in `data/generated_tips/generation_history.json` +protokolliert, alle Ziehungsauswertungen in `data/learning_log.json`. -``` -🎲 LOTTO 6AUS49 - NEUE TIPPS GENERIERT -======================================== +## 🗂️ Datenformat -📅 Generiert: 2024-11-27 09:00 -📊 Anzahl Tipps: 10 - -⭐ BESTER TIPP: -🎯 Zahlen: 07 - 14 - 21 - 28 - 35 - 42 -🌟 Superzahl: 3 -📈 Confidence: 0.7234 -🎨 Strategie: PURE-AI - -🍀 Viel Glück! -``` - -## 🔧 Konfiguration - -### notifications.json - -```json -{ - "telegram": { - "enabled": true, - "bot_token": "YOUR_BOT_TOKEN", - "chat_id": "YOUR_CHAT_ID" - }, - "email": { - "enabled": false, - "smtp_server": "smtp.gmail.com", - "smtp_port": 587, - "smtp_user": "", - "smtp_password": "", - "from_email": "", - "to_email": "" - } -} -``` - -## 🎰 Lotto 6aus49 Regeln - -- **6 Zahlen** aus 50 (1-49) -- **1 Superzahl** aus 10 (0-9) -- Ziehungen: **Mittwoch** und **Samstag** -- Quoten: [www.lotto.de](https://www.lotto.de) - -## 📝 Datenformat - -CSV-Datei `AlleLottozahlen.csv`: +`data/AlleLottozahlen.csv` (Semikolon-getrennt): ```csv datum;Z1;Z2;Z3;Z4;Z5;Z6;SZ -2024-11-23;7;14;21;28;35;42;3 -2024-11-20;2;11;19;27;36;45;7 -... +2026-08-08;2;8;22;30;38;43;4 ``` -## 🔄 Daten Aktualisieren +## Hinweise -Das System bietet **3 verschiedene Methoden** zum Aktualisieren der Lottozahlen: - -### Methode 1: API-Update (Empfohlen) - -Automatisches Laden von öffentlichen Lotto-APIs: - -```bash -cd scripts/utils -python update_from_api.py -``` - -**Vorteile:** -- ✅ Automatisch -- ✅ Schnell -- ✅ Keine manuelle Eingabe - -**Hinweis:** Funktioniert nur wenn APIs verfügbar sind. - -### Methode 2: Web-Scraping - -Scrapt aktuelle Ziehungen direkt von lotto.de: - -```bash -cd scripts/utils -python update_from_web.py -``` - -Optionen: -```bash -# Mehr Seiten laden (mehr historische Daten) -python update_from_web.py --pages 10 - -# Spezifische Datei -python update_from_web.py /pfad/zur/datei.csv 5 -``` - -**Vorteile:** -- ✅ Offizielle Quelle (lotto.de) -- ✅ Zuverlässig -- ✅ Viele historische Daten - -**Nachteile:** -- ⚠️ Kann bei Struktur-Änderungen der Website fehlschlagen - -### Methode 3: Manuelle Eingabe (Fallback) - -Für den Fall dass API und Web-Scraping nicht funktionieren: - -```bash -cd scripts/utils -python simple_update.py -``` - -**Zwei Modi:** - -1. **Einzelne Ziehung eingeben:** - ``` - Format: YYYY-MM-DD Z1 Z2 Z3 Z4 Z5 Z6 SZ - Beispiel: 2024-11-27 7 14 21 28 35 42 3 - ``` - -2. **CSV-Import:** - ```csv - datum;Z1;Z2;Z3;Z4;Z5;Z6;SZ - 2024-11-27;7;14;21;28;35;42;3 - 2024-11-23;2;11;19;27;36;45;7 - ``` - -**Vorteile:** -- ✅ Funktioniert immer -- ✅ Volle Kontrolle -- ✅ CSV-Batch-Import möglich - -### Automatisches Backup - -Alle Update-Methoden erstellen **automatisch ein Backup** vor der Änderung: -- Gespeichert in: `Lotto/data/backups/` -- Format: `AlleLottozahlen.csv.backup_YYYYMMDD_HHMMSS` - -### Update-Workflow Empfehlung - -1. **Versuche zuerst API:** - ```bash - python scripts/utils/update_from_api.py - ``` - -2. **Fallback auf Web-Scraping:** - ```bash - python scripts/utils/update_from_web.py - ``` - -3. **Letzter Fallback - Manuelle Eingabe:** - ```bash - python scripts/utils/simple_update.py - ``` - -### Nach dem Update - -Nach dem erfolgreichen Update der Daten: - -```bash -# Neue Tipps generieren (mit automatischem Retraining) -python scripts/automation/weekly_tip_generator.py --force - -# Oder direkt den Generator aufrufen -python scripts/generators/ultimate_ai_ml_hybrid_generator.py -``` - -### 🤖 Automatisches ML-Retraining - -Das System verwendet **intelligentes Retraining**: - -- ✅ **Automatische Erkennung**: Prüft ob CSV neuer als ML-Cache -- ✅ **Smart Caching**: Nutzt Cache wenn Daten unverändert -- ✅ **Auto-Retrain**: Trainiert neu wenn neue Daten verfügbar - -**So funktioniert es:** -1. Nach `update_from_api.py` wird CSV aktualisiert -2. Beim nächsten Generator-Start: CSV-Timestamp > Cache-Timestamp -3. ✅ Automatisches Retraining mit neuen Daten -4. Neue ML-Modelle berücksichtigen aktuelle Ziehungen - -**Manuelles Retraining erzwingen:** -```bash -# Cache löschen für komplettes Retraining -rm -rf ultimate_ml_models/ -python scripts/generators/ultimate_ai_ml_hybrid_generator.py -``` - -## 🛠️ Entwicklung - -### Neue Strategie hinzufügen - -1. Öffne `scripts/generators/ultimate_ai_ml_hybrid_generator.py` -2. Füge neue Strategie in `strategy_weights` hinzu -3. Implementiere `_generate__tip()` Methode -4. Update `_generate_tips_by_strategy()` - -### Logging aktivieren - -```python -import logging - -logging.basicConfig( - filename='logs/generator.log', - level=logging.INFO, - format='%(asctime)s - %(levelname)s - %(message)s' -) -``` - -## ⚠️ Hinweise - -- **Keine Gewinngarantie**: Dies ist ein statistisches Analyse-Tool -- **Historische Daten**: Vergangene Ziehungen garantieren keine zukünftigen Ergebnisse -- **Verantwortungsvoll spielen**: Lotto ist Glücksspiel -- **Bot-Token**: Niemals öffentlich teilen! - -## 📜 Lizenz - -Dieses Projekt ist für private Zwecke. Keine kommerzielle Nutzung. +- Lotto 6aus49: 6 Zahlen aus 49 + 1 Superzahl (0–9), Ziehungen Mi + Sa +- Keine Gewinngarantie — statistisches Analyse-Tool, keine Vorhersagekraft + über den Zufalls-Erwartungswert hinaus (siehe Abschnitt "Warum EV statt + Trefferwahrscheinlichkeit?") +- Bot-Token niemals öffentlich teilen ## 🙋 Support -Bei Fragen oder Problemen: - -1. Check die Logs: `logs/weekly_tips.log` +1. Logs prüfen: `logs/update_stdout.log`, `logs/stdout.log`, `logs/watchdog_stdout.log` 2. Test-Benachrichtigung: `python scripts/utils/notifier.py --test` 3. Historie prüfen: `python scripts/automation/weekly_tip_generator.py --history`