Compare commits

...
9 Commits
Author SHA1 Message Date
cbazzaandClaude Sonnet 5 6d7e6ec8a4 Update draws, retrain models and generate tips for the Aug 8 draw
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 19:08:50 +02:00
cbazzaandClaude Sonnet 5 83e5cae832 Log tip generation run for the Aug 8 draw
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 11:24:52 +02:00
cbazzaandClaude Sonnet 5 a45092b162 Wire the Lottoland fallback into the automated update workflow
AutoUpdateAndLearn.update_data() called LottoAPIUpdater with
api_name='github', which skipped the already-implemented Lottoland ->
GitHub -> lottoAPI fallback chain entirely. The GitHub archive alone
has repeatedly lagged 1-6 days behind actual draws (most recently the
Aug 5 draw, still missing as of Aug 7), causing tips to be generated
and models to be retrained on stale data. Switching to api_name='all'
tries Lottoland first, which has consistently had same-day results in
testing, with GitHub still covering full history/fallback.

Also includes the Aug 5 draw pulled in via this fix and the resulting
model retrain (data update was previously interrupted by a truncated
pipe during manual testing, this completes it).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 10:55:17 +02:00
cbazzaandClaude Sonnet 5 79c4c0d4b3 Log tip generation run for the Aug 4 draw
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 18:17:49 +02:00
cbazzaandClaude Sonnet 5 6630c588a7 Remove unreferenced legacy generator scripts and stale reports
The graphify code-graph pass confirmed nothing in the active pipeline
(scripts/, README, shell entrypoints) imports or calls these - only
scripts/generators/ultimate_ai_ml_hybrid_generator.py is wired into
automation. Also drops 4 orphaned performance-report JSON files from
the same abandoned generation (Sep 2025). History is preserved in git
if anything here turns out to still be wanted.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 18:04:27 +02:00
cbazzaandClaude Sonnet 5 3fcc1fc210 Add ARCHITECTURE.md documenting data flow and active vs. legacy code
Built with a graphify code-graph pass to identify the real dependency
structure. Documents the ingestion -> training -> tip generation ->
notification flow, the EV/quality-score rationale, and several
non-obvious facts surfaced by this session's debugging: automation
runs on launchd not crontab (the crontab comments are stale), the
Lottoland/lottoAPI fallback exists but isn't wired into the update
job, and the repo-root generator scripts are legacy/unused - only
scripts/generators/ultimate_ai_ml_hybrid_generator.py is live.

graphify-out/ itself is gitignored as a regenerable build artifact.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 18:00:37 +02:00
cbazzaandClaude Sonnet 5 e05f1f12ba Fix popularity score: drop sum-extremity, it inverted the ranking
Testing against known real-world popular combinations (1-2-3-4-5-6,
5-10-15-20-25-30) showed the sum-near-mean penalty scored them HIGHER
than spread-out combinations - the opposite of intended. Tight
sequential clusters produce both a strong pattern match AND an extreme
sum from the same underlying cause, so treating "extreme sum" as an
independent unpopularity signal double-counted in the wrong direction
for exactly the combinations it should penalize most.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 17:41:19 +02:00
cbazzaandClaude Sonnet 5 8c2089d734 Ground popularity/EV score in empirical player-choice biases
Since draws are i.i.d., only expected value (jackpot-sharing avoidance)
is actually improvable, not hit probability. Replaces the ad-hoc "lucky
numbers" list with empirically-documented picks, adds general arithmetic-
progression detection (not just +1 consecutive pairs), and scores extreme
odd/even splits and sums higher since humans favor "balanced-looking"
combinations despite every combination being equally likely.

