diff --git a/FIXPLAN-2026-07-09.md b/FIXPLAN-2026-07-09.md index 4dfe03e..b653bbb 100644 --- a/FIXPLAN-2026-07-09.md +++ b/FIXPLAN-2026-07-09.md @@ -422,6 +422,51 @@ diese Konten die wertvollsten Signalgeber überhaupt, auch wenn sie selten hande Resolution-Farmer (Winrate 95 %, Einstiege 0,95 → KEIN Trait), Vieltrader mit 90 % Winrate (Frequenzfilter), Kleinwetter (Einsatzfilter). +### D2c. Markt-Rendite-Metriken: Win-Edge UND Loss-Edge (ergänzt 2026-07-11) + +**Motivation:** Die Winrate allein sagt nichts über das Auszahlungsprofil. Ein Arb-Grinder gewinnt 95 % seiner +Märkte mit je +2 %, ein Longshot-Halter gewinnt 25 % mit je +400 % — beide können profitabel sein, aber sie +sind völlig verschiedene Strategien und völlig verschieden zu kopieren. Die Rendite-Verteilung der +abgeschlossenen Märkte ist damit gleichzeitig Strategie-Fingerabdruck UND Grundlage für Position-Sizing +beim Copytrading. + +**Zwei verbindliche Design-Entscheidungen:** +1. **Median führend, Durchschnitt zusätzlich.** Ein einziger 10x-Ausreißer verzerrt den Durchschnitt komplett; + der Median beschreibt den typischen Win. Die Differenz Durchschnitt↔Median ist selbst ein Signal + (Schiefe = seltene Lottogewinne vs. konstantes Mahlen). +2. **Die Verlustseite ist Pflicht, nicht optional.** „90 % Winrate mit +5 % pro Win" ist wertlos, wenn die + 10 % Verluste je −100 % sind (genau das Profil von Resolution-Farmern!). Ohne Loss-Edge ist die Metrik + aktiv irreführend. + +**Berechnung (in der Engine, im selben Durchlauf wie `CalculateMarketWinRates` — dort wird pro +geschlossenem Markt bereits `marketPnl` ermittelt):** +- Pro geschlossenem Markt: `invested` = Summe der Buy-Amounts (inkl. Split-Kosten) über die Outcomes des + Markts; `ReturnPct = marketPnl / invested × 100`. Märkte mit `invested <= 0` (z. B. Buy-Historie durch + Retention gepruned) überspringen — nicht mit 0 verfälschen. +- Aggregation über Wins (ReturnPct > 0) und Losses (ReturnPct < 0) getrennt. + +**Neue Felder auf `TraderAnalytics` (Migration):** +- `MedianWinReturnPct`, `AvgWinReturnPct` +- `MedianLossReturnPct`, `AvgLossReturnPct` (negativ gespeichert) +- `ProfitFactor` (Σ Markt-Gewinne / Σ |Markt-Verluste|; `NULL` wenn keine Verluste) + +**DTOs + UI:** Detailseite bekommt Karten „Median Win / Median Loss" (z. B. „+6,2 % / −38 %") und +„Profit Factor"; die Expectancy pro Markt (`WinRate×MedianWin − (1−WinRate)×|MedianLoss|`) kann das UI +daraus ableiten, wird nicht gespeichert. + +**Abgeleitete Traits (in den `TraderTraitCalculator`, ergänzt die D2-Tabelle):** +| Trait | Regel | +|---|---| +| `thin_margin_wins` | Median-Win-Rendite < 10 % bei ≥ 20 gewonnenen Märkten (Arb-/Grinder-Profil) | +| `high_payoff_wins` | Median-Win-Rendite > 100 % bei ≥ 5 gewonnenen Märkten (Conviction-/Longshot-Profil) | + +**Tests (pure Berechnung):** +- Bekannte Markt-Menge → korrekte Median-/Avg-/ProfitFactor-Werte für Win- UND Loss-Seite. +- Ausreißer-Robustheit: ein einzelner +1000 %-Win verschiebt den Median nicht. +- Markt mit gepruntem Buy (invested = 0) fließt nicht ein. +- Resolution-Farmer-Profil (viele kleine Wins, seltene −100 %-Losses) liefert ProfitFactor nahe 1 — + der Fall, den die Winrate allein verschleiert. + ### D3. Trader-Tiering (`IngestMode`) — Umgang mit Ultra-HF-Tradern (RN1, Swisstony) **Hintergrund:** Ultra-HF-Trader werden heute schon NICHT vollständig erfasst (PollingWorker: 100 Trades/60 s @@ -456,6 +501,8 @@ gegen 300+/min) — das Trade-Replay-PnL ist für diese Klasse bereits falsch un 2. RN1/Swisstony stehen nach der Einstufung auf SnapshotOnly: PnL gefüllt (aus /positions/Leaderboard), Traits gesetzt, **keine neuen Trade-Zeilen** mehr in der DB. 3. Detailseite zeigt Trait-Chips; Traders-Liste filterbar nach Trait. +3b. Detailseite zeigt Median-Win/-Loss-Rendite und Profit Factor; die D2c-Werte sind für Trader mit + abgeschlossenen Märkten gefüllt. 4. Tägliches DB-Wachstum sichtbar reduziert (DB-Size-Anzeige im WinForms-Statusbar beobachten). -Reihenfolge: **D1 → D2 → D3** (bei D3 zuerst Tier C, dann Tier B). +Reihenfolge: **D1 → D2/D2b/D2c → D3** (D2c ist klein und gehört in denselben Engine-Durchlauf wie die Winrate; bei D3 zuerst Tier C, dann Tier B).