Recap: Fitness je Versuch
Jeder Versuch wird auf dem Trainingszeitraum (bis 2024-07-01) gesucht und im späteren Testzeitraum (out of sample, OOS) nachgeprüft. Übernommen wird nur, was im Testzeitraum besser ist.
Radj = Rpa · min(1, √(n / 100)) (nur bei Gewinn)
Rpa = Netto € / K / Jahre
| Variable | Bedeutung |
|---|---|
| Netto € | Summe aller Trade-Ergebnisse nach Kursabschlag am Ex-Tag, Ordergebühr 0,25 % je Order, Spread, KESt 27,5 % und Quellensteuer (Anrechnung bis 15 %) |
| K | größtes gleichzeitig gebundenes Kapital |
| Jahre | Länge des Zeitraums |
| n | Anzahl Trades; unter 100 wird ein Gewinn mit √(n/100) gekürzt (kleine Stichprobe) |
| MaxDD | größter Rückgang der aufsummierten Ergebnisse, relativ zu K |
| Laufzeit | Rechenzeit der Bewertung (Code-Effizienz) |
| fehlende Aktien | Aktien unter dem Minimum von 6 mit Trades |
Aktueller Lock: dividend_hopping_v5_stock_test01
Alle Fitnesswerte sind offline aus dem Kurs-Cache mit dem heutigen Kosten-, Steuer- und Euro-Modell auf deinem Portfolio stock_test01 neu gerechnet, damit sie vergleichbar sind. Die damals im Log notierten Werte stehen jeweils darunter. Backtest, keine Anlageberatung.
2026-11-04 · dividend_hopping_v6_props_stock_test01 · Test (nicht übernommen)
- Versuch: Test Eigenschafts-Parameter: gemeinsamer Satz plus Offsets nach Quellensteuer-Klasse, Ausschüttungsrhythmus und Dividendenhöhe; IPOP-CMA-ES, 400 Versuche. Keine Aktie mit 30 Ex-Tagen.
- Commit:
a266e26 - Parameter: Kauf Tage vor Ex 9 · Verkauf Tage nach Ex 9 · Erholungs-Exit max. Zusatztage 11 · Mindestdividende je Ausschüttung 2,85 % · max. Quellensteuer 34,81 % · Studie
dividend_hopping_v6_props_stock_test01 - Fitness Training:
Rpa = 2.827 € / 69.906 € / 2,66 J. = 1,52 %22 Trades · 9 Aktien · Trefferquote 63,64 %
Radj = 1,52 % · min(1, √(22/100)) = 1,52 % · 0,469 = 0,71 %
F = 0,71 % − 0,5 · 1,88 % − 0,01 · 0,001 s/60 s − 0,05 · 0 = -0,0123 - Fitness Test (OOS):
Rpa = 3.346 € / 79.901 € / 2,34 J. = 1,79 %19 Trades · 9 Aktien · Trefferquote 68,42 %
Radj = 1,79 % · min(1, √(19/100)) = 1,79 % · 0,436 = 0,78 %
F = 0,78 % − 0,5 · 2,03 % − 0,01 · 0,001 s/60 s − 0,05 · 0 = -0,0124 - Bewertung: Δ Test-Fitness zum Vorgänger -0,0095 · Lücke Training − Test +0,0001
Walk-forward: Mittel -0.1013 vs. Lock -0.0301, besser in 0/3 Fenstern → verworfen (Test, nicht übernommen)Fenster Test Kandidat Lock Trades K. W1 2024-07-01 – 2025-03-01 -0,2892 -0,1137 4 W2 2025-03-01 – 2025-11-01 0,0097 0,0367 8 W3 2025-11-01 – Cache-Ende -0,0243 -0,0132 7
2026-11-04 · dividend_hopping_v5_stock_test01 · übernommen (Lock)
- Versuch: Neu mit echten Depotgebühren und Umrechnung in Euro: zehn Tage vorher kaufen, sieben danach verkaufen, bei Verlust länger halten.
- Commit:
8d01c80 - Parameter: Kauf Tage vor Ex 10 · Verkauf Tage nach Ex 7 · Erholungs-Exit max. Zusatztage 12 · Mindestdividende je Ausschüttung 0,67 % · max. Quellensteuer 28,20 % · Studie
dividend_hopping_v5_stock_test01 - Fitness Training:
Rpa = 4.172 € / 59.971 € / 2,66 J. = 2,61 %64 Trades · 11 Aktien · Trefferquote 67,19 %
Radj = 2,61 % · min(1, √(64/100)) = 2,61 % · 0,800 = 2,09 %
F = 2,09 % − 0,5 · 5,11 % − 0,01 · 0,001 s/60 s − 0,05 · 0 = -0,0046 - Fitness Test (OOS):
Rpa = 3.683 € / 69.844 € / 2,34 J. = 2,25 %57 Trades · 11 Aktien · Trefferquote 68,42 %
Radj = 2,25 % · min(1, √(57/100)) = 2,25 % · 0,755 = 1,70 %
F = 1,70 % − 0,5 · 3,98 % − 0,01 · 0,000 s/60 s − 0,05 · 0 = -0,0029 - Bewertung: Δ Test-Fitness zum Vorgänger -0,0009 · Lücke Training − Test -0,0018
Damals im Log: Training -0,0046 · Test -0,0029 (anderes Universum bzw. Kostenmodell)
2026-11-04 · dividend_hopping_v4_stock_test01 · übernommen
- Versuch: Optimierung auf dein Portfolio mit 20 Aktien: zehn Tage vorher kaufen, zwei danach verkaufen, nur ab knapp einem Prozent Dividende.
- Commit:
4e1e4f4 - Parameter: Kauf Tage vor Ex 10 · Verkauf Tage nach Ex 2 · Erholungs-Exit max. Zusatztage 7 · Mindestdividende je Ausschüttung 0,92 % · max. Quellensteuer 27,50 % · Studie
dividend_hopping_v4_stock_test01 - Fitness Training:
Rpa = 3.061 € / 49.977 € / 2,66 J. = 2,30 %63 Trades · 11 Aktien · Trefferquote 65,08 %
Radj = 2,30 % · min(1, √(63/100)) = 2,30 % · 0,794 = 1,83 %
F = 1,83 % − 0,5 · 5,33 % − 0,01 · 0,000 s/60 s − 0,05 · 0 = -0,0084 - Fitness Test (OOS):
Rpa = 3.030 € / 59.872 € / 2,34 J. = 2,16 %49 Trades · 11 Aktien · Trefferquote 65,31 %
Radj = 2,16 % · min(1, √(49/100)) = 2,16 % · 0,700 = 1,51 %
F = 1,51 % − 0,5 · 3,42 % − 0,01 · 0,000 s/60 s − 0,05 · 0 = -0,0020 - Bewertung: Δ Test-Fitness zum Vorgänger -0,0044 · Lücke Training − Test -0,0064
Damals im Log: Training 0,0162 · Test 0,0093 (anderes Universum bzw. Kostenmodell)
2026-11-04 · dividend_hopping_v4 · verworfen
- Versuch: Weitere 400 Suchversuche fanden einen Satz mit nur vier Aktien im Testzeitraum; zu eng auf die Vergangenheit angepasst.
- Commit:
d4d6b43 - Parameter: Kauf Tage vor Ex 12 · Verkauf Tage nach Ex 10 · Erholungs-Exit max. Zusatztage 11 · Mindestdividende je Ausschüttung 1,01 % · max. Quellensteuer 19,60 % · Studie
dividend_hopping_v4 - Fitness Training:
Rpa = 2.788 € / 59.934 € / 2,66 J. = 1,75 %47 Trades · 8 Aktien · Trefferquote 65,96 %
Radj = 1,75 % · min(1, √(47/100)) = 1,75 % · 0,686 = 1,20 %
F = 1,20 % − 0,5 · 8,57 % − 0,01 · 0,001 s/60 s − 0,05 · 0 = -0,0309 - Fitness Test (OOS):
Rpa = 5.298 € / 49.943 € / 2,34 J. = 4,53 %39 Trades · 7 Aktien · Trefferquote 71,79 %
Radj = 4,53 % · min(1, √(39/100)) = 4,53 % · 0,624 = 2,83 %
F = 2,83 % − 0,5 · 5,17 % − 0,01 · 0,000 s/60 s − 0,05 · 0 = 0,0024 - Bewertung: Δ Test-Fitness zum Vorgänger +0,0183 · Lücke Training − Test -0,0333
Damals im Log: Training 0,0136 · Test -0,1071 (anderes Universum bzw. Kostenmodell)
2026-11-04 · dividend_hopping_v6_stock_test01 · verworfen (Walk-forward)
- Versuch: IPOP-CMA-ES (Neustarts mit doppelter Population), 400 Versuche; Übernahme nur nach Walk-forward-Regel: Mittel über drei Testfenster besser und mindestens zwei Fenster besser.
- Commit:
a266e26 - Parameter: Kauf Tage vor Ex 11 · Verkauf Tage nach Ex 10 · Erholungs-Exit max. Zusatztage 7 · Mindestdividende je Ausschüttung 1,71 % · max. Quellensteuer 28,92 % · Studie
dividend_hopping_v6_stock_test01 - Fitness Training:
Rpa = 4.206 € / 49.937 € / 2,66 J. = 3,17 %32 Trades · 10 Aktien · Trefferquote 68,75 %
Radj = 3,17 % · min(1, √(32/100)) = 3,17 % · 0,566 = 1,79 %
F = 1,79 % − 0,5 · 4,22 % − 0,01 · 0,000 s/60 s − 0,05 · 0 = -0,0032 - Fitness Test (OOS):
Rpa = 2.574 € / 49.976 € / 2,34 J. = 2,20 %27 Trades · 8 Aktien · Trefferquote 55,56 %
Radj = 2,20 % · min(1, √(27/100)) = 2,20 % · 0,520 = 1,14 %
F = 1,14 % − 0,5 · 5,46 % − 0,01 · 0,001 s/60 s − 0,05 · 0 = -0,0159 - Bewertung: Δ Test-Fitness zum Vorgänger -0,0049 · Lücke Training − Test +0,0127
Walk-forward: Mittel -0.0451 vs. Lock -0.0301, besser in 1/3 Fenstern → verworfenFenster Test Kandidat Lock Trades K. W1 2024-07-01 – 2025-03-01 -0,1621 -0,1137 8 W2 2025-03-01 – 2025-11-01 0,0296 0,0367 10 W3 2025-11-01 – Cache-Ende -0,0028 -0,0132 9
2026-11-03 · Nachtlauf (Code) · übernommen
- Versuch: Bei Verlust am Verkaufstag bis zu zehn Tage länger halten und verkaufen, sobald der Kurs den Kaufkurs wieder erreicht.
- Commit:
cc82ec4 - Parameter: Kauf Tage vor Ex 5 · Verkauf Tage nach Ex 2 · Erholungs-Exit max. Zusatztage 10 · Mindestdividende je Ausschüttung 0,00 % · max. Quellensteuer 100,00 % · Studie
Nachtlauf (Code) - Fitness Training:
Rpa = -7.351 € / 109.584 € / 2,66 J. = -2,52 %93 Trades · 19 Aktien · Trefferquote 59,14 %
Radj = -2,52 % · min(1, √(93/100)) = -2,52 % · 0,964 = -2,52 % (Verlust wird nicht gekürzt)
F = -2,52 % − 0,5 · 9,00 % − 0,01 · 0,001 s/60 s − 0,05 · 0 = -0,0702 - Fitness Test (OOS):
Rpa = 558 € / 89.827 € / 2,34 J. = 0,27 %77 Trades · 19 Aktien · Trefferquote 63,64 %
Radj = 0,27 % · min(1, √(77/100)) = 0,27 % · 0,877 = 0,23 %
F = 0,23 % − 0,5 · 2,66 % − 0,01 · 0,001 s/60 s − 0,05 · 0 = -0,0110 - Bewertung: Δ Test-Fitness zum Vorgänger +0,3048 · Lücke Training − Test -0,0592
Damals im Log: Training -0,0441 · Test 0,0306 (anderes Universum bzw. Kostenmodell)
2026-11-02 · dividend_hopping_v2 · verworfen
- Versuch: Formel bestraft jetzt wenige Trades. Die Suche wählte trotzdem wieder nur zwei britische Aktien; im Testzeitraum negativ.
- Commit:
2ac7584 - Parameter: Kauf Tage vor Ex 15 · Verkauf Tage nach Ex 1 · Erholungs-Exit max. Zusatztage 0 · Mindestdividende je Ausschüttung 0,54 % · max. Quellensteuer 3,00 % · Studie
dividend_hopping_v2 - Fitness Training:
Rpa = 978 € / 19.990 € / 2,66 J. = 1,84 %26 Trades · 3 Aktien · Trefferquote 61,54 %
Radj = 1,84 % · min(1, √(26/100)) = 1,84 % · 0,510 = 0,94 %
F = 0,94 % − 0,5 · 7,67 % − 0,01 · 0,000 s/60 s − 0,05 · 3 = -0,1790 - Fitness Test (OOS):
Rpa = -3.358 € / 19.987 € / 2,34 J. = -7,17 %23 Trades · 3 Aktien · Trefferquote 39,13 %
Radj = -7,17 % · min(1, √(23/100)) = -7,17 % · 0,480 = -7,17 % (Verlust wird nicht gekürzt)
F = -7,17 % − 0,5 · 18,81 % − 0,01 · 0,000 s/60 s − 0,05 · 3 = -0,3158 - Bewertung: Δ Test-Fitness zum Vorgänger +0,0136 · Lücke Training − Test +0,1368 · Hinweis: mögliche Überanpassung
Damals im Log: Training 0,0420 · Test -0,0200 (anderes Universum bzw. Kostenmodell)
2026-11-02 · dividend_hopping · verworfen
- Versuch: Erste Suche mit 30 Versuchen. Sie fand nur zwei britische Aktien, also viel zu wenige Trades für ein verlässliches Urteil.
- Commit:
5c35731 - Parameter: Kauf Tage vor Ex 11 · Verkauf Tage nach Ex 3 · Erholungs-Exit max. Zusatztage 0 · Mindestdividende je Ausschüttung 0,47 % · max. Quellensteuer 8,40 % · Studie
dividend_hopping - Fitness Training:
Rpa = 47 € / 10.000 € / 2,66 J. = 0,18 %26 Trades · 3 Aktien · Trefferquote 61,54 %
Radj = 0,18 % · min(1, √(26/100)) = 0,18 % · 0,510 = 0,09 %
F = 0,09 % − 0,5 · 19,80 % − 0,01 · 0,000 s/60 s − 0,05 · 3 = -0,2481 - Fitness Test (OOS):
Rpa = -3.145 € / 19.989 € / 2,34 J. = -6,72 %23 Trades · 3 Aktien · Trefferquote 34,78 %
Radj = -6,72 % · min(1, √(23/100)) = -6,72 % · 0,480 = -6,72 % (Verlust wird nicht gekürzt)
F = -6,72 % − 0,5 · 22,44 % − 0,01 · 0,000 s/60 s − 0,05 · 3 = -0,3294 - Bewertung: Δ Test-Fitness zum Vorgänger -0,2300 · Lücke Training − Test +0,0813 · Hinweis: mögliche Überanpassung
Damals im Log: Training 0,1421 · Test 0,0530 (anderes Universum bzw. Kostenmodell)
2026-11-02 · Baseline · Referenz
- Versuch: Startpunkt: fünf Handelstage vor dem Ex-Tag kaufen, zwei Tage danach verkaufen, keine Filter.
- Commit:
5c35731 - Parameter: Kauf Tage vor Ex 5 · Verkauf Tage nach Ex 2 · Erholungs-Exit max. Zusatztage 0 · Mindestdividende je Ausschüttung 0,00 % · max. Quellensteuer 100,00 % · Studie
Baseline - Fitness Training:
Rpa = -12.002 € / 79.800 € / 2,66 J. = -5,65 %93 Trades · 19 Aktien · Trefferquote 38,71 %
Radj = -5,65 % · min(1, √(93/100)) = -5,65 % · 0,964 = -5,65 % (Verlust wird nicht gekürzt)
F = -5,65 % − 0,5 · 17,43 % − 0,01 · 0,022 s/60 s − 0,05 · 0 = -0,1437 - Fitness Test (OOS):
Rpa = -5.771 € / 59.923 € / 2,34 J. = -4,11 %77 Trades · 19 Aktien · Trefferquote 41,56 %
Radj = -4,11 % · min(1, √(77/100)) = -4,11 % · 0,877 = -4,11 % (Verlust wird nicht gekürzt)
F = -4,11 % − 0,5 · 11,66 % − 0,01 · 0,001 s/60 s − 0,05 · 0 = -0,0994 - Bewertung: erster Eintrag · Lücke Training − Test -0,0443
Damals im Log: Training nicht gespeichert · Test nicht gespeichert · Gesamt -0,2524 (anderes Universum bzw. Kostenmodell)
Log
Vollständiges Protokoll aus docs/optimization-log.md.
2026-11-04 (5) – Test Eigenschafts-Parameter (Studie dividend_hopping_v6_props_stock_test01, nicht übernommen)
- Gemeinsamer Satz + Offsets Kauf/Verkauf (±3, L1 0,002/Tag) je Eigenschaft: Quellensteuer > 15 %, ≥ 3 Ausschüttungen/Jahr, Rendite je Ausschüttung ≥ 1,5 %. Keine Aktie hat ≥ 30 Ex-Tage im Cache (max. 21) → keine Einzelwerte.
- IPOP 400 Versuche (Pop. 11 → 22). Bester Satz: buy 9, sell 9, recover 11, min_yield 2,85 %, max_wht 34,8 %, Offsets QST +1/+2, DIV +1/+1, RHY 0/0; Train −0,0103.
W1 −0,2892 (Lock −0,1137) · W2 +0,0097 (+0,0367) · W3 −0,0243 (−0,0132); 0/3 besser → Test verworfen.
2026-11-04 (4) – IPOP-CMA-ES + Walk-forward (Studie dividend_hopping_v6_stock_test01)
- IPOP über cmaes 0.13.1 (optunas
restart_strategyist in optuna 5.0 wirkungslos, erster Lauf damit verworfen und Studie gelöscht): Neustart bei 8 Generationen ohne Verbesserung, Population ×2. 400 Versuche: Neustart 0 Pop. 8 (16 Gen.), Neustart 1 Pop. 16 (17 Gen.). - Walk-forward-Fenster (Train < 2024-07-01 fest, Tests außerhalb der Stichprobe): W1 2024-07-01–2025-03-01, W2 2025-03-01–2025-11-01, W3 2025-11-01–Cache-Ende.
- Regel: Übernahme nur, wenn mittlere Test-Fitness > Lock UND in ≥ 2 von 3 Fenstern besser.
- Bester Satz: buy 11, sell 10, recover 7, min_yield 1,71 %, max_wht 28,9 %; Train −0,0032.
W1 −0,1621 (Lock −0,1137) · W2 +0,0296 (+0,0367) · W3 −0,0028 (−0,0132); Mittel −0,0451 vs. −0,0301, 1/3 besser → verworfen, Lock v5 bleibt.
2026-11-04 (3) – Oberfläche im Dalio-Stil, Versuche als JSON-LD
- Neue Startseiten Lock (/), Gewichte, Versuche, Recap, Data (Stil aus /workspace/dalio-static/public/static/style.css); alte Seiten unter /dashboard, /portfolio, /account, /settings, /stock/…, /optimized.
- Versuche: data/trials/trials.jsonld (+ trials-JJJJ-MM-TT.jsonld), Format wie Dalio results/trials.jsonld (ItemList → ListItem → Report). Einmal-Export aller 7 optuna-Studien (3230 Trials) + Log-Abschnitte; scripts/optimize.py schreibt nach jedem Lauf nach.
2026-11-04 (2) – Kosten aus BrokerageAccount.json, EUR-Umrechnung, Ausschlussliste
- Kostenmodell aus data/BrokerageAccount.json: Ordergebühr 0,25 % je Order (Kauf und Verkauf), keine Fixgebühr, KESt 27,5 %; Spread 0,1 % (config, nicht in Datei); FX-Spread 0 % (Parameter
fx_spread_pct). Vorher: 5 € fix je Order + 0,1 % Spread. - EUR-Umrechnung mit yfinance EURSEK/EURCHF/EURGBP/EURUSD=X (Tageskurse 04.11.2021–04.11.2026, Abruf 04.11. 08:32 Wien), Cache gesichert: /workspace/cache-snapshots/cache-2026-11-04-0832.
- BPSO.MI in data/portfolios/excluded_tickers.json.
- Offline-Test (Fetcher wirft immer, refresh=True): alle 19 Aktien + FX aus Cache, 170 Trades.
- Baseline 5/2/R10: Train −0,0702 (−2,52 % p.a., 93 Trades), OOS −0,0110 (+0,27 % p.a., 77 Trades).
- Studie dividend_hopping_v5_stock_test01, 400 Versuche: buy 10, sell 7, recover 12, min_yield 0,67 %, max_wht 28,2 %.
Train −0,0046 (+2,61 % p.a., 64 Trades), OOS −0,0029 (+2,25 % p.a., 57 Trades, MaxDD 3,98 %), 11 Aktien.
2026-11-04 – Nutzerportfolio stock_test01 als Universum
- Loader/Writer
dividendhopper/services/portfolio_schema.py;--universe legacywählt das alte 12er-Universum. - yfinance-Abruf 04.11. ~08:07–08:11 (Wien); Cache vorher gesichert: /workspace/cache-snapshots/cache-2026-11-04-0806.
- 19/20 Ticker auflösbar; BPSO.MI (Banca Popolare di Sondrio, IT0000784196): yfinance 404 / auch per ISIN-Suche nichts.
- Quellensteuer ergänzt: SE 30 %, ES 19 %, LU 15 %.
- Baseline 5/2 (R=10): Train −0,0466 (−1,22 % p.a., 93 Trades), OOS +0,0046 (+1,78 % p.a., 77 Trades), 19 Aktien.
- CMA-ES 400 Versuche, Studie dividend_hopping_v4_stock_test01: buy 10, sell 2, recover 7, min_yield 0,92 %, max_wht 27,5 %.
- Ergebnis: data/portfolios/optimized/portfolio_optimized_2026-11-04.json (+ _latest).
- Offen: keine Währungsumrechnung (CHF/SEK/GBP).
Train +0,0162 (+3,79 % p.a., 63 Trades), OOS +0,0093 (+3,53 % p.a., 49 Trades, MaxDD 3,07 %), 11 Aktien.
2026-11-04 – Nachtlauf (Daten: **Neuabruf** yfinance 04.11.2026 00:37 MEZ, 5 Jahre bis 03.11.2026; Snapshot `/workspace/cache-snapshot-2026-11-04`)
Datenvintage geändert: run_backtest lädt bei Cache > 1 Tag automatisch neu (yfinance diesmal ohne 429). Durch das verschobene 5-Jahres-Fenster fällt im Train 1 Trade weg.
Gelockte Baseline (Commit 2fb7dfe, Default 5/2, R 10) auf neuen Daten: Train F = −0,0447 (98 Trades, R_pa −1,65 %, MaxDD 5,63 %) · OOS F = +0,0304 (82 Trades, R_pa +4,16 %, MaxDD 1,44 %) – vorher (alte Daten) −0,0441 / +0,0306.
| # | Versuch | Train F vorher → nachher | OOS F vorher → nachher | Entscheidung |
| 1 | Strategie S-sma: Kauf nur bei Schluss am Kauftag > SMA(N) der Schlüsse bis einschl. Kauftag (kein Vorgriff; zu kurze Historie = Filter nicht anwendbar). Erwartung vorab: weniger Verlusttrades in Abwärtsphasen, OOS-F ↑ | −0,0447 → −0,0285 (N = 20, auf Train gewählt) | +0,0304 → +0,0141 | verworfen (Patch /workspace/s-sma-2026-11-04.patch) |
| 2 | Code C-window: Ex-Tage außerhalb since/until vor der Kosten-/Steuerrechnung überspringen; Datums-/Kursarrays je Historie memoisieren | −0,0447 → −0,0447 (nur Laufzeitterm) | +0,0304 → +0,0304 | übernommen (9582014): 1,28 → 0,57 ms je Evaluation, Ergebnisse identisch |
| 3 | CMA-ES Studie dividend_hopping_v4 fortgesetzt, +400 Versuche (800 gesamt), Suchraum unverändert | best neu +0,0136 (12/10, min_yield 1,01 %, max_wht 19,6 %, R 11; 22 Trades, 6 Aktien) | −0,1071 (23 Trades, 4 Aktien → Strafterm) | verworfen (OOS < Default) |
SMA-Raster (Train / OOS F, Trades Train/OOS): 0: −0,0447/+0,0304 (98/82) · 10: −0,0354/+0,0112 (51/49) · 20: −0,0285/+0,0141 (53/54) · 50: −0,0440/+0,0211 (61/51) · 100: −0,0559/+0,0299 (61/55) · 150: −0,0545/+0,0270 (58/57) · 200: −0,0640/+0,0272 (66/56). OOS nur zur Diagnose.
Erkenntnis: Der Trendfilter senkt den OOS-MaxDD (1,44 → 0,8–1,2 %) und hebt die Trefferquote, halbiert aber die Trades; der Konfidenzfaktor sqrt(n/100) frisst den Gewinn. Train- und OOS-Optimum liegen bei verschiedenen N (20 vs. 100) → kein robustes Signal. CMA-ES v4 konvergiert auch auf neuen Daten auf denselben Punkt (Achse ausgeschöpft).
Fitnessformel unverändert. pytest 93 grün. Default bleibt 5/2, R 10.
Nächste offene Lücke (andere Achse): Universum erweitern (mehr Dividendentitel aus echten Quellen → mehr Trades, Konfidenz).
2026-11-03 – Nachtlauf (Daten: Cache vom 02.11.2026 09:06 MEZ, kein Neuabruf; yfinance-Netz 429 Too Many Requests)
Gelockte Baseline (Commit f803ed6, Default 5/2): Train F = −0,0649 (99 Trades) · OOS F = +0,0183 (82 Trades, MaxDD 1,90 %).
| # | Versuch | Train F vorher → nachher | OOS F vorher → nachher | Entscheidung |
| 1 | Studie dividend_hopping_v3 fortgesetzt, +400 CMA-ES-Versuche (800 gesamt) | best +0,0026 → +0,0026 (14/10, min_yield 1,0 %, max_wht 26,4 %; neue 400 nur bis −0,0006) | −0,0016 (unverändert) | nicht übernommen – CMA-ES konvergiert, Achse ausgeschöpft |
| 2 | Code/Laufzeit: geparster Kurs-Cache im Speicher (mtime/Größe-Invalidierung) | −0,0649 → −0,0649 | +0,0183 → +0,0183 | übernommen (11579f4): 5,1 → 1,3 ms je Evaluation, Ergebnisse identisch, Laufzeitterm minimal besser |
| 3 | Strategie: Erholungs-Exit recover_days – liegt der Schluss am Verkaufstag unter Kaufkurs, bis zu R weitere Handelstage halten, Verkauf am ersten Schluss ≥ Kaufkurs (sonst Fensterende); nur vergangene Kurse | −0,0649 → −0,0441 (R = 10) | +0,0183 → +0,0306 (MaxDD 1,90 → 1,44 %, Treffer 65 → 82 %) | übernommen (cc82ec4), config.DEFAULT_RECOVER_DAYS = 10 |
| 4 | CMA-ES neue Studie dividend_hopping_v4 (recover_days 0–15 im Suchraum), 400 Versuche | best +0,0148 (12/10, min_yield 1,01 %, max_wht 19,1 %, R 11) | −0,1070 (23 Trades, nur 4 Aktien → Strafterm) | nicht übernommen (OOS < Default +0,0306) |
R-Wahl nur auf Train (R 0/1/2/3/5/8/10/15: −0,065/−0,072/−0,066/−0,082/−0,087/−0,061/−0,044/−0,052); OOS nur zur Diagnose nachträglich: +0,018/+0,005/+0,004/+0,003/+0,014/+0,022/+0,031/+0,024. Kurzes Nachhalten (1–5 Tage) schadet in beiden Perioden, ≥ 8 Tage hilft in beiden → konsistentes Muster, aber kleine Stichprobe (12 Aktien, 5 Jahre).
Fitnessformel unverändert. Mehr Haltetage erhöhen die Spitzen-Kapitalbindung (Train K 59,9 → 79,8 Tsd.), das ist in R_pa bereits berücksichtigt. Hinweis: Verkäufe kurz vor dem Split können bis zu 12 Handelstage in den OOS-Zeitraum reichen (Zuordnung nach Ex-Tag, wie bisher).
Neuer Default (5/2, R 10): Train F −0,0441 · OOS F +0,0306 · gesamt F −0,0196 (181 Trades, Netto p.a. +0,86 %, MaxDD 5,63 %).
Nächste offene Lücke (andere Achse): Einstiegsfilter ohne Vorgriff (z. B. Schluss am Kauftag über gleitendem 50-Tage-Schnitt).
2026-11-02 – Hierarchische Gruppen-Variante (Studie `dividend_hopping_v3_groups`)
Modell: globaler Satz (buy_days, sell_days, min_yield, max_wht) + Offsets je Gruppe auf Kauf-/Haltetage (±3 Handelstage), L1-Regularisierung 0,002 · Σ|Offset| von der Fitness abgezogen. Aufruf scripts/optimize.py --grouped; Default (ohne Flag) bleibt dividend_hopping_v3.
Gruppenwahl (Train-Trades Baseline 5/2, < 2024-07-01): Region US 54 / UK 21 / Eurozone inkl. AT 24; Rhythmus Quartal 84 / jährlich+halbjährlich 15. UK, Eurozone und Nicht-Quartal liegen unter 30 → zusammengelegt zu US (54) und EU = UK+Eurozone (45). tests/universe/stocks.json hat jetzt region, payout (Q/S/A) und group.
CMA-ES 400 Versuche: buy 15, sell 1, min_yield 0,91 %, max_wht 29,0 %; Offsets US (−1, 0) → 14/1, EU (+2, 0) → 17/1. Strafterm 0,006.
| Variante | Zeitraum | Fitness | Trades | Aktien | Netto p.a. | MaxDD |
| Baseline 5/2 | Train | −0,0649 | 99 | 12 | −2,36 % | 8,27 % |
| Baseline 5/2 | OOS | +0,0183 | 82 | 12 | +3,08 % | 1,90 % |
| Global v3 (14/10) | Train | +0,0026 | 39 | 9 | +2,30 % | 2,35 % |
| Global v3 (14/10) | OOS | −0,0016 | 38 | 7 | +3,19 % | 4,26 % |
| Gruppen | Train | +0,0103 | 58 | 10 | +3,71 % | 2,37 % |
| Gruppen | OOS | +0,0079 | 46 | 9 | +4,54 % | 3,37 % |
Entscheidung: OOS-Fitness Gruppen (+0,0079) < Baseline (+0,0183) → nicht übernommen, Default 5/2 bleibt. Besser als global v3 und geringerer Train/OOS-Abstand, aber durch min_yield nur 15 US-Trades im Train.
2026-11-02 – Fitness v3 (neue Studie `dividend_hopping_v3`)
Änderungen: min_trades 50 → 100 (Konfidenz c = min(1, sqrt(n/100))); neu MIN_STOCKS = 6.
- Fitness-Strafterm
0,05 · max(0, 6 − Aktien): abgestuft, damit der Optimierer die Richtung zu breiteren Sätzen sieht. - Optimierung: Versuche mit < 6 Aktien gelten als unzulässig und bekommen
−1 − 0,1·fehlende(stark negativ, aber abgestuft statt geprunt, weil geprunte Trials nicht in das CMA-ES-Update eingehen).
Baseline 5/2, alle 12 Aktien: gesamt F = −0,042 (181 Trades, R_pa −0,06 %, MaxDD 8,3 %).
Train: F = −0,065, 99 Trades, 12 Aktien, R_pa −2,36 %, MaxDD 8,3 % · OOS: F = +0,018, 82 Trades, 12 Aktien, R_pa +3,08 %, MaxDD 1,9 %.
CMA-ES, 400 Versuche, Train < 2024-07-01, OOS ab dann: best buy_days 14, sell_days 10, min_yield 1,00 %, max_wht 26,4 %.
- Train: F = +0,0026, 39 Trades, 9 Aktien, R_pa 2,30 %, MaxDD 2,4 %
- OOS: F = −0,0016, 38 Trades, 7 Aktien, R_pa 3,19 %, MaxDD 4,3 %
- Entscheidung: OOS-Fitness < Baseline-OOS (+0,018) → nicht übernommen, Default 5/2 bleibt.
2026-11-02 – Fitness v2 (neue Studie `dividend_hopping_v2`)
Formeländerung: F = R_adj − 0,5·MaxDD − 0,01·T_norm
R_pa = Σ Netto / K / Jahre, K = Spitzen-Kapitalbindung (max. gleichzeitig offene Einsätze), Jahre = gesamter Backtest-Zeitraum (since/until bzw. Kursdaten). Begründung: Die alte Hochrechnung über die Ø Haltedauer unterstellte dauernd investiertes Kapital zwischen Ex-Tagen und überschätzte die Rendite.R_adj = c·R_pabei R_pa > 0,c = min(1, sqrt(n/50))(Standardfehler ∝ 1/√n). Verluste werden nicht geschrumpft. Begründung: Lauf 1 fand ein Optimum mit nur 18 Trades.- MaxDD jetzt relativ zu K statt zum Ø Einsatz je Trade (deshalb kleinere Werte).
- Alte Studie
dividend_hoppingnicht fortgesetzt (Werte nicht vergleichbar).
Baseline (5/2, alle 12 Aktien, 181 Trades): alt F = −0,252 (R_pa −0,34 %, MaxDD 49,7 %) → neu F = −0,042 (R_pa −0,06 %, MaxDD 8,3 %, K ≈ 59.862, 5,0 Jahre).
CMA-ES, 400 Versuche, Train < 2024-07-01, OOS ab 2024-07-01: best buy_days 15, sell_days 1, min_yield 0,54 %, max_wht 3,0 % (nur UK: Unilever, Shell).
- Train: F = +0,042, 20 Trades, R_pa 7,98 % (adj 5,04 %, c 0,63), MaxDD 1,8 %
- OOS: F = −0,020, 18 Trades, R_pa 1,28 % (adj 0,77 %, c 0,60), MaxDD 5,5 %
- Einschätzung: OOS-Fitness negativ, Trades zu wenige → nicht übernehmen, Default 5/2 bleibt.
2026-11-02 – CMA-ES, 30 Trials, Train < 2024-07-01, OOS ≥ 2024-07-01
Beste Parameter: buy_days=11, sell_days=3, min_yield=0,47 %, max_wht=8,4 % (→ nur UK: Unilever, Shell).
Train-Fitness 0,1421 · OOS-Fitness 0,0530 (Netto p.a. 8,02 %, MaxDD 5,43 %, 18 Trades, 56 % Treffer).
Hinweis: kleine Stichprobe, Überanpassung möglich. Studie: data_opt/optuna.db (nicht versioniert, fortsetzbar).
2026-11-02 – Baseline (buy_days=5, sell_days=2, keine Filter, 12 Aktien)
| Fitness | Netto p.a. | MaxDD | Trades | Trefferquote |
| −0,2524 | −0,34 % | 49,69 % | 181 | 57 % |
Backtest-Output nach Kosten und österreichischer Steuer, keine Anlageberatung.