Add per-market win/loss return metrics (D2c) to FIXPLAN Teil D

Win rate alone hides the payoff profile: an arb grinder (95% wins at +2%)
and a longshot holder (25% wins at +400%) need entirely different copy
strategies. D2c adds median+avg return of won AND lost closed markets,
profit factor, UI cards, and two derived traits (thin_margin_wins,
high_payoff_wins). Median leads (outlier-robust), the loss side is
mandatory — high win rates with rare total losses (resolution farming)
are exactly what the win rate alone obscures.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-07-12 10:30:28 +02:00
co-authored by Claude Fable 5
parent 916c3e17a6
commit 28e112f128
+48 -1
View File
@@ -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), Resolution-Farmer (Winrate 95 %, Einstiege 0,95 → KEIN Trait), Vieltrader mit 90 % Winrate (Frequenzfilter),
Kleinwetter (Einsatzfilter). 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 (1WinRate)×|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) ### 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 **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), 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. Traits gesetzt, **keine neuen Trade-Zeilen** mehr in der DB.
3. Detailseite zeigt Trait-Chips; Traders-Liste filterbar nach Trait. 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). 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).