Raises popularity's weight in the quality score from 20% to 50%, since
AI/pattern/recency signals carry no real predictive value and recency
("overdue" numbers) risks converging with other systematic players'
picks, undermining the EV goal. Superzahl selection now uses an EV
heuristic instead of chasing historical draw frequency, which is pure
noise for an independently drawn digit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 17:36:06 +02:00
cbazzaandClaude Sonnet 5 6c1139c909 Update draws, retrain models and generate tips for Jul 29 + Aug 1 draws
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 17:35:15 +02:00
20 changed files with 530 additions and 4333 deletions
+3
View File
@@ -60,3 +60,6 @@ data/*.backup*
data/generated_tips/weekly_lotto_tips_*.csv
data/performance_reports/
data/data/
# graphify Code-Graph (regenerierbar via /graphify --update)
graphify-out/
File diff suppressed because it is too large Load Diff
@@ -1,46 +0,0 @@
{
"timestamp": "2025-09-26T08:10:41.418372",
"generator_type": "AI-ML Ultimate Lotto Generator",
"system_status": {
"model_status": "Trained",
"ml_available": true,
"deep_learning_available": false,
"data_size": 4945,
"performance_stats": {
"total_tips_generated": 10,
"total_evaluations": 0,
"method_performance": {}
},
"adaptive_weights": {
"random_forest": 0.3333333333333333,
"gradient_boost": 0.3333333333333333,
"neural_network": 0.3333333333333333
},
"learning_stats": {
"generation_cycles": 1
}
},
"model_details": {
"ml_models": [
"random_forest",
"gradient_boost",
"neural_network"
],
"deep_models": [],
"ensemble_weights": {
"random_forest": 0.3333333333333333,
"gradient_boost": 0.3333333333333333,
"neural_network": 0.3333333333333333
},
"training_status": true
},
"real_time_learning": {
"learning_rate": 0.1,
"adaptation_history_size": 0,
"prediction_adjustments_count": 0
},
"recommendations": [
"\ud83d\ude80 Install TensorFlow for deep learning: pip install tensorflow",
"\ud83d\udcda More real-time learning cycles needed for adaptation"
]
}
@@ -1,52 +0,0 @@
{
"timestamp": "2025-09-26T08:13:58.454714",
"generator_type": "AI-ML Ultimate Lotto Generator",
"system_status": {
"model_status": "Trained",
"ml_available": true,
"deep_learning_available": false,
"data_size": 4948,
"performance_stats": {
"total_tips_generated": 10,
"total_evaluations": 0,
"method_performance": {
"AI-ENSEMBLE": 0.16666666666666669
}
},
"adaptive_weights": {
"random_forest": 0.3333333333333333,
"gradient_boost": 0.3333333333333333,
"neural_network": 0.3333333333333333
},
"learning_stats": {
"generation_cycles": 1,
"incorrect_predictions": 129,
"correct_predictions": 18,
"learning_cycles": 3
}
},
"model_details": {
"ml_models": [
"random_forest",
"gradient_boost",
"neural_network"
],
"deep_models": [],
"ensemble_weights": {
"random_forest": 0.3333333333333333,
"gradient_boost": 0.3333333333333333,
"neural_network": 0.3333333333333333
},
"training_status": true
},
"real_time_learning": {
"learning_rate": 0.1,
"adaptation_history_size": 0,
"prediction_adjustments_count": 49
},
"recommendations": [
"\ud83d\ude80 Install TensorFlow for deep learning: pip install tensorflow",
"\u2b50 Best performing model: AI-ENSEMBLE (0.167 accuracy)",
"\ud83d\udcda More real-time learning cycles needed for adaptation"
]
}
@@ -1,52 +0,0 @@
{
"timestamp": "2025-09-26T08:24:39.210488",
"generator_type": "AI-ML Ultimate Lotto Generator",
"system_status": {
"model_status": "Trained",
"ml_available": true,
"deep_learning_available": false,
"data_size": 4948,
"performance_stats": {
"total_tips_generated": 10,
"total_evaluations": 0,
"method_performance": {
"AI-ENSEMBLE-V2": 0.11666666666666665
}
},
"adaptive_weights": {
"random_forest": 0.3333333333333333,
"gradient_boost": 0.3333333333333333,
"neural_network": 0.3333333333333333
},
"learning_stats": {
"generation_cycles": 1,
"incorrect_predictions": 129,
"correct_predictions": 18,
"learning_cycles": 3
}
},
"model_details": {
"ml_models": [
"random_forest",
"gradient_boost",
"neural_network"
],
"deep_models": [],
"ensemble_weights": {
"random_forest": 0.3333333333333333,
"gradient_boost": 0.3333333333333333,
"neural_network": 0.3333333333333333
},
"training_status": true
},
"real_time_learning": {
"learning_rate": 0.1,
"adaptation_history_size": 0,
"prediction_adjustments_count": 49
},
"recommendations": [
"\ud83d\ude80 Install TensorFlow for deep learning: pip install tensorflow",
"\u2b50 Best performing model: AI-ENSEMBLE-V2 (0.117 accuracy)",
"\ud83d\udcda More real-time learning cycles needed for adaptation"
]
}
@@ -1,52 +0,0 @@
{
"timestamp": "2025-09-26T15:28:08.871286",
"generator_type": "AI-ML Ultimate Lotto Generator",
"system_status": {
"model_status": "Trained",
"ml_available": true,
"deep_learning_available": false,
"data_size": 4948,
"performance_stats": {
"total_tips_generated": 10,
"total_evaluations": 0,
"method_performance": {
"AI-ENSEMBLE-V2": 0.15
}
},
"adaptive_weights": {
"random_forest": 0.3333333333333333,
"gradient_boost": 0.3333333333333333,
"neural_network": 0.3333333333333333
},
"learning_stats": {
"generation_cycles": 1,
"incorrect_predictions": 129,
"correct_predictions": 18,
"learning_cycles": 3
}
},
"model_details": {
"ml_models": [
"random_forest",
"gradient_boost",
"neural_network"
],
"deep_models": [],
"ensemble_weights": {
"random_forest": 0.3333333333333333,
"gradient_boost": 0.3333333333333333,
"neural_network": 0.3333333333333333
},
"training_status": true
},
"real_time_learning": {
"learning_rate": 0.1,
"adaptation_history_size": 0,
"prediction_adjustments_count": 49
},
"recommendations": [
"\ud83d\ude80 Install TensorFlow for deep learning: pip install tensorflow",
"\u2b50 Best performing model: AI-ENSEMBLE-V2 (0.150 accuracy)",
"\ud83d\udcda More real-time learning cycles needed for adaptation"
]
}
+13
View File
@@ -3136,3 +3136,16 @@ datum;Z1;Z2;Z3;Z4;Z5;Z6;SZ
2026-06-17;3;4;20;26;27;39;9
2026-06-20;2;8;13;15;27;35;3
2026-06-24;25;36;40;43;44;49;3
2026-06-27;26;32;35;39;47;49;8
2026-07-01;2;4;5;13;41;48;4
2026-07-04;7;10;28;31;36;37;5
2026-07-08;15;28;30;31;37;45;5
2026-07-11;1;4;6;20;41;48;3
2026-07-15;7;11;35;37;39;42;1
2026-07-18;5;17;33;35;39;47;6
2026-07-22;3;5;10;14;25;49;3
2026-07-25;18;21;31;36;42;44;3
2026-07-29;3;16;22;43;48;49;8
2026-08-01;19;20;22;25;31;42;8
2026-08-05;15;23;24;36;44;49;0
2026-08-08;2;8;22;30;38;43;4
1 datum Z1 Z2 Z3 Z4 Z5 Z6 SZ
3136 2026-06-17 3 4 20 26 27 39 9
3137 2026-06-20 2 8 13 15 27 35 3
3138 2026-06-24 25 36 40 43 44 49 3
3139 2026-06-27 26 32 35 39 47 49 8
3140 2026-07-01 2 4 5 13 41 48 4
3141 2026-07-04 7 10 28 31 36 37 5
3142 2026-07-08 15 28 30 31 37 45 5
3143 2026-07-11 1 4 6 20 41 48 3
3144 2026-07-15 7 11 35 37 39 42 1
3145 2026-07-18 5 17 33 35 39 47 6
3146 2026-07-22 3 5 10 14 25 49 3
3147 2026-07-25 18 21 31 36 42 44 3
3148 2026-07-29 3 16 22 43 48 49 8
3149 2026-08-01 19 20 22 25 31 42 8
3150 2026-08-05 15 23 24 36 44 49 0
3151 2026-08-08 2 8 22 30 38 43 4
@@ -510,6 +510,83 @@
"file": "weekly_lotto_tips_20260704_165051.csv",
"avg_confidence": 0.4386488588333005,
"avg_quality": 0.544752806661678
},
{
"timestamp": "2026-07-07T21:00:21.461059",
"num_tips": 10,
"file": "weekly_lotto_tips_20260707_210021.csv",
"avg_confidence": 0.4405040572832767,
"avg_quality": 0.5324123722429387
},
{
"timestamp": "2026-07-10T21:00:21.723322",
"num_tips": 10,
"file": "weekly_lotto_tips_20260710_210021.csv",
"avg_confidence": 0.42372549130958015,
"avg_quality": 0.5212700855283287
},
{
"timestamp": "2026-07-11T18:58:43.810972",
"num_tips": 10,
"file": "weekly_lotto_tips_20260711_185843.csv",
"avg_confidence": 0.5946226596089659,
"avg_quality": 0.57911050120868
},
{
"timestamp": "2026-07-14T21:01:01.178782",
"num_tips": 10,
"file": "weekly_lotto_tips_20260714_210101.csv",
"avg_confidence": 0.587763724588359,
"avg_quality": 0.5722808767000556
},
{
"timestamp": "2026-07-17T21:00:28.149191",
"num_tips": 10,
"file": "weekly_lotto_tips_20260717_210028.csv",
"avg_confidence": 0.4392081930355287,
"avg_quality": 0.5408983355595894
},
{
"timestamp": "2026-07-21T21:00:18.226971",
"num_tips": 10,
"file": "weekly_lotto_tips_20260721_210018.csv",
"avg_confidence": 0.42365005901301317,
"avg_quality": 0.5233790166576258
},
{
"timestamp": "2026-07-24T21:00:19.858896",
"num_tips": 10,
"file": "weekly_lotto_tips_20260724_210019.csv",
"avg_confidence": 0.46327566159952005,
"avg_quality": 0.5649913485262748
},
{
"timestamp": "2026-07-28T21:00:20.506506",
"num_tips": 10,
"file": "weekly_lotto_tips_20260728_210020.csv",
"avg_confidence": 0.45335184838187415,
"avg_quality": 0.5498233984937678
},
{
"timestamp": "2026-07-31T21:00:18.028990",
"num_tips": 10,
"file": "weekly_lotto_tips_20260731_210018.csv",
"avg_confidence": 0.46070277567210083,
"avg_quality": 0.5545559923014279
},
{
"timestamp": "2026-08-04T18:07:57.975459",
"num_tips": 10,
"file": "weekly_lotto_tips_20260804_180757.csv",
"avg_confidence": 0.4399957403666754,
"avg_quality": 0.5718251526795421
},
{
"timestamp": "2026-08-07T11:02:40.552126",
"num_tips": 10,
"file": "weekly_lotto_tips_20260807_110240.csv",
"avg_confidence": 0.45460136598458617,
"avg_quality": 0.5817841547618449
}
]
}
+156
View File
@@ -727,6 +727,162 @@
"main": 0.5,
"sz_rate": 0.1
}
},
{
"timestamp": "2026-07-01T20:00:49.647993",
"draw_date": "2026-06-27",
"evaluation": {
"main": 2,
"sz": false,
"tip": 10
},
"avg_matches": {
"main": 0.5,
"sz_rate": 0.0
}
},
{
"timestamp": "2026-07-04T20:11:43.733891",
"draw_date": "2026-07-01",
"evaluation": {
"main": 1,
"sz": false,
"tip": 1
},
"avg_matches": {
"main": 0.5,
"sz_rate": 0.0
}
},
{
"timestamp": "2026-07-08T20:00:49.471290",
"draw_date": "2026-07-04",
"evaluation": {
"main": 1,
"sz": false,
"tip": 3
},
"avg_matches": {
"main": 0.2,
"sz_rate": 0.0
}
},
{
"timestamp": "2026-07-11T18:58:15.238449",
"draw_date": "2026-07-08",
"evaluation": {
"main": 3,
"sz": false,
"tip": 5
},
"avg_matches": {
"main": 1.1,
"sz_rate": 0.0
}
},
{
"timestamp": "2026-07-15T20:24:57.275663",
"draw_date": "2026-07-11",
"evaluation": {
"main": 2,
"sz": false,
"tip": 3
},
"avg_matches": {
"main": 0.7,
"sz_rate": 0.1
}
},
{
"timestamp": "2026-07-18T20:17:07.482284",
"draw_date": "2026-07-15",
"evaluation": {
"main": 2,
"sz": false,
"tip": 6
},
"avg_matches": {
"main": 0.6,
"sz_rate": 0.0
}
},
{
"timestamp": "2026-07-22T20:07:14.787102",
"draw_date": "2026-07-18",
"evaluation": {
"main": 1,
"sz": true,
"tip": 8
},
"avg_matches": {
"main": 0.6,
"sz_rate": 0.1
}
},
{
"timestamp": "2026-07-25T20:16:15.815983",
"draw_date": "2026-07-22",
"evaluation": {
"main": 2,
"sz": false,
"tip": 1
},
"avg_matches": {
"main": 0.9,
"sz_rate": 0.2
}
},
{
"timestamp": "2026-07-29T20:00:50.348674",
"draw_date": "2026-07-25",
"evaluation": {
"main": 1,
"sz": true,
"tip": 5
},
"avg_matches": {
"main": 0.3,
"sz_rate": 0.2
}
},
{
"timestamp": "2026-08-04T17:19:36.246227",
"draw_date": "2026-08-01",
"evaluation": {
"main": 1,
"sz": false,
"tip": 3
},
"avg_matches": {
"main": 0.1,
"sz_rate": 0.0
}
},
{
"timestamp": "2026-08-07T10:50:43.433684",
"draw_date": "2026-08-05",
"evaluation": {
"main": 1,
"sz": true,
"tip": 10
},
"avg_matches": {
"main": 0.6,
"sz_rate": 0.1
}
},
{
"timestamp": "2026-08-08T20:01:01.666002",
"draw_date": "2026-08-08",
"evaluation": {
"main": 3,
"sz": true,
"tip": 3
},
"avg_matches": {
"main": 1.7,
"sz_rate": 0.1
}
}
]
}
@@ -1,9 +1,9 @@
{
"trained_at": "2026-06-26T14:10:06.690748",
"num_samples": 3117,
"trained_at": "2026-08-08T20:01:01.661343",
"num_samples": 3130,
"num_features": 20,
"final_loss": 0.3737889459499946,
"final_val_loss": 0.3734370008111,
"best_val_loss": 0.37323174327611924,
"epochs_trained": 21
"final_loss": 0.3730404165726674,
"final_val_loss": 0.37338354587554934,
"best_val_loss": 0.37333065271377563,
"epochs_trained": 30
}
+54 -54
View File
@@ -1,61 +1,61 @@
{
"adjustments": {
"1": -0.14326784276963783,
"2": -0.1525534748665565,
"3": -0.1393848401818052,
"4": -0.15268751532539623,
"5": -0.15506552975096333,
"6": -0.16631408444651588,
"7": -0.12011826820321324,
"8": -0.1293035049237646,
"9": -0.12017094798524627,
"10": -0.12936983354368808,
"11": -0.1297075313590352,
"12": -0.1440259973583663,
"13": -0.12532209209903564,
"14": -0.1793625884960312,
"15": -0.07069699133945269,
"16": -0.11195268526591014,
"17": -0.15327015868141375,
"18": -0.15501024547420914,
"19": -0.14282631574002821,
"20": -0.03322127697562629,
"21": -0.16975758227090082,
"22": -0.182973260374265,
"23": -0.12780934048230247,
"24": -0.1402631357111807,
"25": -0.11733705227250311,
"26": -0.12434717982485279,
"27": -0.11233845524788302,
"28": -0.11612535987778047,
"29": -0.1430943915483658,
"30": -0.15160170827723393,
"31": -0.20645466361298564,
"32": -0.1029764704365987,
"33": -0.1694565595438057,
"34": -0.18020704673063262,
"35": -0.1400930247830341,
"36": -0.1639711617652944,
"37": -0.0941141248773726,
"38": -0.18196200314587896,
"39": -0.13995951255010242,
"40": -0.12879042332946317,
"41": -0.1645062226212372,
"42": -0.1537672519253033,
"43": -0.1103318569550083,
"44": -0.11278440678909801,
"45": -0.19489524700365307,
"46": -0.14558594795878285,
"47": -0.1523431425271016,
"48": -0.12731457913035776,
"49": -0.12915634085886468
"1": -0.17447656252852098,
"2": -0.16855522073505835,
"3": -0.17058243243886537,
"4": -0.16912426083501933,
"5": -0.1565265415734563,
"6": -0.19628647888692194,
"7": -0.13815773500328712,
"8": -0.1608191571561589,
"9": -0.16710152007198503,
"10": -0.1467663413646578,
"11": -0.16157092178319896,
"12": -0.189676855297913,
"13": -0.15770967693836213,
"14": -0.20841555764666236,
"15": -0.10587121896511503,
"16": -0.15932412950943126,
"17": -0.18379637840568513,
"18": -0.18529572568314806,
"19": -0.17369115610408078,
"20": -0.05548311599661672,
"21": -0.19925193540074856,
"22": -0.19675940102420744,
"23": -0.17433014779398687,
"24": -0.18611585394489455,
"25": -0.13486703237614187,
"26": -0.15685839750255778,
"27": -0.1596892046986258,
"28": -0.13452421990945101,
"29": -0.18879522587303826,
"30": -0.16751076836769452,
"31": -0.19038127206562197,
"32": -0.13663412879912137,
"33": -0.199114452992506,
"34": -0.2239169570738135,
"35": -0.14257523105459294,
"36": -0.17943758617917807,
"37": -0.09913819921912113,
"38": -0.21065276811475495,
"39": -0.14244888114149687,
"40": -0.17525860003957378,
"41": -0.18030894861191304,
"42": -0.15471345040511847,
"43": -0.14286525121431798,
"44": -0.1453351098570295,
"45": -0.22340680701777196,
"46": -0.19115312169289994,
"47": -0.16872377372528913,
"48": -0.1451124664635304,
"49": -0.14670732656278024
},
"stats": {
"incorrect": 2150,
"correct": 300,
"cycles": 50,
"last_update": "2026-06-26T14:10:06.693936"
"incorrect": 2623,
"correct": 366,
"cycles": 61,
"last_update": "2026-08-08T20:01:01.664655"
},
"learning_rate": 0.1,
"last_saved": "2026-06-26T14:10:06.693991"
"last_saved": "2026-08-08T20:01:01.664706"
}
Binary file not shown.
+151
View File
@@ -0,0 +1,151 @@
# Architektur
Dieses Dokument beschreibt den aktiven Datenfluss, die Kernkomponenten und die
wichtigsten Design-Entscheidungen des Lotto-6aus49-Systems. Es wurde mit Hilfe
einer Code-Graph-Analyse (`graphify-out/`, siehe unten) erstellt und sollte bei
größeren strukturellen Änderungen aktualisiert werden.
## 1. Aktiver Datenfluss
```mermaid
flowchart LR
subgraph Ingestion["1. Daten-Ingestion"]
A[GitHub Lotto Archive] -->|LottoAPIUpdater| B[AlleLottozahlen.csv]
end
subgraph Training["2. Training"]
B --> C[FeatureEngineer<br/>20 Features]
C --> D[AIMLEngine<br/>RandomForest, 40 Zahlen]
C --> E[DeepLearningEngine<br/>LSTM, PyTorch]
D --> F[Hybrid Predictor<br/>RF 40% + LSTM 60%]
E --> F
end
subgraph Generation["3. Tipp-Generierung"]
F --> G[UltimateAIMLHybridGenerator]
G --> H1[HYBRID-OPT]
G --> H2[BALANCED-SPREAD]
G --> H3[HIGH-EV]
G --> H4[SOFT-CONTRARIAN]
H1 & H2 & H3 & H4 --> I[Quality/Popularity Score]
I --> J[10 Tipps als CSV]
end
subgraph Learning["4. Learning-Loop"]
B -->|neue Ziehung| K[AutoUpdateAndLearn]
K -->|evaluiert| J
K -->|retrained| D
K -->|retrained| E
K --> L[learning_log.json /<br/>strategy_weights]
end
J --> M[LottoNotifier<br/>Telegram]
K --> M
L -.->|beeinflusst nächsten Lauf| G
```
**Zwei unabhängige Cron-Zyklen** (siehe Abschnitt 4):
| Schritt | Entrypoint | Ausführt |
| --- | --- | --- |
| Ingestion + Training + Learning | `run_update_and_learn.sh``scripts/automation/auto_update_and_learn.py` | Mi + Sa, 20:00 Uhr |
| Tipp-Generierung | `run_tip_generator.sh``scripts/automation/weekly_tip_generator.py` | Di + Fr, 21:00 Uhr |
Wichtig: Die Tipp-Generierung läuft **vor** dem nächsten Update-Lauf. Das
System hinkt daher strukturell immer bis zu einem Zyklus hinter neu
verfügbaren Ziehungen hinterher, falls die externe Datenquelle verspätet
aktualisiert (siehe Abschnitt 5).
## 2. Kernkomponenten (aktive Pipeline)
Alle Pfade relativ zum Projekt-Root.
| Komponente | Datei | Rolle |
| --- | --- | --- |
| `LottoAPIUpdater` | `scripts/utils/update_from_api.py` | Holt neue Ziehungen über `fetch_from_all_apis()`: Lottoland zuerst (liefert die neueste Ziehung meist noch am Ziehungstag), GitHub-Archiv für die Historie/als Fallback (kann tagelang hinterherhinken). `auto_update_and_learn.py` nutzt seit August 2026 `api_name='all'`, davor fest `api_name='github'` — daher wiederholt verspätete Ziehungen in der Vergangenheit. |
| `AutoUpdateAndLearn` | `scripts/automation/auto_update_and_learn.py` | Orchestriert den 4-Schritte-Workflow: Daten aktualisieren → neue Ziehung prüfen → letzte Tipps evaluieren → Learning-Update (Retraining). |
| `FeatureEngineer` | `scripts/generators/ultimate_ai_ml_hybrid_generator.py` | Baut 20 Features (Frequenzen, Gaps, Momentum, Trends, Beziehungen, Zyklen) aus den Rohdaten. |
| `AIMLEngine` | `scripts/generators/ultimate_ai_ml_hybrid_generator.py` | RandomForest-Modelle, ein Modell pro Zahl (149). Cached unter `data/ultimate_ml_models/`. |
| `DeepLearningEngine` | `scripts/utils/deep_learning_engine_pytorch.py` | LSTM (PyTorch) über Sequenzen der letzten 20 Ziehungen. Wird mit RF zu 40/60 kombiniert (`Hybrid Predictor`). |
| `UltimateAIMLHybridGenerator` | `scripts/generators/ultimate_ai_ml_hybrid_generator.py` | **God Node der Pipeline** (35 Kanten im Code-Graph) — verbindet Training, die 4 Tipp-Strategien und den Quality/Popularity-Score. Zentraler Einstiegspunkt für `generate_ultimate_tips()`. |
| `PatternEngine` | `scripts/generators/ultimate_ai_ml_hybrid_generator.py` | Historische Verteilungsmuster (N/M/H-Zonen etc.), fließt als `pattern_weight` in die Tipp-Bewertung ein. |
| `HybridOptimizer` | `scripts/generators/ultimate_ai_ml_hybrid_generator.py` | Kandidaten-Generierung für die HYBRID-OPT-Strategie. |
| `RealTimeLearner` | `scripts/generators/ultimate_ai_ml_hybrid_generator.py` | Persistiert Learning-State (`learning_state.json`), passt `strategy_weights` nach jedem Zyklus an (`_update_strategy_weights`). |
| `PerformanceTracker` | `scripts/generators/ultimate_ai_ml_hybrid_generator.py` | Loggt Trefferauswertungen nach `data/learning_log.json`. |
| `WeeklyTipGenerator` | `scripts/automation/weekly_tip_generator.py` | Ruft `generate_ultimate_tips()`, exportiert CSV nach `data/generated_tips/`, aktualisiert `generation_history.json`. |
| `LottoNotifier` | `scripts/utils/notifier.py` | Telegram-Benachrichtigungen für neue Tipps und Ziehungsergebnisse. |
### Die 4 Tipp-Strategien
Pro Lauf werden 10 Tipps über 4 Strategien verteilt (Gewichtung passt sich
über `RealTimeLearner` dynamisch an, Startwerte: HYBRID-OPT 40%,
BALANCED-SPREAD 30%, HIGH-EV 20%, SOFT-CONTRARIAN 10%):
- **HYBRID-OPT** — AI-Score + Pattern-Gewicht kombiniert (`HybridOptimizer`)
- **BALANCED-SPREAD** — erzwingt Verteilung über N/M/H-Zonen, Summenbereich 127171
- **HIGH-EV** — 23 Zahlen >31, meidet empirisch belegte populäre Einzelzahlen (siehe Abschnitt 3)
- **SOFT-CONTRARIAN** — bevorzugt in den letzten 30 Ziehungen unterrepräsentierte Zahlen
## 3. Design-Entscheidung: Quality-Score = EV-Optimierung, nicht Trefferprognose
Lotto-6aus49-Ziehungen sind mechanisch geprüfte, unabhängige Zufallsereignisse
(i.i.d.). Kein Modell — auch kein LSTM — kann daraus einen Vorteil gegenüber
reinem Zufall bei der **Trefferwahrscheinlichkeit** ableiten. Das bestätigen
auch die eigenen `learning_log.json`-Daten: die durchschnittlichen
Haupttreffer schwanken um den Erwartungswert von Zufallstipps (~0.73 Treffer
pro 6er-Tipp), ohne erkennbaren Aufwärtstrend trotz kontinuierlichem Retraining.
Der `_calculate_quality_score()` in `ultimate_ai_ml_hybrid_generator.py`
optimiert deshalb bewusst nicht auf Trefferwahrscheinlichkeit, sondern auf
**Expected Value im Gewinnfall**: unpopuläre Zahlenkombinationen haben bei
einem Treffer weniger Mitgewinner und damit eine höhere Auszahlung.
`_calculate_popularity_score()` bewertet dafür (Gewicht 50% der Quality-Formel):
1. Geburtstags-Range (>31 bevorzugt)
2. Empirisch belegte populäre Einzelzahlen (`POPULAR_PLAYER_PICKS`)
3. Zahlenfolgen/arithmetische Muster (nicht nur direkte Nachbarn)
4. Odd/Even-Split-Extremität (Menschen bevorzugen "ausgeglichen aussehende" 3-3-Splits)
Die Superzahl-Auswahl (`_get_smart_superzahl`) folgt derselben Logik: eine
feste EV-Rangfolge unpopulärer Ziffern statt (bedeutungsloser) historischer
Ziehungshäufigkeit, da die Superzahl pro Ziehung unabhängig gleichverteilt ist.
AI-Score, Pattern-Gewicht und Recency fließen weiterhin mit reduziertem
Gewicht in die Quality-Formel ein — nicht weil sie die Trefferchance erhöhen,
sondern weil eine gewisse Portfolio-Diversität über die 10 Wochentipps
gewünscht ist.
## 4. Automatisierung
Die Automatisierung läuft über **launchd** (`~/Library/LaunchAgents/`), nicht
über `crontab` — die Kommentare in `crontab -l` sind veraltete Doku-Reste und
spiegeln nicht den tatsächlichen Zeitplan wider:
| launchd Job | Plist | Zeitplan (tatsächlich) |
| --- | --- | --- |
| `com.lotto.update` | `scripts/automation/com.lotto.update.plist` | Mi + Sa, 20:00 Uhr |
| `com.lotto.weekly` | `scripts/automation/com.lotto.weekly.plist` | Di + Fr, 21:00 Uhr |
Logs: `logs/update_stdout.log` (Update+Learning), `logs/stdout.log`
(Tipp-Generierung).
## 5. Bekannte Schwachstellen / offene Punkte
- **`update_from_web.py`** (lotto.de-Scraper) ist als dritter Fallback
implementiert, aber nirgends in der automatisierten Pipeline eingebunden.
- **Utility-Skripte** in `scripts/utils/` (`health_check.py`, `validate_csv.py`,
`verify_draws.py`, `model_evaluator.py`) existieren, sind aber nicht in die
Cron-Automatisierung eingebunden; manuelle Ausführung bei Bedarf.
## 6. Code-Graph
Eine navigierbare Graph-Ansicht aller Module, Klassen und ihrer Beziehungen
liegt unter `graphify-out/`:
- `graphify-out/graph.html` — interaktive Visualisierung (im Browser öffnen)
- `graphify-out/GRAPH_REPORT.md` — God Nodes, Communities, auffällige Verbindungen
- `graphify-out/graph.json` — Rohdaten (GraphRAG-fähig)
Bei größeren strukturellen Änderungen: `/graphify --update` zum
inkrementellen Neuaufbau.
-422
View File
@@ -1,422 +0,0 @@
#!/usr/bin/env python3
"""
AI-GENERATOR MIT MUSTER-GEWICHTUNG
Erweitert den AI-Generator um explizite Muster-Gewichtung (NNMMHH, etc.)
Neue Features:
- Historische Muster-Analyse (NNMMHH, NMMHHH, etc.)
- Muster-Erfolgsquoten berechnen
- Muster-basierte Tip-Optimierung
- Pattern-Scoring für bessere Kombinationen
"""
import pandas as pd
import numpy as np
from collections import Counter, defaultdict
import random
class PatternWeightedAI:
def __init__(self, df):
self.df = df
self.pattern_frequencies = Counter()
self.pattern_success_rates = {}
self.optimal_patterns = []
# Analysiere historische Muster
self._analyze_historical_patterns()
def _analyze_historical_patterns(self):
"""Analysiert alle historischen Muster und deren Erfolgsquoten."""
print("\n🎨 MUSTER-ANALYSE GESTARTET...")
if len(self.df) == 0:
return
total_drawings = len(self.df)
for _, row in self.df.iterrows():
numbers = sorted([row['Z1'], row['Z2'], row['Z3'], row['Z4'], row['Z5'], row['Z6']])
pattern = self._get_pattern(numbers)
self.pattern_frequencies[pattern] += 1
# Berechne Erfolgsquoten
for pattern, count in self.pattern_frequencies.items():
success_rate = count / total_drawings
self.pattern_success_rates[pattern] = success_rate
# Identifiziere optimale Muster (Top 10)
self.optimal_patterns = [
pattern for pattern, _ in self.pattern_frequencies.most_common(10)
]
print("🎯 MUSTER-ERFOLGSQUOTEN:")
print("Pattern Häufigkeit Erfolgsrate Bewertung")
print("-" * 50)
for i, (pattern, count) in enumerate(self.pattern_frequencies.most_common(15)):
success_rate = self.pattern_success_rates[pattern]
if success_rate >= 0.08:
bewertung = "🏆 EXCELLENT"
elif success_rate >= 0.06:
bewertung = "🥇 SEHR GUT"
elif success_rate >= 0.04:
bewertung = "🥈 GUT"
elif success_rate >= 0.02:
bewertung = "🥉 DURCHSCHNITT"
else:
bewertung = "❌ SCHWACH"
print(f"{pattern:<10} {count:>8} {success_rate:>8.3f} {bewertung}")
def _get_pattern(self, numbers):
"""Konvertiert Zahlen zu N/M/H Muster."""
pattern = ""
for num in numbers:
if 1 <= num <= 16:
pattern += "N" # Niedrig
elif 17 <= num <= 32:
pattern += "M" # Mittel
else:
pattern += "H" # Hoch
return pattern
def calculate_pattern_weight(self, numbers):
"""Berechnet Gewichtung basierend auf Muster-Erfolgsquote."""
pattern = self._get_pattern(sorted(numbers))
# Basis-Gewichtung aus historischer Erfolgsquote
base_weight = self.pattern_success_rates.get(pattern, 0.01)
# Bonus für Top-Muster
if pattern in self.optimal_patterns[:5]:
bonus = 0.3
elif pattern in self.optimal_patterns[:10]:
bonus = 0.2
else:
bonus = 0.0
# Penalty für nie aufgetretene Muster
if pattern not in self.pattern_frequencies:
penalty = -0.2
else:
penalty = 0.0
final_weight = base_weight + bonus + penalty
return max(0.01, min(1.0, final_weight)) # Clamp 0.01-1.0
def get_pattern_recommendations(self):
"""Liefert Muster-Empfehlungen für Tip-Generierung."""
recommendations = {}
# Top 5 erfolgreichste Muster
recommendations['top_patterns'] = self.optimal_patterns[:5]
# Muster mit bester Erfolgsquote
if self.pattern_success_rates:
best_pattern = max(self.pattern_success_rates.items(), key=lambda x: x[1])
recommendations['best_pattern'] = best_pattern[0]
recommendations['best_success_rate'] = best_pattern[1]
# Muster-Statistiken
recommendations['total_patterns'] = len(self.pattern_frequencies)
recommendations['pattern_diversity'] = len([p for p, rate in self.pattern_success_rates.items() if rate >= 0.02])
return recommendations
def optimize_combination_for_pattern(self, target_pattern="NNMMHH"):
"""Optimiert Zahlen-Kombination für spezifisches Muster."""
# Definiere Bereiche
ranges = {
'N': list(range(1, 17)), # Niedrig: 1-16
'M': list(range(17, 33)), # Mittel: 17-32
'H': list(range(33, 50)) # Hoch: 33-49
}
# Parse target pattern
pattern_counts = Counter(target_pattern)
needed_n = pattern_counts.get('N', 0)
needed_m = pattern_counts.get('M', 0)
needed_h = pattern_counts.get('H', 0)
selected = []
# Wähle Zahlen für Muster
if needed_n > 0:
n_numbers = random.sample(ranges['N'], min(needed_n, len(ranges['N'])))
selected.extend(n_numbers)
if needed_m > 0:
m_numbers = random.sample(ranges['M'], min(needed_m, len(ranges['M'])))
selected.extend(m_numbers)
if needed_h > 0:
h_numbers = random.sample(ranges['H'], min(needed_h, len(ranges['H'])))
selected.extend(h_numbers)
# Auffüllen falls nötig
while len(selected) < 6:
all_ranges = ranges['N'] + ranges['M'] + ranges['H']
available = [n for n in all_ranges if n not in selected]
if available:
selected.append(random.choice(available))
else:
break
return sorted(selected[:6])
class EnhancedAIGenerator:
"""Erweitert den ursprünglichen AI-Generator um Muster-Gewichtung."""
def __init__(self, data_path):
self.data_path = data_path
self.df = None
self.pattern_ai = None
# Load data
self._load_data()
# Initialize Pattern AI
if self.df is not None and len(self.df) > 0:
self.pattern_ai = PatternWeightedAI(self.df)
def _load_data(self):
"""Lädt Daten."""
try:
self.df = pd.read_csv(self.data_path, sep=';')
if 'datum' in self.df.columns:
self.df['datum'] = pd.to_datetime(self.df['datum'], format='%Y-%m-%d', errors='coerce')
self.df = self.df.sort_values('datum')
print(f"{len(self.df)} Ziehungen geladen")
except Exception as e:
print(f"❌ Fehler beim Laden: {e}")
self.df = pd.DataFrame()
def generate_pattern_optimized_tips(self, num_tips=10):
"""Generiert Tipps mit expliziter Muster-Gewichtung."""
if not self.pattern_ai:
print("❌ Pattern AI nicht verfügbar")
return []
print("\n🎨 PATTERN-OPTIMIERTE TIPP-GENERIERUNG")
print("=" * 60)
# Muster-Empfehlungen abrufen
recommendations = self.pattern_ai.get_pattern_recommendations()
print("🎯 MUSTER-EMPFEHLUNGEN:")
print(f" Bestes Muster: {recommendations.get('best_pattern', 'N/A')} ({recommendations.get('best_success_rate', 0)*100:.1f}%)")
print(f" Top 5 Muster: {', '.join(recommendations.get('top_patterns', [])[:5])}")
print(f" Pattern-Diversität: {recommendations.get('pattern_diversity', 0)} erfolgreiche Muster")
tips = []
print(f"\n🎲 GENERIERE {num_tips} PATTERN-OPTIMIERTE TIPPS:")
print("=" * 80)
print("Nr 6 Pattern-Numbers Pattern Weight Confidence Success-Rate")
print("-" * 80)
# Verschiedene Strategien für verschiedene Tipps
strategies = [
('best', "Bestes Muster"),
('top5', "Top 5 Rotation"),
('balanced', "Ausgewogene Muster"),
('diverse', "Diversifizierte Muster")
]
for i in range(1, num_tips + 1):
strategy = strategies[(i-1) % len(strategies)]
tip = self._generate_pattern_tip(i, strategy[0], recommendations)
tips.append(tip)
# Output
zahlen_str = '-'.join([f"{n:2}" for n in tip['numbers']])
success_rate = self.pattern_ai.pattern_success_rates.get(tip['pattern'], 0)
print(f"{i:2} {zahlen_str} {tip['pattern']:<8} {tip['pattern_weight']:.3f} {tip['confidence']:.3f} {success_rate:.3f}")
# Zusammenfassung
self._print_pattern_summary(tips)
return tips
def _generate_pattern_tip(self, tip_number, strategy, recommendations):
"""Generiert einzelnen pattern-optimierten Tipp."""
# Seed für Konsistenz
random.seed(42 + tip_number)
if strategy == 'best':
# Nutze bestes Muster
target_pattern = recommendations.get('best_pattern', 'NNMMHH')
elif strategy == 'top5':
# Rotiere durch Top 5
top_patterns = recommendations.get('top_patterns', ['NNMMHH'])
target_pattern = top_patterns[(tip_number - 1) % len(top_patterns)]
elif strategy == 'balanced':
# Ausgewogene beliebte Muster
balanced_patterns = ['NNMMHH', 'NMMHHH', 'NMMMHH', 'NNMHHH']
target_pattern = balanced_patterns[(tip_number - 1) % len(balanced_patterns)]
else: # diverse
# Diversifizierte Muster für Abdeckung
diverse_patterns = ['NNMMHH', 'MMHHHH', 'NNNNMM', 'NMHHHH', 'NNNMMH']
target_pattern = diverse_patterns[(tip_number - 1) % len(diverse_patterns)]
# Generiere Kombination für Ziel-Muster
numbers = self.pattern_ai.optimize_combination_for_pattern(target_pattern)
# Validiere und korrigiere falls nötig
actual_pattern = self.pattern_ai._get_pattern(numbers)
# Pattern Weight berechnen
pattern_weight = self.pattern_ai.calculate_pattern_weight(numbers)
# Confidence basierend auf Pattern Success Rate
success_rate = self.pattern_ai.pattern_success_rates.get(actual_pattern, 0.01)
confidence = pattern_weight * 0.6 + success_rate * 0.4
# Superzahl
superzahl = self._get_pattern_superzahl(tip_number)
return {
'tip_number': tip_number,
'numbers': numbers,
'pattern': actual_pattern,
'target_pattern': target_pattern,
'pattern_weight': pattern_weight,
'confidence': confidence,
'success_rate': success_rate,
'superzahl': superzahl,
'strategy': strategy
}
def _get_pattern_superzahl(self, tip_number):
"""Pattern-optimierte Superzahl."""
# Basis häufigste Superzahlen
frequent_sz = [7, 6, 3, 2, 0, 1, 4, 5, 8, 9]
# Tip-spezifische Auswahl
return frequent_sz[tip_number % len(frequent_sz)]
def _print_pattern_summary(self, tips):
"""Druckt Pattern-Zusammenfassung."""
print(f"\n🏆 PATTERN-OPTIMIERUNG ZUSAMMENFASSUNG:")
print("=" * 50)
# Pattern-Verteilung
pattern_dist = Counter([tip['pattern'] for tip in tips])
print("📊 PATTERN-VERTEILUNG:")
for pattern, count in pattern_dist.most_common():
avg_success = np.mean([self.pattern_ai.pattern_success_rates.get(pattern, 0)] * count)
print(f" {pattern}: {count}x (Ø Success: {avg_success:.3f})")
# Durchschnittliche Metriken
avg_weight = np.mean([tip['pattern_weight'] for tip in tips])
avg_confidence = np.mean([tip['confidence'] for tip in tips])
avg_success = np.mean([tip['success_rate'] for tip in tips])
print(f"\n📈 DURCHSCHNITTLICHE METRIKEN:")
print(f" Pattern-Weight: {avg_weight:.3f}")
print(f" Confidence: {avg_confidence:.3f}")
print(f" Success-Rate: {avg_success:.3f}")
# Beste Tipps
best_tip = max(tips, key=lambda x: x['confidence'])
print(f"\n⭐ BESTER PATTERN-TIPP:")
zahlen_str = '-'.join([f"{n:2}" for n in best_tip['numbers']])
print(f" Tipp {best_tip['tip_number']}: {zahlen_str}")
print(f" Pattern: {best_tip['pattern']} (Weight: {best_tip['pattern_weight']:.3f})")
print(f" Success-Rate: {best_tip['success_rate']:.3f}")
def demonstrate_pattern_weighting():
"""Demonstriert Pattern-Gewichtung mit Beispiel-Daten."""
print("🎨 PATTERN-GEWICHTUNG DEMONSTRATION")
print("=" * 50)
# Beispiel-Daten erstellen
sample_data = []
patterns_to_simulate = ['NNMMHH', 'NMMHHH', 'NMMMHH', 'NNMHHH', 'MMHHHH']
for i in range(100):
# Simuliere Ziehungen mit verschiedenen Mustern
pattern = random.choice(patterns_to_simulate)
numbers = []
for char in pattern:
if char == 'N':
numbers.append(random.randint(1, 16))
elif char == 'M':
numbers.append(random.randint(17, 32))
else: # 'H'
numbers.append(random.randint(33, 49))
# Sicherstellen dass alle Zahlen einzigartig sind
numbers = sorted(list(set(numbers)))
while len(numbers) < 6:
missing_range = random.choice(['N', 'M', 'H'])
if missing_range == 'N':
new_num = random.randint(1, 16)
elif missing_range == 'M':
new_num = random.randint(17, 32)
else:
new_num = random.randint(33, 49)
if new_num not in numbers:
numbers.append(new_num)
numbers.sort()
numbers = numbers[:6]
sample_data.append({
'Z1': numbers[0], 'Z2': numbers[1], 'Z3': numbers[2],
'Z4': numbers[3], 'Z5': numbers[4], 'Z6': numbers[5],
'SZ': random.randint(0, 9)
})
# DataFrame erstellen
df_sample = pd.DataFrame(sample_data)
# Enhanced AI Generator mit Pattern-Gewichtung
print("\n🚀 STARTE PATTERN-GEWICHTETEN GENERATOR...")
# Simuliere Generator
generator = EnhancedAIGenerator.__new__(EnhancedAIGenerator)
generator.df = df_sample
generator.pattern_ai = PatternWeightedAI(df_sample)
# Generiere pattern-optimierte Tipps
pattern_tips = generator.generate_pattern_optimized_tips(8)
print(f"\n💡 PATTERN-GEWICHTUNG ERKLÄRT:")
print("=" * 40)
print("🎯 Jede Kombination wird bewertet basierend auf:")
print(" 1. Historischer Erfolgsquote des Musters")
print(" 2. Bonus für Top-5 erfolgreichste Muster")
print(" 3. Penalty für nie aufgetretene Muster")
print(" 4. Kombinierte Pattern-Weight für finalen Score")
return pattern_tips
def main():
"""Hauptfunktion für Pattern-gewichteten Generator."""
data_path = "/Users/sebastianfrohlich/Library/Mobile Documents/com~apple~CloudDocs/Jupyter Notebooks/AlleLottozahlen.csv"
try:
# Versuche mit echten Daten
generator = EnhancedAIGenerator(data_path)
if generator.pattern_ai and len(generator.df) > 0:
pattern_tips = generator.generate_pattern_optimized_tips(10)
else:
print("🔄 Echte Daten nicht verfügbar - verwende Demo...")
pattern_tips = demonstrate_pattern_weighting()
except Exception as e:
print(f"⚠️ Fallback zu Demo-Modus: {e}")
pattern_tips = demonstrate_pattern_weighting()
if __name__ == "__main__":
main()
+4 -1
View File
@@ -125,7 +125,10 @@ class AutoUpdateAndLearn:
try:
updater = LottoAPIUpdater(self.data_file)
success = updater.update(api_name='github', create_backup=True)
# 'all': Lottoland zuerst (liefert die neueste Ziehung meist noch am
# Ziehungstag), GitHub-Archiv als Quelle für die Historie/Fallback -
# das GitHub-Archiv allein hinkt wiederholt tagelang hinterher.
success = updater.update(api_name='all', create_backup=True)
if success:
print(" ✅ Daten erfolgreich aktualisiert")
@@ -75,6 +75,11 @@ class UltimateAIMLHybridGenerator:
Ultimate Generator - OPTIMIZED VERSION
"""
# Empirisch belegte "griffige" Einzelzahlen, die Spieler überproportional oft frei
# wählen (Quelle: Analysen realer Tippscheine, z.B. frz. 6aus49 über 25 Jahre:
# populärste Zahlen 5,7,9,11,12,13). Unabhängig vom Geburtstags-Bias (<=31).
POPULAR_PLAYER_PICKS = {5, 7, 9, 11, 12, 13}
def __init__(self, data_path, fast_mode=True):
self.data_path = data_path
self.df = None
@@ -406,7 +411,7 @@ class UltimateAIMLHybridGenerator:
"""High-EV: 23 Zahlen >31, max. 1 Lucky Number, soft Consecutive-Vermeidung."""
random.seed(42 + tip_number * 41)
lucky_numbers = {3, 7, 9, 11, 13, 17, 19, 21, 23}
lucky_numbers = UltimateAIMLHybridGenerator.POPULAR_PLAYER_PICKS
above_31_target = 2 + (tip_number % 2) # wechselt zwischen 2 und 3
selected = []
@@ -628,49 +633,70 @@ class UltimateAIMLHybridGenerator:
return (distance_score * 0.4 + range_score * 0.4 + balance_score * 0.2)
def _get_smart_superzahl(self, tip_number):
"""Intelligente Superzahl."""
base_sz = [7, 6, 3, 2, 0, 1, 4, 5, 8, 9]
try:
if 'SZ' in self.df.columns and len(self.df) > 10:
recent_sz = self.df['SZ'].tail(30).dropna()
if len(recent_sz) > 0:
sz_freq = Counter(recent_sz)
top_sz = [int(sz) for sz, _ in sz_freq.most_common(7) if 0 <= sz <= 9]
if top_sz:
base_sz = top_sz + [7, 6, 3]
except:
pass
if tip_number <= 3:
sz = base_sz[0]
else:
sz = base_sz[tip_number % len(base_sz)]
return int(sz) if 0 <= int(sz) <= 9 else 7
"""
EV-optimierte Superzahl: bevorzugt Ziffern, die Spieler erfahrungsgemäß
seltener frei wählen (0 wirkt nicht wie eine "eigene" Zahl; 7/3 gelten als
klassische Glückszahlen und werden überproportional gewählt). Historische
Ziehungshäufigkeit fließt bewusst NICHT mehr ein - die SZ wird pro Ziehung
unabhängig und gleichverteilt (0-9) gezogen, "häufig gezogen in letzten 30
Ziehungen" ist reines Rauschen ohne Vorhersagewert.
"""
ev_order = [0, 9, 8, 4, 2, 6, 1, 5, 3, 7] # unpopulärste zuerst
return ev_order[tip_number % len(ev_order)]
@staticmethod
def _calculate_popularity_score(numbers):
"""
Schätzt den Erwartungswert-Vorteil durch Vermeidung populärer Zahlenkombinationen.
Höher = unpopulärer = höherer Gewinnanteil bei einem Treffer.
Basis: Spieler bevorzugen Geburtstagszahlen (1-31), Glückszahlen und Zahlenfolgen.
Höher = unpopulärer bei Mitspielern = höherer Gewinnanteil bei einem Treffer
(Hit-Wahrscheinlichkeit selbst ist bei i.i.d. Ziehungen nicht beeinflussbar).
Basis: dokumentierte Spielerverhalten-Biases (Henze/Riedwyl-artige Analysen
realer Tippscheine): Geburtstagszahlen (<=31), einzelne "griffige" Zahlen,
Zahlenfolgen/arithmetische Muster (z.B. 5-10-15-20-25-30) und "zufällig
aussehende" ausgeglichene Odd/Even-Splits werden von Menschen
überproportional oft gewählt - jede einzelne Kombination ist aber exakt
gleich wahrscheinlich, unabhängig von diesen Eigenschaften.
Hinweis: eine "Summe nahe am Mittel"-Komponente wurde bewusst NICHT
aufgenommen - sie widerspricht sich mit der Muster-Erkennung, da gerade
die meistgespielten sequenziellen Kombinationen (z.B. 1-2-3-4-5-6) durch
ihre enge Zahlen-Clusterung zugleich eine extreme Summe erzeugen. Ohne
Trennung von "Summe extrem durch Streuung" vs. "Summe extrem durch engen
Cluster" hätte dieses Merkmal genau die falschesten Kombinationen
aufgewertet.
"""
n = len(numbers)
sorted_nums = sorted(numbers)
# Anteil Zahlen > 31 (Geburtstags-Range vermeiden)
# 1) Geburtstags-Range (1-31) meiden
above_31_ratio = sum(1 for x in numbers if x > 31) / n
# Aufeinanderfolgende Zahlen vermeiden (visuelle Muster)
consecutive_pairs = sum(1 for i in range(n - 1) if sorted_nums[i + 1] - sorted_nums[i] == 1)
consecutive_ratio = consecutive_pairs / (n - 1) if n > 1 else 0
# 2) Empirisch belegte populäre Einzelzahlen meiden
popular_ratio = sum(
1 for x in numbers
if x in UltimateAIMLHybridGenerator.POPULAR_PLAYER_PICKS
) / n
# Häufig gespielte "Glückszahlen" vermeiden
lucky_numbers = {3, 7, 9, 11, 13, 17, 19, 21, 23}
lucky_ratio = sum(1 for x in numbers if x in lucky_numbers) / n
# 3) Muster/Zahlenfolgen meiden: direkte Nachbarn UND allgemeine
# arithmetische Folgen (konstante Schrittweite, z.B. 5-10-15-20-25-30
# zählt zu den meistgespielten Kombinationen überhaupt)
diffs = [sorted_nums[i + 1] - sorted_nums[i] for i in range(n - 1)]
small_step_ratio = sum(1 for d in diffs if d <= 5) / (n - 1) if diffs else 0
is_perfect_progression = len(diffs) > 1 and len(set(diffs)) == 1
pattern_penalty = small_step_ratio * (0.6 if not is_perfect_progression else 1.0)
score = above_31_ratio * 0.5 + (1 - consecutive_ratio) * 0.3 + (1 - lucky_ratio) * 0.2
# 4) Odd/Even-Split: Menschen bevorzugen "ausgeglichen aussehende" 3-3
# Splits, obwohl jede einzelne Kombination gleich wahrscheinlich ist
even_count = sum(1 for x in numbers if x % 2 == 0)
split_extremity = abs(even_count - 3) / 3 # 0.0 bei 3-3, 1.0 bei 6-0/0-6
score = (
above_31_ratio * 0.30
+ (1 - popular_ratio) * 0.20
+ (1 - pattern_penalty) * 0.30
+ split_extremity * 0.20
)
return min(max(score, 0.0), 1.0)
def _calculate_quality_score(self, numbers, ai_predictions, pattern_weight):
@@ -702,12 +728,16 @@ class UltimateAIMLHybridGenerator:
else:
recency_quality = 0.5 # neutral wenn noch nicht berechnet
# Popularity/EV dominiert bewusst: AI-Score, Pattern und Recency sagen nichts
# über die (unbeeinflussbare) Trefferwahrscheinlichkeit aus - Recency/Pattern
# folgen zudem Heuristiken, die auch andere Systemspieler nutzen und damit die
# Popularity eher untergraben statt sie zu unterstützen.
quality = (
ai_quality * 0.30
+ pattern_quality * 0.20
ai_quality * 0.15
+ pattern_quality * 0.10
+ diversity_quality * 0.15
+ popularity_quality * 0.20
+ recency_quality * 0.15
+ popularity_quality * 0.50
+ recency_quality * 0.10
)
return min(quality, 1.0)
-842
View File
@@ -1,842 +0,0 @@
#!/usr/bin/env python3
"""
SUPER-LOTTO 6AUS49 GENERATOR
Mit vollständigen historischen Daten und nie gezogenen Kombinationen
Nutzt Sebastian's komplette Datenbasis:
- AlleLottozahlen.csv: Alle historischen Ziehungen mit Multi-Trend-Analyse
- Fehlende_Lotto_Kombinationen.csv: Alle nie gezogenen Kombinationen
- Maximale Optimierung durch vollständige Datenbasis
"""
import pandas as pd
import numpy as np
import random
from collections import Counter, defaultdict
import datetime
import pickle
import os
class SuperLotto6aus49Generator:
def __init__(self):
# Pfade zu Sebastian's Daten
self.base_path = "/Users/sebastianfrohlich/Library/Mobile Documents/com~apple~CloudDocs/Jupyter Notebooks"
self.historical_data_path = f"{self.base_path}/AlleLottozahlen.csv"
self.unused_combinations_path = f"{self.base_path}/Fehlende_Lotto_Kombinationen.csv"
# Daten-Container
self.df_historical = None
self.df_unused = None
self.drawn_combinations = set()
# Basis-Analysen
self.number_frequencies = Counter()
self.position_frequencies = defaultdict(Counter)
self.pattern_frequencies = Counter()
self.supernumber_frequencies = Counter()
self.weekday_frequencies = Counter()
# Multi-Trend-Analysen
self.number_sequences = defaultdict(list)
self.momentum_scores = {}
self.trend_predictions = {}
self.sequential_dependencies = defaultdict(lambda: defaultdict(int))
self.hot_numbers = []
self.warm_numbers = []
self.cold_numbers = []
# Unused Combinations Intelligence
self.unused_combinations_sample = []
self.unused_patterns = Counter()
self.unused_by_ranges = {'N': [], 'M': [], 'H': []}
# Cache für Performance
self.cache_file = f"{self.base_path}/super_lotto_cache.pkl"
print("🚀 SUPER-LOTTO 6AUS49 GENERATOR")
print("=" * 50)
print("📊 Lade vollständige Sebastian's Datenbasis...")
# Lade und analysiere alle Daten
self.load_all_data()
def load_all_data(self):
"""Lädt alle verfügbaren Daten und führt komplette Analyse durch."""
# 1. Historische Ziehungen laden
print("📈 Lade historische Ziehungen...")
self._load_historical_data()
# 2. Nie gezogene Kombinationen laden
print("🎯 Lade nie gezogene Kombinationen...")
self._load_unused_combinations()
# 3. Basis-Analysen
print("🔍 Führe Basis-Analysen durch...")
self._perform_basic_analysis()
# 4. Multi-Trend-Analysen
print("📊 Multi-Trend-Analyse...")
self._perform_momentum_analysis()
self._perform_sequential_analysis()
# 5. Unused Combinations Intelligence
print("🎲 Analysiere nie gezogene Kombinationen...")
self._analyze_unused_combinations()
print("✅ Komplette Super-Analyse abgeschlossen!")
self._print_super_analysis_summary()
def _load_historical_data(self):
"""Lädt historische Lotto-Daten."""
try:
# Sebastian's Format: tag;datum;Z1;Z2;Z3;Z4;Z5;Z6;SZ
self.df_historical = pd.read_csv(self.historical_data_path, sep=';')
# Datum konvertieren (verschiedene Formate unterstützen)
date_formats = ['%Y-%m-%d', '%d.%m.%Y', '%d/%m/%Y']
for date_format in date_formats:
try:
self.df_historical['datum'] = pd.to_datetime(self.df_historical['datum'], format=date_format)
break
except:
continue
# Sortiere chronologisch (älteste zuerst für Trend-Analyse)
self.df_historical = self.df_historical.sort_values('datum')
print(f"{len(self.df_historical)} historische Ziehungen geladen")
print(f"📅 Zeitraum: {self.df_historical['datum'].min()} bis {self.df_historical['datum'].max()}")
except Exception as e:
print(f"❌ Fehler beim Laden historischer Daten: {e}")
return False
return True
def _load_unused_combinations(self):
"""Lädt alle nie gezogenen Kombinationen."""
try:
# Große Datei in Chunks laden für bessere Performance
chunk_size = 100000
chunks = []
print("⏳ Lade nie gezogene Kombinationen (große Datei)...")
for chunk in pd.read_csv(self.unused_combinations_path, sep=';', chunksize=chunk_size):
chunks.append(chunk)
if len(chunks) % 50 == 0:
print(f" 📊 {len(chunks) * chunk_size:,} Kombinationen geladen...")
self.df_unused = pd.concat(chunks, ignore_index=True)
print(f"{len(self.df_unused):,} nie gezogene Kombinationen verfügbar!")
print(f"💡 Das sind {len(self.df_unused)/13983816*100:.1f}% aller möglichen Kombinationen")
# Sample für Performance (arbeiten mit repräsentativem Subset)
sample_size = min(500000, len(self.df_unused)) # Max 500k für Performance
self.unused_combinations_sample = self.df_unused.sample(n=sample_size, random_state=42)
print(f"🎯 Arbeite mit {len(self.unused_combinations_sample):,} Sample-Kombinationen")
except Exception as e:
print(f"❌ Fehler beim Laden nie gezogener Kombinationen: {e}")
return False
return True
def _perform_basic_analysis(self):
"""Basis-Analyse der historischen Daten."""
for _, row in self.df_historical.iterrows():
# Gezogene Kombinationen
numbers = [row['Z1'], row['Z2'], row['Z3'], row['Z4'], row['Z5'], row['Z6']]
combo = tuple(sorted(numbers))
self.drawn_combinations.add(combo)
# Zahlenfrequenzen
for num in numbers:
self.number_frequencies[num] += 1
# Positionsfrequenzen
sorted_numbers = sorted(numbers)
for i, num in enumerate(sorted_numbers):
self.position_frequencies[f'pos_{i+1}'][num] += 1
# Muster-Analyse
pattern = self._get_pattern(sorted_numbers)
self.pattern_frequencies[pattern] += 1
# Superzahl
if 'SZ' in row and pd.notna(row['SZ']):
self.supernumber_frequencies[int(row['SZ'])] += 1
# Wochentag-Analyse
if 'tag' in row:
weekday = row['tag'].replace('.', '').replace(';', '')
self.weekday_frequencies[weekday] += 1
def _perform_momentum_analysis(self, window_size=20):
"""Erweiterte Momentum-Analyse mit größerem Fenster."""
print(f"🔥 Super-Momentum-Analyse (Fenster: {window_size})")
# Zahlensequenzen aufbauen
for number in range(1, 50):
sequence = []
for _, row in self.df_historical.iterrows():
drawn_numbers = [row['Z1'], row['Z2'], row['Z3'], row['Z4'], row['Z5'], row['Z6']]
sequence.append(1 if number in drawn_numbers else 0)
self.number_sequences[number] = sequence
# Super-Momentum-Scores
for number in range(1, 50):
recent_sequence = self.number_sequences[number][-window_size:]
hit_rate = sum(recent_sequence) / len(recent_sequence)
trend_score = self._calculate_trend_score(recent_sequence)
recency_score = self._calculate_recency_score(recent_sequence)
acceleration_score = self._calculate_acceleration_score(recent_sequence)
# Super-Momentum mit Beschleunigung
momentum_score = (hit_rate * 0.35) + (trend_score * 0.3) + \
(recency_score * 0.2) + (acceleration_score * 0.15)
self.momentum_scores[number] = {
'hit_rate': hit_rate,
'trend_score': trend_score,
'recency_score': recency_score,
'acceleration_score': acceleration_score,
'momentum_score': momentum_score,
'status': self._get_momentum_status(momentum_score)
}
# Kategorisierung
sorted_momentum = sorted(self.momentum_scores.items(),
key=lambda x: x[1]['momentum_score'], reverse=True)
self.hot_numbers = [num for num, data in sorted_momentum[:15]
if data['momentum_score'] > 0.3]
self.warm_numbers = [num for num, data in sorted_momentum[15:30]
if 0.2 <= data['momentum_score'] <= 0.3]
self.cold_numbers = [num for num, data in sorted_momentum[30:]
if data['momentum_score'] < 0.2]
print(f"🔥 {len(self.hot_numbers)} super-heiße Zahlen")
print(f"🌡️ {len(self.warm_numbers)} warme Zahlen")
print(f"🧊 {len(self.cold_numbers)} kalte Zahlen")
def _calculate_acceleration_score(self, sequence):
"""Berechnet Beschleunigung der Treffer (NEU!)."""
if len(sequence) < 4:
return 0
# Teile Sequenz in zwei Hälften
mid = len(sequence) // 2
first_half_rate = sum(sequence[:mid]) / mid
second_half_rate = sum(sequence[mid:]) / (len(sequence) - mid)
# Beschleunigung = Verbesserung in zweiter Hälfte
acceleration = second_half_rate - first_half_rate
return max(0, acceleration) # Nur positive Beschleunigung
def _perform_sequential_analysis(self):
"""Sequenzielle Abhängigkeiten zwischen Ziehungen."""
print("🔗 Super-Sequential-Analyse")
for i in range(3, len(self.df_historical)):
current_numbers = set([self.df_historical.iloc[i]['Z1'], self.df_historical.iloc[i]['Z2'],
self.df_historical.iloc[i]['Z3'], self.df_historical.iloc[i]['Z4'],
self.df_historical.iloc[i]['Z5'], self.df_historical.iloc[i]['Z6']])
for j in range(1, 4): # 3 Ziehungen zurück
prev_numbers = set([self.df_historical.iloc[i-j]['Z1'], self.df_historical.iloc[i-j]['Z2'],
self.df_historical.iloc[i-j]['Z3'], self.df_historical.iloc[i-j]['Z4'],
self.df_historical.iloc[i-j]['Z5'], self.df_historical.iloc[i-j]['Z6']])
for prev_num in prev_numbers:
for curr_num in current_numbers:
self.sequential_dependencies[f"lag_{j}"][f"{prev_num}_{curr_num}"] += 1
def _analyze_unused_combinations(self):
"""Analysiert nie gezogene Kombinationen für Intelligence."""
print("🎯 Super-Intelligence für nie gezogene Kombinationen")
# Muster der nie gezogenen Kombinationen
for _, row in self.unused_combinations_sample.iterrows():
numbers = [row['Z1'], row['Z2'], row['Z3'], row['Z4'], row['Z5'], row['Z6']]
pattern = self._get_pattern(numbers)
self.unused_patterns[pattern] += 1
# Verteilung nach N/M/H-Bereichen
for num in numbers:
if 1 <= num <= 16:
self.unused_by_ranges['N'].append(num)
elif 17 <= num <= 32:
self.unused_by_ranges['M'].append(num)
else:
self.unused_by_ranges['H'].append(num)
print(f"📊 Nie gezogene Muster analysiert:")
for pattern, count in self.unused_patterns.most_common(5):
percentage = (count / len(self.unused_combinations_sample)) * 100
print(f" {pattern}: {percentage:.1f}%")
def generate_super_combination(self):
"""Generiert Super-Kombination mit kompletter Intelligence."""
max_attempts = 2000
for attempt in range(max_attempts):
numbers = []
# Super-Strategie:
# 40% aus nie gezogenen hot trends
# 30% aus momentum analysis
# 20% aus sequential dependencies
# 10% random balance
# 2-3 Zahlen aus hot numbers mit unused combination bias
hot_unused_candidates = []
for combo_idx in range(min(10000, len(self.unused_combinations_sample))):
combo = self.unused_combinations_sample.iloc[combo_idx]
combo_numbers = [combo['Z1'], combo['Z2'], combo['Z3'], combo['Z4'], combo['Z5'], combo['Z6']]
hot_in_combo = [n for n in combo_numbers if n in self.hot_numbers[:10]]
if len(hot_in_combo) >= 2:
hot_unused_candidates.extend(hot_in_combo)
if hot_unused_candidates:
hot_picks = random.sample(list(set(hot_unused_candidates)), min(3, len(set(hot_unused_candidates))))
numbers.extend(hot_picks)
# 2 Zahlen aus Trend-Predictions
trend_candidates = [num for num, data in sorted(self.momentum_scores.items(),
key=lambda x: x[1]['momentum_score'], reverse=True)[:12]]
remaining_trend = [n for n in trend_candidates if n not in numbers]
if len(remaining_trend) >= 2:
trend_picks = random.sample(remaining_trend, 2)
numbers.extend(trend_picks)
# 1 Zahl für Balance
remaining_slots = 6 - len(numbers)
if remaining_slots > 0:
balance_candidates = self.warm_numbers + self.cold_numbers[:8]
remaining_balance = [n for n in balance_candidates if n not in numbers]
if remaining_balance:
balance_picks = random.sample(remaining_balance, min(remaining_slots, len(remaining_balance)))
numbers.extend(balance_picks)
# Auffüllen falls nötig
while len(numbers) < 6:
available = [n for n in range(1, 50) if n not in numbers]
additional = random.choice(available)
numbers.append(additional)
numbers = sorted(numbers[:6])
# Super-Validierung
if self._validate_super_combination(numbers):
return numbers
# Fallback
return self._generate_super_fallback()
def _validate_super_combination(self, numbers):
"""Super-Validierung mit unused combinations check."""
combo_tuple = tuple(sorted(numbers))
# Prüfe ob in historischen Daten (sollte nicht sein)
if combo_tuple in self.drawn_combinations:
return False
# Prüfe ob in unused combinations (sollte sein!)
unused_check = False
sample_size = min(50000, len(self.unused_combinations_sample))
for i in range(sample_size):
row = self.unused_combinations_sample.iloc[i]
unused_combo = tuple(sorted([row['Z1'], row['Z2'], row['Z3'], row['Z4'], row['Z5'], row['Z6']]))
if combo_tuple == unused_combo:
unused_check = True
break
# Basis-Validierungen
if len(set(numbers)) != 6:
return False
distances = [numbers[i+1] - numbers[i] for i in range(5)]
if min(distances) < 1 or max(distances) > 18:
return False
even_count = sum(1 for n in numbers if n % 2 == 0)
if even_count == 0 or even_count == 6:
return False
total = sum(numbers)
if total < 90 or total > 200:
return False
# Super-Check: Mindestens 1 hot number
hot_count = sum(1 for n in numbers if n in self.hot_numbers)
if hot_count == 0:
return False
return True
def _generate_super_fallback(self):
"""Super-Fallback mit unused combinations."""
# Wähle zufällig aus unused combinations
random_idx = random.randint(0, len(self.unused_combinations_sample) - 1)
row = self.unused_combinations_sample.iloc[random_idx]
return sorted([row['Z1'], row['Z2'], row['Z3'], row['Z4'], row['Z5'], row['Z6']])
def get_super_supernumber(self):
"""Super-optimierte Superzahl."""
if not self.supernumber_frequencies:
return random.randint(0, 9)
# Erweiterte Trend-Analyse für Superzahl
recent_data = self.df_historical.tail(15)
trend_scores = {}
for sz in range(0, 10):
recent_count = (recent_data['SZ'] == sz).sum() if 'SZ' in recent_data.columns else 0
total_count = self.supernumber_frequencies[sz]
# Multi-Faktor Score
trend_score = (recent_count / len(recent_data)) * 0.5 + \
(total_count / len(self.df_historical)) * 0.3 + \
(sz % 2) * 0.1 + \
(1 if sz in [0, 3, 7] else 0) * 0.1 # Beliebte Zahlen-Bonus
trend_scores[sz] = trend_score
# Gewichtete Auswahl
candidates = list(trend_scores.keys())
weights = list(trend_scores.values())
return random.choices(candidates, weights=weights)[0]
def generate_super_tips(self, num_tips=10):
"""Generiert Super-Tipps mit kompletter Intelligence."""
print(f"\n🚀 SUPER-TIPP-GENERIERUNG")
print("=" * 50)
print(f"🎯 Nutzt KOMPLETTE Sebastian's Datenbasis:")
print(f" 📈 {len(self.df_historical)} historische Ziehungen")
print(f" 🎲 {len(self.df_unused):,} nie gezogene Kombinationen")
print(f" 🔥 Super-Momentum-Analyse")
print(f" 🧠 Unused-Combinations-Intelligence")
generated_tips = []
strategy_stats = {
'unused_combo_hits': 0,
'hot_number_avg': 0,
'momentum_scores': []
}
print(f"\n🎲 GENERIERE {num_tips} SUPER-TIPPS:")
print("=" * 70)
print(f"{'Nr':<3} {'6 Super-Zahlen':<25} {'SZ':<3} {'🔥':<3} {'🎯':<3} {'Status'}")
print("-" * 70)
attempts = 0
max_attempts = num_tips * 100
while len(generated_tips) < num_tips and attempts < max_attempts:
attempts += 1
combination = self.generate_super_combination()
if combination and tuple(combination) not in [tuple(tip['zahlen']) for tip in generated_tips]:
# Analyse der Kombination
hot_count = sum(1 for n in combination if n in self.hot_numbers)
momentum_avg = np.mean([self.momentum_scores[n]['momentum_score'] for n in combination])
# Check ob in unused combinations
combo_tuple = tuple(sorted(combination))
unused_hit = False
for i in range(min(10000, len(self.unused_combinations_sample))):
row = self.unused_combinations_sample.iloc[i]
if combo_tuple == tuple(sorted([row['Z1'], row['Z2'], row['Z3'], row['Z4'], row['Z5'], row['Z6']])):
unused_hit = True
strategy_stats['unused_combo_hits'] += 1
break
superzahl = self.get_super_supernumber()
pattern = self._get_pattern(combination)
tip = {
'tipp_nr': len(generated_tips) + 1,
'zahlen': combination,
'z1': combination[0], 'z2': combination[1], 'z3': combination[2],
'z4': combination[3], 'z5': combination[4], 'z6': combination[5],
'superzahl': superzahl,
'hot_count': hot_count,
'momentum_avg': momentum_avg,
'unused_hit': unused_hit,
'pattern': pattern,
'super_score': hot_count * 0.4 + momentum_avg * 0.6
}
generated_tips.append(tip)
strategy_stats['hot_number_avg'] += hot_count
strategy_stats['momentum_scores'].append(momentum_avg)
# Status
status = "🎯 UNUSED!" if unused_hit else "📊 TREND"
zahlen_str = f"{combination[0]:2}-{combination[1]:2}-{combination[2]:2}-{combination[3]:2}-{combination[4]:2}-{combination[5]:2}"
print(f"{len(generated_tips):2}. {zahlen_str:<25} {superzahl:<3} {hot_count:<3} {momentum_avg:.2f} {status}")
# Super-Zusammenfassung
self._print_super_summary(generated_tips, strategy_stats, attempts)
# Export
self._export_super_tips(generated_tips)
return generated_tips
def _print_super_summary(self, tips, stats, attempts):
"""Super-Zusammenfassung."""
print(f"\n🏆 SUPER-LOTTO ZUSAMMENFASSUNG:")
print("=" * 45)
print(f"{len(tips)} Super-Tipps generiert")
print(f"🎯 {stats['unused_combo_hits']}/{len(tips)} aus nie gezogenen Kombinationen")
print(f"🔥 Ø {stats['hot_number_avg']/len(tips):.1f} heiße Zahlen pro Tipp")
print(f"📊 Ø Momentum-Score: {np.mean(stats['momentum_scores']):.3f}")
print(f"⚡ Erfolgsrate: {len(tips)/attempts*100:.1f}%")
# Super-Intelligence Insights
print(f"\n💡 SUPER-INTELLIGENCE INSIGHTS:")
print("=" * 40)
# Top Momentum-Zahlen
top_momentum = sorted(self.momentum_scores.items(),
key=lambda x: x[1]['momentum_score'], reverse=True)[:8]
print(f"🔥 TOP MOMENTUM-ZAHLEN:")
for i, (num, data) in enumerate(top_momentum):
print(f" {i+1}. Zahl {num:2}: {data['momentum_score']:.3f} {data['status']}")
# Pattern-Verteilung nie gezogener Kombinationen
print(f"\n🎨 NIE GEZOGENE MUSTER (häufigste):")
for pattern, count in self.unused_patterns.most_common(3):
percentage = (count / len(self.unused_combinations_sample)) * 100
print(f" {pattern}: {percentage:.1f}% nie gezogen")
# Super-Empfehlungen
print(f"\n🚀 SUPER-EMPFEHLUNGEN:")
print(f" 🎯 {stats['unused_combo_hits']} Tipps stammen aus nie gezogenen Kombinationen")
print(f" 🔥 Fokus auf Top-{len(self.hot_numbers)} Momentum-Zahlen")
print(f" 📊 Nutzt {len(self.df_historical)} historische Ziehungen für Trends")
print(f" 💎 Maximale Optimierung durch {len(self.df_unused):,} nie gezogene Kombinationen!")
def _export_super_tips(self, tips):
"""Exportiert Super-Tipps."""
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
output_file = f"{self.base_path}/super_lotto_tipps_{timestamp}.csv"
# Erweiterte Export-Daten
export_data = []
for tip in tips:
tip_data = tip.copy()
tip_data['momentum_scores'] = [self.momentum_scores[n]['momentum_score'] for n in tip['zahlen']]
tip_data['individual_status'] = [self.momentum_scores[n]['status'] for n in tip['zahlen']]
export_data.append(tip_data)
df_export = pd.DataFrame(export_data)
df_export.to_csv(output_file, sep=';', index=False)
print(f"\n💾 SUPER-EXPORT:")
print("=" * 25)
print(f"✅ Super-Tipps gespeichert: super_lotto_tipps_{timestamp}.csv")
print(f"🚀 Basiert auf kompletter Sebastian's Datenbasis")
print(f"📊 Mit nie gezogenen Kombinationen optimiert")
def _print_super_analysis_summary(self):
"""Super-Analyse Zusammenfassung."""
print(f"\n📈 SUPER-ANALYSE ZUSAMMENFASSUNG:")
print("=" * 50)
# Datenbasis-Info
print(f"📊 DATENBASIS:")
print(f" 📈 Historische Ziehungen: {len(self.df_historical):,}")
print(f" 🎲 Nie gezogene Kombinationen: {len(self.df_unused):,}")
print(f" 📅 Zeitraum: {len(self.df_historical)} Ziehungen")
# Top Zahlen mit Super-Intelligence
print(f"\n🔥 SUPER-HOT ZAHLEN:")
for i, num in enumerate(self.hot_numbers[:8]):
momentum_data = self.momentum_scores[num]
freq = self.number_frequencies[num]
print(f" {i+1}. Zahl {num:2}: Score {momentum_data['momentum_score']:.3f} "
f"({freq}x gezogen) {momentum_data['status']}")
# Nie gezogene Muster-Intelligence
print(f"\n🎯 NIE GEZOGENE MUSTER-INTELLIGENCE:")
for pattern, count in self.unused_patterns.most_common(5):
historical_count = self.pattern_frequencies.get(pattern, 0)
unused_percentage = (count / len(self.unused_combinations_sample)) * 100
print(f" {pattern}: {unused_percentage:.1f}% nie gezogen "
f"(historisch: {historical_count}x)")
# Sequential Dependencies Insights
print(f"\n🔗 SEQUENTIAL INSIGHTS:")
if self.sequential_dependencies:
top_sequence = None
max_count = 0
for lag, transitions in self.sequential_dependencies.items():
for transition, count in transitions.items():
if count > max_count:
max_count = count
top_sequence = (lag, transition, count)
if top_sequence:
lag, transition, count = top_sequence
prev_num, curr_num = transition.split('_')
print(f" Stärkste Abhängigkeit: Nach Zahl {prev_num} kommt oft Zahl {curr_num} ({count}x)")
# Hilfsfunktionen
def _get_pattern(self, numbers):
"""N/M/H-Muster für 6aus49."""
pattern = []
for num in numbers:
if 1 <= num <= 16:
pattern.append('N')
elif 17 <= num <= 32:
pattern.append('M')
else:
pattern.append('H')
return ''.join(pattern)
def _calculate_trend_score(self, sequence):
"""Trend-Score Berechnung."""
if len(sequence) < 2:
return 0
x = np.arange(len(sequence))
y = np.array(sequence)
weights = np.exp(x / len(x))
try:
coeffs = np.polyfit(x, y, 1, w=weights)
return coeffs[0]
except:
return 0
def _calculate_recency_score(self, sequence):
"""Recency-Score Berechnung."""
try:
last_hit_index = len(sequence) - 1 - sequence[::-1].index(1)
recency = 1 - (len(sequence) - 1 - last_hit_index) / len(sequence)
return recency
except ValueError:
return 0
def _get_momentum_status(self, score):
"""Momentum-Status."""
if score > 0.5:
return "🔥 ULTRA-HEISS"
elif score > 0.35:
return "🌡️ SEHR HEISS"
elif score > 0.25:
return "😐 HEISS"
elif score > 0.15:
return "🧊 WARM"
else:
return "❄️ KALT"
# Zusätzliche Super-Funktionen für erweiterte Analyse
def analyze_winning_probability(generator, tip_numbers):
"""Analysiert Gewinnwahrscheinlichkeit basierend auf Super-Intelligence."""
base_prob = 1 / 13983816
# Super-Faktoren
factors = {
'unused_combination': 1.0,
'momentum_boost': 1.0,
'pattern_boost': 1.0,
'sequential_boost': 1.0
}
# Check ob nie gezogene Kombination
combo_tuple = tuple(sorted(tip_numbers))
for i in range(min(50000, len(generator.unused_combinations_sample))):
row = generator.unused_combinations_sample.iloc[i]
if combo_tuple == tuple(sorted([row['Z1'], row['Z2'], row['Z3'], row['Z4'], row['Z5'], row['Z6']])):
factors['unused_combination'] = 1.5 # 50% Boost für nie gezogene Kombination
break
# Momentum-Boost
hot_count = sum(1 for n in tip_numbers if n in generator.hot_numbers)
momentum_avg = np.mean([generator.momentum_scores[n]['momentum_score'] for n in tip_numbers])
factors['momentum_boost'] = 1 + (hot_count * 0.1) + (momentum_avg * 0.3)
# Pattern-Boost
pattern = generator._get_pattern(sorted(tip_numbers))
if pattern in generator.unused_patterns:
unused_pattern_freq = generator.unused_patterns[pattern] / len(generator.unused_combinations_sample)
factors['pattern_boost'] = 1 + (unused_pattern_freq * 0.2)
# Sequential-Boost (vereinfacht)
sequential_score = 0
for i in range(len(tip_numbers)-1):
transition_key = f"{tip_numbers[i]}_{tip_numbers[i+1]}"
for lag_data in generator.sequential_dependencies.values():
if transition_key in lag_data:
sequential_score += lag_data[transition_key]
if sequential_score > 0:
factors['sequential_boost'] = 1 + (sequential_score / 1000) # Normalisiert
# Gesamt-Multiplikator
total_multiplier = 1
for factor_value in factors.values():
total_multiplier *= factor_value
estimated_prob = base_prob * total_multiplier
return {
'base_probability': base_prob,
'factors': factors,
'total_multiplier': total_multiplier,
'estimated_probability': estimated_prob,
'improvement_factor': total_multiplier
}
def generate_super_analysis_report(generator, tips):
"""Generiert detaillierten Super-Analyse-Report."""
report = []
report.append("🚀 SUPER-LOTTO 6AUS49 ANALYSE-REPORT")
report.append("=" * 50)
report.append(f"📊 Basierend auf Sebastian's kompletter Datenbasis")
report.append(f"📈 {len(generator.df_historical):,} historische Ziehungen")
report.append(f"🎲 {len(generator.df_unused):,} nie gezogene Kombinationen")
report.append("")
# Tip-by-Tip Analyse
report.append("📋 DETAILLIERTE TIPP-ANALYSE:")
report.append("-" * 40)
for tip in tips:
report.append(f"\n🎯 TIPP {tip['tipp_nr']}:")
zahlen_str = f"{tip['z1']:2}-{tip['z2']:2}-{tip['z3']:2}-{tip['z4']:2}-{tip['z5']:2}-{tip['z6']:2}"
report.append(f" Zahlen: {zahlen_str} + SZ: {tip['superzahl']}")
report.append(f" 🔥 Heiße Zahlen: {tip['hot_count']}/6")
report.append(f" 📊 Momentum-Score: {tip['momentum_avg']:.3f}")
report.append(f" 🎯 Nie gezogen: {'✅ JA' if tip['unused_hit'] else '❌ NEIN'}")
report.append(f" 🎨 Muster: {tip['pattern']}")
# Wahrscheinlichkeits-Analyse
prob_analysis = analyze_winning_probability(generator, tip['zahlen'])
report.append(f" 📈 Verbesserungs-Faktor: {prob_analysis['improvement_factor']:.2f}x")
# Individuelle Zahlen-Analyse
report.append(" 🔍 Zahlen-Details:")
for num in tip['zahlen']:
momentum_data = generator.momentum_scores[num]
freq = generator.number_frequencies[num]
report.append(f" Zahl {num:2}: {momentum_data['status']} "
f"(Score: {momentum_data['momentum_score']:.3f}, {freq}x gezogen)")
# Super-Intelligence Zusammenfassung
report.append(f"\n🧠 SUPER-INTELLIGENCE ZUSAMMENFASSUNG:")
report.append("=" * 45)
# Nie gezogene Kombinationen Statistik
unused_hits = sum(1 for tip in tips if tip['unused_hit'])
report.append(f"🎯 {unused_hits}/{len(tips)} Tipps aus nie gezogenen Kombinationen")
# Momentum-Statistiken
avg_hot_numbers = sum(tip['hot_count'] for tip in tips) / len(tips)
avg_momentum = sum(tip['momentum_avg'] for tip in tips) / len(tips)
report.append(f"🔥 Ø {avg_hot_numbers:.1f} heiße Zahlen pro Tipp")
report.append(f"📊 Ø Momentum-Score: {avg_momentum:.3f}")
# Top Empfehlungen
report.append(f"\n💡 TOP EMPFEHLUNGEN:")
report.append(f"✅ Verwenden Sie die Tipps mit nie gezogenen Kombinationen")
report.append(f"🔥 Fokussieren Sie sich auf die {len(generator.hot_numbers)} heißesten Zahlen")
report.append(f"📈 Super-Momentum-Analyse zeigt beste Trends")
report.append(f"🎲 {len(generator.df_unused):,} nie gezogene Kombinationen = riesiger Vorteil!")
return "\n".join(report)
def export_comprehensive_analysis(generator, tips):
"""Exportiert umfassende Analyse in Text-Datei."""
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
report_file = f"{generator.base_path}/super_lotto_analysis_{timestamp}.txt"
report = generate_super_analysis_report(generator, tips)
with open(report_file, 'w', encoding='utf-8') as f:
f.write(report)
print(f"📄 Umfassende Analyse gespeichert: super_lotto_analysis_{timestamp}.txt")
def main():
"""Hauptfunktion für Super-Lotto Generator."""
print("🎲 SUPER-LOTTO 6AUS49 GENERATOR")
print("🚀 Mit Sebastian's kompletter Datenbasis")
print("=" * 50)
try:
# Generator mit Sebastian's Daten initialisieren
generator = SuperLotto6aus49Generator()
# Super-Tipps generieren
tips = generator.generate_super_tips(10)
if tips:
print(f"\n🏆 SUPER-OPTIMIERUNG ABGESCHLOSSEN!")
print("=" * 45)
print(f"🎲 10 Super-Tipps mit maximaler Intelligence generiert")
print(f"📊 Nutzt {len(generator.df_historical):,} historische Ziehungen")
print(f"🎯 Optimiert mit {len(generator.df_unused):,} nie gezogenen Kombinationen")
print(f"🔥 Multi-Momentum-Analyse mit Beschleunigung")
print(f"🧠 Sequential Dependencies Intelligence")
print(f"🍀 Maximale Gewinnchancen durch Super-Intelligence!")
# Erweiterte Analyse anbieten
print(f"\n📊 ERWEITERTE ANALYSE:")
print("=" * 30)
# Beispiel Super-Analyse
if len(tips) > 0:
sample_tip = tips[0]
prob_analysis = analyze_winning_probability(generator, sample_tip['zahlen'])
print(f"\n🔍 SUPER-ANALYSE für Tipp 1:")
zahlen_str = f"{sample_tip['z1']:2}-{sample_tip['z2']:2}-{sample_tip['z3']:2}-{sample_tip['z4']:2}-{sample_tip['z5']:2}-{sample_tip['z6']:2}"
print(f" 🎲 Super-Kombination: {zahlen_str} + SZ: {sample_tip['superzahl']}")
print(f" 🔥 Heiße Zahlen: {sample_tip['hot_count']}/6")
print(f" 📊 Momentum-Score: {sample_tip['momentum_avg']:.3f}")
print(f" 🎯 Nie gezogen: {'✅ JA' if sample_tip['unused_hit'] else '❌ NEIN'}")
print(f" 📈 Verbesserungs-Faktor: {prob_analysis['improvement_factor']:.2f}x")
print(f" 💎 Super-Score: {sample_tip['super_score']:.3f}")
# Angebot für vollständigen Report
create_report = input("\nVollständigen Analyse-Report erstellen? (j/n): ").lower().strip()
if create_report == 'j' or create_report == 'ja':
export_comprehensive_analysis(generator, tips)
print("✅ Vollständiger Report erstellt!")
print(f"\n🎯 SUPER-EMPFEHLUNGEN:")
print("=" * 30)
unused_count = sum(1 for tip in tips if tip['unused_hit'])
print(f"🎲 {unused_count} Tipps stammen aus nie gezogenen Kombinationen")
print(f"🔥 Alle Tipps nutzen Super-Momentum-Analyse")
print(f"📊 Basiert auf kompletter historischer Datenbasis")
print(f"💡 Maximale Optimierung durch Sebastian's Daten!")
else:
print("❌ Keine Super-Tipps generiert!")
except Exception as e:
print(f"❌ Fehler: {e}")
print("💡 Stellen Sie sicher, dass Sebastian's CSV-Dateien verfügbar sind:")
print(" 📁 AlleLottozahlen.csv")
print(" 📁 Fehlende_Lotto_Kombinationen.csv")
if __name__ == "__main__":
# Reproduzierbarer Seed
random.seed(42)
np.random.seed(42)
# Super-Generator starten
main()
-594
View File
@@ -1,594 +0,0 @@
#!/usr/bin/env python3
"""
ULTIMATE HYBRID LOTTO GENERATOR
Kombiniert AI-ML Generator + Pattern-Weighted Generator
Features:
- AI-ML Ensemble (Random Forest + Gradient Boosting + Neural Networks)
- Pattern-Gewichtung (NNMMHH, NMMHHH, etc.)
- Real-Time Learning
- Multi-Strategy Tip Generation
- Performance Comparison zwischen beiden Ansätzen
- Adaptive Strategy Selection
"""
import pandas as pd
import numpy as np
import random
from collections import Counter, defaultdict, deque
import datetime
import os
# ML Imports (optional)
try:
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.neural_network import MLPRegressor
from sklearn.preprocessing import StandardScaler
ML_AVAILABLE = True
except ImportError:
ML_AVAILABLE = False
class UltimateHybridLottoGenerator:
def __init__(self, data_path):
self.data_path = data_path
self.df = None
# Beide Subsysteme
self.ai_ml_system = AIMLSubsystem()
self.pattern_system = PatternSubsystem()
self.hybrid_optimizer = HybridOptimizer()
# Performance Tracking
self.strategy_performance = {
'ai_ml': {'tips': [], 'confidence': [], 'success_rate': 0.0},
'pattern': {'tips': [], 'confidence': [], 'success_rate': 0.0},
'hybrid': {'tips': [], 'confidence': [], 'success_rate': 0.0}
}
# Adaptive Weights
self.adaptive_weights = {
'ai_ml': 0.4,
'pattern': 0.3,
'hybrid': 0.3
}
print("🚀 ULTIMATE HYBRID LOTTO GENERATOR")
print("=" * 60)
print("🤖 AI-ML System + 🎨 Pattern System + ⚡ Hybrid Optimizer")
# Initialize
self.load_and_initialize()
def load_and_initialize(self):
"""Lädt Daten und initialisiert alle Subsysteme."""
try:
self.df = pd.read_csv(self.data_path, sep=';')
if 'datum' in self.df.columns:
self.df['datum'] = pd.to_datetime(self.df['datum'], format='%Y-%m-%d', errors='coerce')
self.df = self.df.sort_values('datum')
print(f"📊 {len(self.df)} Ziehungen geladen")
# Initialize subsystems
print("🔧 Initialisiere AI-ML System...")
self.ai_ml_system.initialize(self.df)
print("🎨 Initialisiere Pattern System...")
self.pattern_system.initialize(self.df)
print("⚡ Initialisiere Hybrid Optimizer...")
self.hybrid_optimizer.initialize(self.df, self.ai_ml_system, self.pattern_system)
print("✅ Alle Systeme bereit!")
except Exception as e:
print(f"❌ Initialization error: {e}")
self.df = pd.DataFrame()
def generate_ultimate_tips(self, num_tips=10):
"""Generiert Ultimate Tipps mit allen drei Strategien."""
print(f"\n🎯 ULTIMATE TIP GENERATION")
print("=" * 60)
if len(self.df) == 0:
print("❌ Keine Daten verfügbar")
return []
# Strategy Distribution basierend auf Performance
strategies = self._determine_strategy_distribution(num_tips)
print(f"📊 STRATEGY DISTRIBUTION:")
for strategy, count in strategies.items():
weight = self.adaptive_weights[strategy]
print(f" {strategy.upper()}: {count} tips (Weight: {weight:.2f})")
all_tips = []
print(f"\n🎲 GENERATING {num_tips} ULTIMATE TIPS:")
print("=" * 85)
print("Nr 6 Ultimate Numbers SZ Strategy AI-Score Pattern-W Confidence")
print("-" * 85)
tip_counter = 1
# AI-ML Tips
if strategies['ai_ml'] > 0:
ai_tips = self._generate_ai_ml_tips(strategies['ai_ml'], tip_counter)
all_tips.extend(ai_tips)
tip_counter += len(ai_tips)
# Pattern Tips
if strategies['pattern'] > 0:
pattern_tips = self._generate_pattern_tips(strategies['pattern'], tip_counter)
all_tips.extend(pattern_tips)
tip_counter += len(pattern_tips)
# Hybrid Tips
if strategies['hybrid'] > 0:
hybrid_tips = self._generate_hybrid_tips(strategies['hybrid'], tip_counter)
all_tips.extend(hybrid_tips)
# Output all tips
for tip in all_tips:
self._print_tip_line(tip)
# Performance Analysis
self._analyze_tip_portfolio(all_tips)
# Update adaptive weights
self._update_adaptive_weights(all_tips)
return all_tips
def _determine_strategy_distribution(self, num_tips):
"""Bestimmt Strategy-Verteilung basierend auf Performance."""
strategies = {}
# Basis-Verteilung basierend auf Adaptive Weights
ai_count = max(1, int(num_tips * self.adaptive_weights['ai_ml']))
pattern_count = max(1, int(num_tips * self.adaptive_weights['pattern']))
hybrid_count = num_tips - ai_count - pattern_count
# Sicherstellen dass hybrid_count >= 0
if hybrid_count < 0:
if ai_count > pattern_count:
ai_count += hybrid_count
else:
pattern_count += hybrid_count
hybrid_count = 0
strategies['ai_ml'] = ai_count
strategies['pattern'] = pattern_count
strategies['hybrid'] = hybrid_count
return strategies
def _generate_ai_ml_tips(self, count, start_number):
"""Generiert AI-ML basierte Tipps."""
tips = []
if not ML_AVAILABLE:
# Fallback zu frequency-based
for i in range(count):
tip = self._generate_frequency_tip(start_number + i, 'AI-ML-FALLBACK')
tips.append(tip)
return tips
# AI Predictions
ai_predictions = self.ai_ml_system.get_predictions()
for i in range(count):
tip_number = start_number + i
# AI-optimierte Kombination
numbers = self._select_ai_optimized_numbers(ai_predictions, tip_number)
superzahl = self._get_smart_superzahl(tip_number)
# Scores
ai_score = np.mean([ai_predictions.get(n, 0.1) for n in numbers])
pattern_weight = self.pattern_system.calculate_pattern_weight(numbers)
confidence = ai_score * 0.7 + pattern_weight * 0.3
tip = {
'tip_number': tip_number,
'numbers': numbers,
'superzahl': superzahl,
'strategy': 'AI-ML',
'ai_score': ai_score,
'pattern_weight': pattern_weight,
'confidence': confidence
}
tips.append(tip)
return tips
def _generate_pattern_tips(self, count, start_number):
"""Generiert Pattern-basierte Tipps."""
tips = []
# Top Patterns aus historischen Daten
top_patterns = self.pattern_system.get_top_patterns(count)
for i in range(count):
tip_number = start_number + i
# Wähle Pattern
target_pattern = top_patterns[i % len(top_patterns)] if top_patterns else 'NNMMHH'
# Pattern-optimierte Kombination
numbers = self.pattern_system.optimize_for_pattern(target_pattern, tip_number)
superzahl = self._get_smart_superzahl(tip_number)
# Scores
pattern_weight = self.pattern_system.calculate_pattern_weight(numbers)
ai_score = 0.3 + random.random() * 0.2 # Mock AI score für Pattern-Tips
confidence = pattern_weight * 0.7 + ai_score * 0.3
tip = {
'tip_number': tip_number,
'numbers': numbers,
'superzahl': superzahl,
'strategy': 'PATTERN',
'ai_score': ai_score,
'pattern_weight': pattern_weight,
'confidence': confidence,
'target_pattern': target_pattern
}
tips.append(tip)
return tips
def _generate_hybrid_tips(self, count, start_number):
"""Generiert Hybrid-optimierte Tipps."""
tips = []
for i in range(count):
tip_number = start_number + i
# Hybrid optimization
hybrid_result = self.hybrid_optimizer.optimize_combination(tip_number)
numbers = hybrid_result['numbers']
superzahl = self._get_smart_superzahl(tip_number)
tip = {
'tip_number': tip_number,
'numbers': numbers,
'superzahl': superzahl,
'strategy': 'HYBRID',
'ai_score': hybrid_result['ai_score'],
'pattern_weight': hybrid_result['pattern_weight'],
'confidence': hybrid_result['confidence']
}
tips.append(tip)
return tips
def _select_ai_optimized_numbers(self, ai_predictions, tip_number):
"""Wählt AI-optimierte Zahlen aus."""
if not ai_predictions:
return sorted(random.sample(range(1, 50), 6))
# Top AI candidates
sorted_predictions = sorted(ai_predictions.items(), key=lambda x: x[1], reverse=True)
selected = []
random.seed(42 + tip_number) # Konsistenz mit Variation
# Strategy: Top AI + Diversität
for i in range(6):
candidates = [num for num, score in sorted_predictions[:25] if num not in selected]
if not candidates:
candidates = [n for n in range(1, 50) if n not in selected]
if candidates:
# Gewichtete Auswahl mit etwas Zufall
weights = [ai_predictions.get(c, 0.1) + random.random() * 0.1 for c in candidates]
selected.append(random.choices(candidates, weights=weights)[0])
return sorted(selected)
def _get_smart_superzahl(self, tip_number):
"""Intelligente Superzahl-Auswahl."""
base_sz = [7, 6, 3, 2, 0, 1, 4, 5, 8, 9]
# Aus historischen Daten
if 'SZ' in self.df.columns and len(self.df) > 10:
recent_sz = self.df['SZ'].tail(20).dropna()
if len(recent_sz) > 0:
sz_freq = Counter(recent_sz)
frequent_sz = [int(sz) for sz, _ in sz_freq.most_common(5) if 0 <= sz <= 9]
if frequent_sz:
base_sz = frequent_sz
return base_sz[tip_number % len(base_sz)]
def _generate_frequency_tip(self, tip_number, strategy):
"""Fallback frequency-based tip."""
if len(self.df) == 0:
numbers = sorted(random.sample(range(1, 50), 6))
else:
# Frequency analysis
number_freq = Counter()
for _, row in self.df.tail(30).iterrows():
for col in ['Z1', 'Z2', 'Z3', 'Z4', 'Z5', 'Z6']:
if col in row and pd.notna(row[col]):
number_freq[int(row[col])] += 1
# Mix frequent + random
frequent = [num for num, _ in number_freq.most_common(20)]
numbers = random.sample(frequent[:15], 4) + random.sample(range(1, 50), 2)
numbers = sorted(list(set(numbers))[:6])
while len(numbers) < 6:
candidates = [n for n in range(1, 50) if n not in numbers]
numbers.append(random.choice(candidates))
numbers = sorted(numbers)
return {
'tip_number': tip_number,
'numbers': numbers,
'superzahl': self._get_smart_superzahl(tip_number),
'strategy': strategy,
'ai_score': 0.3,
'pattern_weight': 0.3,
'confidence': 0.3
}
def _print_tip_line(self, tip):
"""Druckt eine Tipp-Zeile."""
zahlen_str = '-'.join([f"{n:2d}" for n in tip['numbers']])
print(f"{tip['tip_number']:2d} {zahlen_str} {tip['superzahl']:2d} "
f"{tip['strategy']:<9} {tip['ai_score']:.3f} {tip['pattern_weight']:.3f} {tip['confidence']:.3f}")
def _analyze_tip_portfolio(self, tips):
"""Analysiert das Tipp-Portfolio."""
print(f"\n📊 PORTFOLIO ANALYSIS:")
print("=" * 50)
# Strategy-wise stats
strategy_stats = defaultdict(list)
for tip in tips:
strategy_stats[tip['strategy']].append(tip)
for strategy, strategy_tips in strategy_stats.items():
avg_confidence = np.mean([t['confidence'] for t in strategy_tips])
avg_ai = np.mean([t['ai_score'] for t in strategy_tips])
avg_pattern = np.mean([t['pattern_weight'] for t in strategy_tips])
print(f"{strategy}:")
print(f" Tips: {len(strategy_tips)}, Avg Confidence: {avg_confidence:.3f}")
print(f" Avg AI-Score: {avg_ai:.3f}, Avg Pattern-Weight: {avg_pattern:.3f}")
# Best tip
best_tip = max(tips, key=lambda x: x['confidence'])
print(f"\n⭐ BEST TIP:")
zahlen_str = '-'.join([f"{n:2d}" for n in best_tip['numbers']])
print(f" #{best_tip['tip_number']}: {zahlen_str} + SZ {best_tip['superzahl']}")
print(f" Strategy: {best_tip['strategy']}, Confidence: {best_tip['confidence']:.3f}")
def _update_adaptive_weights(self, tips):
"""Updated adaptive weights basierend auf tip quality."""
strategy_confidence = defaultdict(list)
for tip in tips:
strategy_confidence[tip['strategy']].append(tip['confidence'])
# Update weights basierend auf average confidence
total_confidence = 0
strategy_avg = {}
for strategy, confidences in strategy_confidence.items():
avg_conf = np.mean(confidences)
strategy_avg[strategy] = avg_conf
total_confidence += avg_conf
# Normalize to weights
if total_confidence > 0:
for strategy in ['ai_ml', 'pattern', 'hybrid']:
strategy_key = strategy.upper().replace('_', '-')
if strategy_key in strategy_avg:
self.adaptive_weights[strategy] = strategy_avg[strategy_key] / total_confidence
print(f"\n🔄 UPDATED ADAPTIVE WEIGHTS:")
for strategy, weight in self.adaptive_weights.items():
print(f" {strategy.upper()}: {weight:.3f}")
# Subsystem Classes
class AIMLSubsystem:
def __init__(self):
self.predictions = {}
self.is_trained = False
def initialize(self, df):
if ML_AVAILABLE and len(df) > 50:
self._train_simple_model(df)
else:
self._create_fallback_predictions(df)
def _train_simple_model(self, df):
# Simplified ML training
number_freq = Counter()
for _, row in df.iterrows():
for col in ['Z1', 'Z2', 'Z3', 'Z4', 'Z5', 'Z6']:
if col in row and pd.notna(row[col]):
number_freq[int(row[col])] += 1
max_freq = max(number_freq.values()) if number_freq else 1
for num in range(1, 50):
freq = number_freq.get(num, 0)
base_pred = freq / max_freq
# Add ML-like variation
ml_variation = np.random.normal(0, 0.1)
self.predictions[num] = max(0.1, min(0.9, base_pred + ml_variation))
self.is_trained = True
def _create_fallback_predictions(self, df):
# Simple frequency-based predictions
for num in range(1, 50):
self.predictions[num] = 0.1 + random.random() * 0.4
def get_predictions(self):
return self.predictions
class PatternSubsystem:
def __init__(self):
self.pattern_frequencies = Counter()
self.pattern_weights = {}
def initialize(self, df):
self._analyze_patterns(df)
def _analyze_patterns(self, df):
total = len(df)
for _, row in df.iterrows():
numbers = sorted([row['Z1'], row['Z2'], row['Z3'], row['Z4'], row['Z5'], row['Z6']])
pattern = self._get_pattern(numbers)
self.pattern_frequencies[pattern] += 1
# Calculate weights
for pattern, count in self.pattern_frequencies.items():
self.pattern_weights[pattern] = count / total
def _get_pattern(self, numbers):
pattern = ""
for num in numbers:
if 1 <= num <= 16:
pattern += "N"
elif 17 <= num <= 32:
pattern += "M"
else:
pattern += "H"
return pattern
def calculate_pattern_weight(self, numbers):
pattern = self._get_pattern(sorted(numbers))
return self.pattern_weights.get(pattern, 0.01)
def get_top_patterns(self, count):
return [pattern for pattern, _ in self.pattern_frequencies.most_common(count)]
def optimize_for_pattern(self, target_pattern, seed):
random.seed(42 + seed)
ranges = {
'N': list(range(1, 17)),
'M': list(range(17, 33)),
'H': list(range(33, 50))
}
pattern_counts = Counter(target_pattern)
selected = []
for char, count in pattern_counts.items():
if char in ranges and count > 0:
available = [n for n in ranges[char] if n not in selected]
if len(available) >= count:
selected.extend(random.sample(available, count))
while len(selected) < 6:
all_available = [n for n in range(1, 50) if n not in selected]
if all_available:
selected.append(random.choice(all_available))
return sorted(selected[:6])
class HybridOptimizer:
def __init__(self):
self.ai_system = None
self.pattern_system = None
def initialize(self, df, ai_system, pattern_system):
self.ai_system = ai_system
self.pattern_system = pattern_system
def optimize_combination(self, seed):
random.seed(42 + seed)
# Get AI predictions
ai_preds = self.ai_system.get_predictions()
# Multi-objective optimization
best_score = -1
best_combination = None
for attempt in range(100): # Limited search
# Generate candidate
candidate = self._generate_candidate(ai_preds, attempt)
# Score combination
ai_score = np.mean([ai_preds.get(n, 0.1) for n in candidate])
pattern_weight = self.pattern_system.calculate_pattern_weight(candidate)
# Multi-objective score
combined_score = ai_score * 0.6 + pattern_weight * 0.4
if combined_score > best_score:
best_score = combined_score
best_combination = candidate
return {
'numbers': best_combination or sorted(random.sample(range(1, 50), 6)),
'ai_score': np.mean([ai_preds.get(n, 0.1) for n in best_combination]) if best_combination else 0.3,
'pattern_weight': self.pattern_system.calculate_pattern_weight(best_combination) if best_combination else 0.3,
'confidence': best_score if best_score > 0 else 0.3
}
def _generate_candidate(self, ai_preds, attempt):
# Verschiedene Generierungsstrategien
if attempt < 30:
# AI-focused
candidates = sorted(ai_preds.items(), key=lambda x: x[1], reverse=True)[:20]
return sorted(random.sample([num for num, _ in candidates], 6))
elif attempt < 60:
# Pattern-focused
target_patterns = ['NNMMHH', 'NMMHHH', 'NMMMHH']
pattern = random.choice(target_patterns)
return self.pattern_system.optimize_for_pattern(pattern, attempt)
else:
# Random with bias
return sorted(random.sample(range(1, 50), 6))
def main():
"""Startet den Ultimate Hybrid Generator."""
data_path = "/Users/sebastianfrohlich/Library/Mobile Documents/com~apple~CloudDocs/Jupyter Notebooks/AlleLottozahlen.csv"
try:
# Initialize Ultimate Generator
generator = UltimateHybridLottoGenerator(data_path)
# Generate ultimate tips
ultimate_tips = generator.generate_ultimate_tips(10)
print(f"\n🏆 ULTIMATE GENERATION COMPLETED!")
print("=" * 50)
print(f"🚀 {len(ultimate_tips)} Ultimate Tips generiert")
print(f"🤖 AI-ML System: {'' if ML_AVAILABLE else '⚠️ Fallback'}")
print(f"🎨 Pattern System: ✅")
print(f"⚡ Hybrid Optimizer: ✅")
print(f"📊 Adaptive Strategy Selection: ✅")
print(f"\n💡 SYSTEM ADVANTAGES:")
print(f" 🔬 Wissenschaftlich: Multi-System Validation")
print(f" 🎯 Adaptiv: Performance-basierte Gewichtung")
print(f" ⚖️ Ausgewogen: AI + Pattern + Hybrid Balance")
print(f" 📈 Lernend: Kontinuierliche Verbesserung")
except Exception as e:
print(f"❌ Error: {e}")
if __name__ == "__main__":
random.seed(42)
np.random.seed(42)
main()
-840
View File
@@ -1,840 +0,0 @@
#!/usr/bin/env python3
"""
Ultimate Lotto 6aus49 Generator mit Multi-Ziehungs-Trend-Analyse
Speziell optimiert für deutsches Lotto 6 aus 49:
- 6 Zahlen aus 49 (statt 5 aus 50)
- 1 Superzahl 0-9 (statt 2 Eurozahlen)
- Angepasste N/M/H-Bereiche für 49er-System
- Multi-Ziehungs-Trend-Analyse
- Momentum-Tracking über mehrere Ziehungen
- Sequenzielle Abhängigkeiten
- Zyklische Muster-Erkennung
"""
import pandas as pd
import random
import numpy as np
from itertools import combinations
from collections import Counter, defaultdict, deque
import datetime
class UltimateLotto6aus49Generator:
def __init__(self, data_path=None):
# Pfad zur Lotto-Daten CSV-Datei
self.data_path = data_path or input("Pfad zur Lotto 6aus49 CSV-Datei: ").strip()
self.df = None
self.drawn_combinations = set()
# Basis-Analyse
self.number_frequencies = Counter()
self.position_frequencies = defaultdict(Counter)
self.pattern_frequencies = Counter()
self.supernumber_frequencies = Counter() # Nur 1 Superzahl beim Lotto
self.number_distances = []
# Multi-Ziehungs-Trend-Analyse
self.number_sequences = defaultdict(list)
self.momentum_scores = {}
self.trend_predictions = {}
self.sequential_dependencies = defaultdict(lambda: defaultdict(int))
self.cycle_patterns = {}
self.hot_numbers = []
self.warm_numbers = []
self.cold_numbers = []
# Lotto 6aus49 spezifische Bereiche (angepasst für 1-49)
self.lotto_ranges = {
'N': list(range(1, 17)), # Niedrig: 1-16 (etwa 1/3)
'M': list(range(17, 33)), # Mittel: 17-32 (etwa 1/3)
'H': list(range(33, 50)) # Hoch: 33-49 (etwa 1/3)
}
# Initialisierung
if self._file_exists():
self.load_and_analyze_all_data()
def _file_exists(self):
"""Prüft ob Datei existiert."""
try:
with open(self.data_path, 'r'):
return True
except FileNotFoundError:
print(f"❌ Datei nicht gefunden: {self.data_path}")
print("💡 Bitte stellen Sie sicher, dass die Lotto-Daten im korrekten Format vorliegen:")
print(" Spalten: Datum, Z1, Z2, Z3, Z4, Z5, Z6, SZ (Superzahl)")
return False
def load_and_analyze_all_data(self):
"""Lädt Lotto-Daten und führt alle Analysen durch."""
try:
# CSV laden mit flexibler Spaltenerkennung
self.df = pd.read_csv(self.data_path, sep=';')
# Spalten-Mapping für verschiedene CSV-Formate
column_mapping = {
'Ziehungsdatum': 'Datum',
'Gewinnzahl1': 'Z1', 'Gewinnzahl2': 'Z2', 'Gewinnzahl3': 'Z3',
'Gewinnzahl4': 'Z4', 'Gewinnzahl5': 'Z5', 'Gewinnzahl6': 'Z6',
'Superzahl': 'SZ', 'SuperZahl': 'SZ'
}
# Spalten umbenennen falls nötig
for old_name, new_name in column_mapping.items():
if old_name in self.df.columns and new_name not in self.df.columns:
self.df.rename(columns={old_name: new_name}, inplace=True)
# Benötigte Spalten prüfen
required_columns = ['Z1', 'Z2', 'Z3', 'Z4', 'Z5', 'Z6']
missing_columns = [col for col in required_columns if col not in self.df.columns]
if missing_columns:
print(f"❌ Fehlende Spalten: {missing_columns}")
print(f"🔍 Verfügbare Spalten: {list(self.df.columns)}")
return False
# Chronologische Sortierung
if 'Datum' in self.df.columns:
# Verschiedene Datumsformate versuchen
date_formats = ['%d.%m.%Y', '%Y-%m-%d', '%d/%m/%Y']
for date_format in date_formats:
try:
self.df['Datum'] = pd.to_datetime(self.df['Datum'], format=date_format)
break
except:
continue
if pd.api.types.is_datetime64_any_dtype(self.df['Datum']):
self.df = self.df.sort_values('Datum')
print(f"🎲 ULTIMATE LOTTO 6AUS49 GENERATOR")
print("=" * 60)
print(f"📊 Analysiere {len(self.df)} Lotto-Ziehungen...")
print(f"🎯 System: 6 aus 49 + Superzahl (0-9)")
# Alle Analysen durchführen
self._perform_lotto_basic_analysis()
self._perform_lotto_momentum_analysis()
self._perform_lotto_sequential_analysis()
self._perform_lotto_cycle_analysis()
self._generate_lotto_trend_predictions()
print(f"✅ Komplette Lotto-Analyse abgeschlossen!")
self._print_lotto_analysis_summary()
except Exception as e:
print(f"❌ Fehler beim Laden der Lotto-Daten: {e}")
print("💡 Stellen Sie sicher, dass die CSV-Datei das korrekte Format hat.")
return False
return True
def _perform_lotto_basic_analysis(self):
"""Führt Basis-Analysen für Lotto 6aus49 durch."""
for _, row in self.df.iterrows():
# 6 Gewinnzahlen
numbers = [row['Z1'], row['Z2'], row['Z3'], row['Z4'], row['Z5'], row['Z6']]
combo = tuple(sorted(numbers))
self.drawn_combinations.add(combo)
# Zahlenfrequenzen (1-49)
for num in numbers:
if 1 <= num <= 49: # Validierung für Lotto-Bereich
self.number_frequencies[num] += 1
# Positionsfrequenzen
sorted_numbers = sorted(numbers)
for i, num in enumerate(sorted_numbers):
self.position_frequencies[f'pos_{i+1}'][num] += 1
# Lotto-Muster analysieren (angepasste Bereiche)
pattern = self._get_lotto_pattern(sorted_numbers)
self.pattern_frequencies[pattern] += 1
# Superzahl (0-9)
if 'SZ' in row and pd.notna(row['SZ']):
superzahl = int(row['SZ'])
if 0 <= superzahl <= 9:
self.supernumber_frequencies[superzahl] += 1
# Zahlenabstände (für 6 Zahlen)
distances = [sorted_numbers[i+1] - sorted_numbers[i] for i in range(5)]
self.number_distances.extend(distances)
def _get_lotto_pattern(self, numbers):
"""Bestimmt N/M/H-Muster für Lotto 6aus49."""
pattern = []
for num in numbers:
if 1 <= num <= 16:
pattern.append('N') # Niedrig
elif 17 <= num <= 32:
pattern.append('M') # Mittel
else:
pattern.append('H') # Hoch (33-49)
return ''.join(pattern)
def _perform_lotto_momentum_analysis(self, window_size=12):
"""Momentum-Analyse für Lotto 6aus49."""
print(f"\n🔥 LOTTO MOMENTUM-ANALYSE (Fenster: {window_size})")
# Zahlensequenzen für 1-49
for number in range(1, 50):
sequence = []
for _, row in self.df.iterrows():
drawn_numbers = [row['Z1'], row['Z2'], row['Z3'], row['Z4'], row['Z5'], row['Z6']]
sequence.append(1 if number in drawn_numbers else 0)
self.number_sequences[number] = sequence
# Momentum-Scores
momentum_results = {}
for number in range(1, 50):
recent_sequence = self.number_sequences[number][-window_size:]
hit_rate = sum(recent_sequence) / len(recent_sequence)
trend_score = self._calculate_trend_score(recent_sequence)
recency_score = self._calculate_recency_score(recent_sequence)
# Lotto-angepasste Gewichtung (6 aus 49 vs 5 aus 50)
momentum_score = (hit_rate * 0.45) + (trend_score * 0.35) + (recency_score * 0.2)
momentum_results[number] = {
'hit_rate': hit_rate,
'trend_score': trend_score,
'recency_score': recency_score,
'momentum_score': momentum_score,
'status': self._get_momentum_status(momentum_score)
}
self.momentum_scores = momentum_results
# Kategorisierung für Lotto
sorted_momentum = sorted(momentum_results.items(),
key=lambda x: x[1]['momentum_score'], reverse=True)
self.hot_numbers = [num for num, data in sorted_momentum[:18]
if data['momentum_score'] > 0.25] # Angepasst für 6aus49
self.warm_numbers = [num for num, data in sorted_momentum[18:30]
if 0.15 <= data['momentum_score'] <= 0.25]
self.cold_numbers = [num for num, data in sorted_momentum[30:]
if data['momentum_score'] < 0.15][:20]
print(f"🔥 {len(self.hot_numbers)} heiße Lotto-Zahlen identifiziert")
print(f"🌡️ {len(self.warm_numbers)} warme Lotto-Zahlen identifiziert")
print(f"🧊 {len(self.cold_numbers)} kalte Lotto-Zahlen identifiziert")
def _perform_lotto_sequential_analysis(self, look_back=3):
"""Sequenzielle Abhängigkeiten für Lotto."""
print(f"\n🔗 LOTTO SEQUENZIELLE ABHÄNGIGKEITEN")
for i in range(look_back, len(self.df)):
current_numbers = set([self.df.iloc[i]['Z1'], self.df.iloc[i]['Z2'],
self.df.iloc[i]['Z3'], self.df.iloc[i]['Z4'],
self.df.iloc[i]['Z5'], self.df.iloc[i]['Z6']])
for j in range(1, look_back + 1):
prev_numbers = set([self.df.iloc[i-j]['Z1'], self.df.iloc[i-j]['Z2'],
self.df.iloc[i-j]['Z3'], self.df.iloc[i-j]['Z4'],
self.df.iloc[i-j]['Z5'], self.df.iloc[i-j]['Z6']])
for prev_num in prev_numbers:
for curr_num in current_numbers:
self.sequential_dependencies[f"lag_{j}"][f"{prev_num}_{curr_num}"] += 1
def _perform_lotto_cycle_analysis(self, max_cycle_length=15):
"""Zyklische Muster-Analyse für Lotto."""
print(f"\n🔄 LOTTO ZYKLUS-ANALYSE")
pattern_sequence = []
for _, row in self.df.iterrows():
numbers = sorted([row['Z1'], row['Z2'], row['Z3'], row['Z4'], row['Z5'], row['Z6']])
pattern = self._get_lotto_pattern(numbers)
pattern_sequence.append(pattern)
self.cycle_patterns = {}
for cycle_length in range(3, max_cycle_length + 1):
cycles = self._find_pattern_cycles(pattern_sequence, cycle_length)
if cycles:
self.cycle_patterns[cycle_length] = cycles
cycle_count = sum(len(cycles) for cycles in self.cycle_patterns.values())
print(f"🔄 {cycle_count} Lotto-Zyklen erkannt")
def _generate_lotto_trend_predictions(self):
"""Trend-Vorhersagen für Lotto 6aus49."""
print(f"\n🎯 LOTTO TREND-VORHERSAGEN")
for number in range(1, 50):
if number in self.momentum_scores:
momentum_data = self.momentum_scores[number]
# Lotto-spezifische Gewichtung
momentum_weight = momentum_data['momentum_score'] * 0.4
frequency_weight = (self.number_frequencies[number] / (len(self.df) * 6)) * 0.35 # 6 Zahlen pro Ziehung
trend_weight = max(0, momentum_data['trend_score']) * 0.25
prediction_score = momentum_weight + frequency_weight + trend_weight
self.trend_predictions[number] = {
'prediction_score': prediction_score,
'recommendation': self._get_prediction_recommendation(prediction_score),
'confidence': self._get_confidence_level(prediction_score)
}
def generate_lotto_ultimate_combination(self):
"""Generiert ultimative Lotto 6aus49 Kombination."""
max_attempts = 1000
for attempt in range(max_attempts):
numbers = []
# Lotto-Strategie: 6 Zahlen aus 49
# 50% Top-Trend, 30% Heiß, 20% Balance
# 3 Zahlen aus Top-Trends
top_trend_numbers = [num for num, data in sorted(self.trend_predictions.items(),
key=lambda x: x[1]['prediction_score'], reverse=True)[:20]
if data['recommendation'] in ['SEHR EMPFOHLEN', 'EMPFOHLEN']]
if len(top_trend_numbers) >= 3:
trend_picks = random.sample(top_trend_numbers[:12], 3)
numbers.extend(trend_picks)
# 2 heiße Zahlen
if len(self.hot_numbers) >= 2:
remaining_hot = [n for n in self.hot_numbers if n not in numbers]
if len(remaining_hot) >= 2:
hot_picks = random.sample(remaining_hot[:10], min(2, len(remaining_hot)))
numbers.extend(hot_picks)
# 1 warme/kalte Zahl für Balance
remaining_slots = 6 - len(numbers)
if remaining_slots > 0:
balance_pool = self.warm_numbers + self.cold_numbers[:5]
remaining_balance = [n for n in balance_pool if n not in numbers]
if remaining_balance:
balance_picks = random.sample(remaining_balance, min(remaining_slots, len(remaining_balance)))
numbers.extend(balance_picks)
# Auffüllen bis 6 Zahlen
while len(numbers) < 6:
available_numbers = [n for n in range(1, 50) if n not in numbers]
weights = [self.trend_predictions[n]['prediction_score'] for n in available_numbers]
if sum(weights) > 0:
additional_number = random.choices(available_numbers, weights=weights)[0]
else:
additional_number = random.choice(available_numbers)
numbers.append(additional_number)
# Sortieren und validieren
numbers = sorted(numbers[:6])
if self._validate_lotto_combination(numbers):
return numbers
# Fallback
return self._generate_lotto_fallback()
def _validate_lotto_combination(self, numbers):
"""Validierung für Lotto 6aus49."""
if tuple(numbers) in self.drawn_combinations:
return False
if len(set(numbers)) != 6:
return False
# Lotto-spezifische Validierungen
hot_count = sum(1 for n in numbers if n in self.hot_numbers)
trend_count = sum(1 for n in numbers
if self.trend_predictions[n]['recommendation'] == 'SEHR EMPFOHLEN')
# Mindestens 1 heiße oder sehr empfohlene Zahl
if hot_count == 0 and trend_count == 0:
return False
# Abstände prüfen (für 6 Zahlen)
distances = [numbers[i+1] - numbers[i] for i in range(5)]
if min(distances) < 1 or max(distances) > 15:
return False
# Gerade/Ungerade Balance
even_count = sum(1 for n in numbers if n % 2 == 0)
if even_count == 0 or even_count == 6:
return False
# Summen-Validierung für 6aus49
total = sum(numbers)
if total < 90 or total > 200:
return False
return True
def _generate_lotto_fallback(self):
"""Fallback für Lotto 6aus49."""
numbers = []
# Erweiterte Verteilung für 6 Zahlen: 2N + 2M + 2H
numbers.extend(random.sample(self.lotto_ranges['N'], 2))
numbers.extend(random.sample(self.lotto_ranges['M'], 2))
numbers.extend(random.sample(self.lotto_ranges['H'], 2))
return sorted(numbers)
def get_optimized_supernumber(self):
"""Optimierte Superzahl-Auswahl (0-9)."""
if not self.supernumber_frequencies:
return random.randint(0, 9)
# Trend-gewichtete Superzahl-Auswahl
recent_df = self.df.tail(8) if len(self.df) >= 8 else self.df
supernumber_trends = {}
for sz in range(0, 10):
recent_count = (recent_df['SZ'] == sz).sum() if 'SZ' in recent_df.columns else 0
total_count = self.supernumber_frequencies[sz]
trend_score = (recent_count / len(recent_df)) * 0.6 + (total_count / len(self.df)) * 0.4
supernumber_trends[sz] = trend_score
# Gewichtete Auswahl
candidates = list(supernumber_trends.keys())
weights = list(supernumber_trends.values())
if sum(weights) > 0:
return random.choices(candidates, weights=weights)[0]
else:
return random.randint(0, 9)
def generate_lotto_ultimate_tips(self, num_tips=10):
"""Generiert ultimate Lotto 6aus49 Tipps."""
print(f"\n🚀 ULTIMATE LOTTO 6AUS49 TIPP-GENERIERUNG")
print("=" * 55)
print(f"🎯 System: 6 Zahlen aus 49 + 1 Superzahl (0-9)")
print(f"🔬 Multi-Trend-Analyse für maximale Trefferquote")
generated_tips = []
strategy_distribution = Counter()
print(f"\n🎲 GENERIERE {num_tips} ULTIMATE LOTTO-TIPPS:")
print("=" * 65)
print(f"{'Nr':<3} {'6 Zahlen aus 49':<25} {'SZ':<3} {'Muster':<8} {'🔥':<3} {'🎯':<3} {'Strategie'}")
print("-" * 65)
attempts = 0
max_attempts = num_tips * 50
while len(generated_tips) < num_tips and attempts < max_attempts:
attempts += 1
combination = self.generate_lotto_ultimate_combination()
if combination and tuple(combination) not in [tuple(tip['zahlen']) for tip in generated_tips]:
pattern = self._get_lotto_pattern(combination)
# Lotto-Trend-Analyse
hot_count = sum(1 for n in combination if n in self.hot_numbers)
trend_count = sum(1 for n in combination
if self.trend_predictions[n]['recommendation'] in ['SEHR EMPFOHLEN', 'EMPFOHLEN'])
# Superzahl
superzahl = self.get_optimized_supernumber()
# Strategie-Klassifikation
if hot_count >= 4:
strategy = "🔥 MOMENTUM"
elif trend_count >= 4:
strategy = "🎯 TREND"
elif pattern in ['NNMMHH', 'NMMHHH', 'NNNMMM']:
strategy = "🎨 MUSTER"
else:
strategy = "⚖️ BALANCE"
strategy_distribution[strategy] += 1
tip = {
'tipp_nr': len(generated_tips) + 1,
'zahlen': combination,
'z1': combination[0], 'z2': combination[1], 'z3': combination[2],
'z4': combination[3], 'z5': combination[4], 'z6': combination[5],
'superzahl': superzahl,
'muster': pattern,
'summe': sum(combination),
'hot_count': hot_count,
'trend_count': trend_count,
'strategy': strategy
}
generated_tips.append(tip)
# Output
zahlen_str = f"{combination[0]:2}-{combination[1]:2}-{combination[2]:2}-{combination[3]:2}-{combination[4]:2}-{combination[5]:2}"
print(f"{len(generated_tips):2}. {zahlen_str:<25} {superzahl:<3} {pattern:<8} {hot_count:<3} {trend_count:<3} {strategy}")
# Lotto-Zusammenfassung
self._print_lotto_summary(generated_tips, attempts, strategy_distribution)
# Export
self._export_lotto_tips(generated_tips)
return generated_tips
def _print_lotto_summary(self, tips, attempts, strategy_distribution):
"""Druckt Lotto-spezifische Zusammenfassung."""
print(f"\n🏆 ULTIMATE LOTTO 6AUS49 ZUSAMMENFASSUNG:")
print("=" * 50)
print(f"{len(tips)} Ultimate Lotto-Tipps generiert")
print(f"🎯 Erfolgsrate: {(len(tips)/attempts)*100:.1f}%")
print(f"🔥 Durchschnitt {sum(tip['hot_count'] for tip in tips)/len(tips):.1f} heiße Zahlen pro Tipp")
print(f"📈 Durchschnitt {sum(tip['trend_count'] for tip in tips)/len(tips):.1f} Trend-Zahlen pro Tipp")
# Strategie-Verteilung
print(f"\n📊 STRATEGIE-VERTEILUNG:")
for strategy, count in strategy_distribution.most_common():
print(f" {strategy}: {count} Tipps")
# Lotto-spezifische Insights
print(f"\n💡 LOTTO 6AUS49 INSIGHTS:")
# Top Trend-Zahlen
top_trend = sorted(self.trend_predictions.items(),
key=lambda x: x[1]['prediction_score'], reverse=True)[:6]
print(f"🎯 TOP 6 TREND-ZAHLEN:")
for i, (number, data) in enumerate(top_trend):
status = self.momentum_scores[number]['status']
print(f" {i+1}. Zahl {number:2}: {data['recommendation']} {status}")
# Häufigste Superzahlen
if self.supernumber_frequencies:
top_sz = self.supernumber_frequencies.most_common(3)
print(f"\n🎲 TOP 3 SUPERZAHLEN:")
for sz, count in top_sz:
percentage = (count / len(self.df)) * 100
print(f" Superzahl {sz}: {count}x ({percentage:.1f}%)")
# Empfohlene Muster
top_patterns = self.pattern_frequencies.most_common(3)
print(f"\n🎨 TOP 3 LOTTO-MUSTER:")
for pattern, count in top_patterns:
percentage = (count / len(self.drawn_combinations)) * 100
print(f" {pattern}: {count}x ({percentage:.1f}%)")
def _export_lotto_tips(self, tips):
"""Exportiert Lotto-Tipps."""
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
output_file = f"ultimate_lotto_6aus49_tipps_{timestamp}.csv"
# Export-Daten erweitern
export_data = []
for tip in tips:
tip_data = tip.copy()
tip_data['trend_scores'] = [self.trend_predictions[n]['prediction_score']
for n in tip['zahlen']]
tip_data['avg_trend_score'] = np.mean(tip_data['trend_scores'])
export_data.append(tip_data)
tips_df = pd.DataFrame(export_data)
tips_df.to_csv(output_file, sep=';', index=False)
print(f"\n💾 LOTTO-EXPORT:")
print("=" * 25)
print(f"✅ Lotto-Tipps gespeichert: {output_file}")
print(f"🎲 Format: 6 Zahlen aus 49 + Superzahl")
print(f"🚀 Ultimate Multi-Trend-Optimierung")
def _print_lotto_analysis_summary(self):
"""Druckt Lotto-Analyse-Zusammenfassung."""
print(f"\n📈 LOTTO 6AUS49 ANALYSE-ZUSAMMENFASSUNG:")
print("=" * 55)
# Top Zahlen
print(f"\n🔢 HÄUFIGSTE LOTTO-ZAHLEN:")
for i, (number, count) in enumerate(self.number_frequencies.most_common(10)):
percentage = (count / (len(self.df) * 6)) * 100
print(f"{i+1:2}. Zahl {number:2}: {count:3}x ({percentage:.2f}%)")
# Top Muster
print(f"\n🎨 ERFOLGREICHSTE LOTTO-MUSTER:")
for pattern, count in self.pattern_frequencies.most_common(5):
percentage = (count / len(self.drawn_combinations)) * 100
print(f" {pattern}: {count}x ({percentage:.1f}%)")
# Hilfsfunktionen (gleich wie Eurojackpot)
def _calculate_trend_score(self, sequence):
if len(sequence) < 2:
return 0
x = np.arange(len(sequence))
y = np.array(sequence)
weights = np.exp(x / len(x))
try:
coeffs = np.polyfit(x, y, 1, w=weights)
return coeffs[0]
except:
return 0
def _calculate_recency_score(self, sequence):
try:
last_hit_index = len(sequence) - 1 - sequence[::-1].index(1)
recency = 1 - (len(sequence) - 1 - last_hit_index) / len(sequence)
return recency
except ValueError:
return 0
def _get_momentum_status(self, score):
if score > 0.4:
return "🔥 SEHR HEISS"
elif score > 0.25:
return "🌡️ HEISS"
elif score > 0.15:
return "😐 WARM"
elif score > 0.08:
return "🧊 KÜHL"
else:
return "❄️ EISKALT"
def _get_prediction_recommendation(self, score):
if score > 0.3:
return "SEHR EMPFOHLEN"
elif score > 0.2:
return "EMPFOHLEN"
elif score > 0.12:
return "NEUTRAL"
else:
return "VERMEIDEN"
def _get_confidence_level(self, score):
if score > 0.3:
return "HOCH"
elif score > 0.2:
return "MITTEL"
else:
return "NIEDRIG"
def _find_pattern_cycles(self, sequence, cycle_length):
cycle_patterns = defaultdict(list)
for i in range(len(sequence) - cycle_length):
pattern = ''.join(sequence[i:i+cycle_length])
cycle_patterns[pattern].append(i)
return {pattern: positions for pattern, positions in cycle_patterns.items()
if len(positions) >= 2}
# Zusätzliche Lotto-spezifische Analysefunktionen
def analyze_lotto_tip_quality(generator, tip_numbers):
"""Analysiert Qualität eines Lotto 6aus49 Tipps."""
quality_score = 0
analysis = {}
# Momentum-Analyse
hot_count = sum(1 for n in tip_numbers if n in generator.hot_numbers)
analysis['hot_numbers'] = hot_count
quality_score += hot_count * 0.15 # Angepasst für 6 Zahlen
# Trend-Analyse
trend_scores = [generator.trend_predictions[n]['prediction_score'] for n in tip_numbers]
avg_trend = np.mean(trend_scores)
analysis['avg_trend_score'] = avg_trend
quality_score += avg_trend * 0.35
# Positions-Analyse (6 Positionen)
position_quality = 0
for i, num in enumerate(sorted(tip_numbers)):
pos_freq = generator.position_frequencies[f'pos_{i+1}'][num]
if pos_freq > 0:
position_quality += pos_freq
analysis['position_quality'] = position_quality
quality_score += (position_quality / len(generator.df)) * 0.25
# Muster-Analyse
pattern = generator._get_lotto_pattern(sorted(tip_numbers))
pattern_freq = generator.pattern_frequencies[pattern]
pattern_score = pattern_freq / len(generator.df)
analysis['pattern'] = pattern
analysis['pattern_score'] = pattern_score
quality_score += pattern_score * 0.25
analysis['total_quality_score'] = quality_score
analysis['quality_rating'] = get_lotto_quality_rating(quality_score)
return analysis
def get_lotto_quality_rating(score):
"""Lotto-spezifische Quality-Ratings."""
if score > 0.7:
return "🏆 LOTTO PREMIUM"
elif score > 0.5:
return "🥇 SEHR GUT"
elif score > 0.35:
return "🥈 GUT"
elif score > 0.2:
return "🥉 DURCHSCHNITT"
else:
return "⚠️ SCHWACH"
def predict_lotto_jackpot_probability(generator, tip_numbers):
"""Schätzt Lotto-Jackpot-Wahrscheinlichkeit."""
base_probability = 1 / 13983816 # Lotto 6aus49 Grundwahrscheinlichkeit
trend_multiplier = 1.0
for number in tip_numbers:
momentum_score = generator.momentum_scores[number]['momentum_score']
trend_score = generator.trend_predictions[number]['prediction_score']
# Lotto-angepasste Gewichtung
number_multiplier = 1 + (momentum_score * 0.08) + (trend_score * 0.12)
trend_multiplier *= number_multiplier
# Pattern-Bonus für Lotto
pattern = generator._get_lotto_pattern(sorted(tip_numbers))
pattern_frequency = generator.pattern_frequencies[pattern] / len(generator.df)
pattern_multiplier = 1 + (pattern_frequency * 0.15)
estimated_probability = base_probability * trend_multiplier * pattern_multiplier
return {
'base_probability': base_probability,
'trend_multiplier': trend_multiplier,
'pattern_multiplier': pattern_multiplier,
'estimated_probability': estimated_probability,
'improvement_factor': (estimated_probability / base_probability)
}
def create_lotto_sample_data():
"""Erstellt Beispiel-Daten für Lotto 6aus49 (für Tests)."""
print("📋 BEISPIEL LOTTO-DATEN ERSTELLEN")
print("=" * 35)
sample_data = []
base_date = datetime.datetime(2020, 1, 4) # Erster Samstag 2020
for i in range(100): # 100 Beispiel-Ziehungen
# Datum (jeden Samstag)
date = base_date + datetime.timedelta(weeks=i)
# 6 zufällige Zahlen aus 1-49
numbers = sorted(random.sample(range(1, 50), 6))
# Superzahl 0-9
superzahl = random.randint(0, 9)
sample_data.append({
'Datum': date.strftime('%d.%m.%Y'),
'Z1': numbers[0], 'Z2': numbers[1], 'Z3': numbers[2],
'Z4': numbers[3], 'Z5': numbers[4], 'Z6': numbers[5],
'SZ': superzahl
})
# CSV speichern
df_sample = pd.DataFrame(sample_data)
sample_file = "lotto_sample_data.csv"
df_sample.to_csv(sample_file, sep=';', index=False)
print(f"✅ Beispiel-Daten erstellt: {sample_file}")
print(f"📊 {len(sample_data)} Lotto-Ziehungen")
print(f"💡 Verwenden Sie diese Datei zum Testen des Generators!")
return sample_file
def main():
"""Hauptfunktion für Ultimate Lotto 6aus49 Generator."""
print("🎲 ULTIMATE LOTTO 6AUS49 GENERATOR")
print("🚀 Mit Multi-Ziehungs-Trend-Analyse")
print("=" * 50)
# Datei-Pfad abfragen
print("📁 LOTTO-DATEN LADEN:")
print("Geben Sie den Pfad zur Lotto 6aus49 CSV-Datei ein.")
print("(Oder drücken Sie Enter für Beispiel-Daten)")
data_path = input("CSV-Pfad: ").strip()
# Beispiel-Daten erstellen falls kein Pfad angegeben
if not data_path:
print("\n🔧 Erstelle Beispiel-Daten für Demonstration...")
data_path = create_lotto_sample_data()
print(f"📂 Verwende Beispiel-Datei: {data_path}")
try:
# Generator initialisieren
generator = UltimateLotto6aus49Generator(data_path)
if not hasattr(generator, 'df') or generator.df is None:
print("❌ Generator konnte nicht initialisiert werden!")
return
# Ultimate Tipps generieren
tips = generator.generate_lotto_ultimate_tips(10)
if tips:
print(f"\n🏆 ULTIMATE LOTTO 6AUS49 OPTIMIERUNG ABGESCHLOSSEN!")
print("=" * 55)
print(f"🎲 10 Ultimate Lotto-Tipps generiert")
print(f"📈 Maximale Trefferwahrscheinlichkeit durch:")
print(f" • Multi-Ziehungs-Momentum-Analyse")
print(f" • Sequenzielle Abhängigkeiten")
print(f" • Zyklische Muster-Erkennung")
print(f" • Lotto-spezifische Optimierungen")
print(f"🍀 Viel Erfolg bei der nächsten Lotto-Ziehung!")
# Erweiterte Analyse (optional)
print(f"\n📊 ERWEITERTE LOTTO-ANALYSE:")
print("=" * 35)
# Beispiel-Analyse für ersten Tipp
if len(tips) > 0:
sample_tip = tips[0]['zahlen']
quality_analysis = analyze_lotto_tip_quality(generator, sample_tip)
probability_analysis = predict_lotto_jackpot_probability(generator, sample_tip)
print(f"\n🔍 BEISPIEL-ANALYSE für Lotto-Tipp 1:")
tip_str = '-'.join([f"{n:2}" for n in sample_tip])
print(f" 🎲 Zahlen: {tip_str} + SZ: {tips[0]['superzahl']}")
print(f" 🏆 Quality: {quality_analysis['quality_rating']}")
print(f" 📈 Score: {quality_analysis['total_quality_score']:.3f}")
print(f" 🔥 Heiße Zahlen: {quality_analysis['hot_numbers']}/6")
print(f" 🎯 Trend-Score: {quality_analysis['avg_trend_score']:.3f}")
print(f" 🎨 Muster: {quality_analysis['pattern']}")
print(f" 📊 Verbesserungs-Faktor: {probability_analysis['improvement_factor']:.2f}x")
# Strategische Empfehlungen
print(f"\n💡 STRATEGISCHE LOTTO-EMPFEHLUNGEN:")
print("=" * 40)
# Top Trend-Zahlen
top_trend = sorted(generator.trend_predictions.items(),
key=lambda x: x[1]['prediction_score'], reverse=True)[:8]
print(f"🎯 TOP 8 TREND-ZAHLEN für kommende Ziehungen:")
for i, (number, data) in enumerate(top_trend):
status = generator.momentum_scores[number]['status']
print(f" {i+1}. Zahl {number:2}: {data['recommendation']} {status}")
# Momentum-Verteilung
very_hot_lotto = [n for n in generator.hot_numbers
if generator.momentum_scores[n]['momentum_score'] > 0.3]
if very_hot_lotto:
print(f"\n🔥 MOMENTUM-ALERT für Lotto:")
print(f" Sehr heiße Zahlen: {very_hot_lotto}")
print(f" → Verwenden Sie 2-3 dieser Zahlen in Ihren Tipps!")
# Superzahl-Empfehlung
if generator.supernumber_frequencies:
top_superzahl = generator.supernumber_frequencies.most_common(3)
print(f"\n🎲 TOP SUPERZAHL-EMPFEHLUNGEN:")
for sz, count in top_superzahl:
percentage = (count / len(generator.df)) * 100
print(f" Superzahl {sz}: {count}x ({percentage:.1f}%)")
else:
print("❌ Keine Tipps generiert!")
except Exception as e:
print(f"❌ Fehler: {e}")
print("💡 Stellen Sie sicher, dass die CSV-Datei korrekt formatiert ist:")
print(" Spalten: Datum, Z1, Z2, Z3, Z4, Z5, Z6, SZ")
if __name__ == "__main__":
# Reproduzierbarer Zufallsseed
random.seed(42)
np.random.seed(42)
# Ultimate Lotto Generator starten
main()