Files
PolyTraderSharp/docs/umsetzungsplaene/UMSETZUNGSPLAN-StrategieDrift.md
T
RichardandClaude Opus 4.8 c5f0b1d188 Docs: Konzepte/Plaene in docs/ mit Typ-Unterordnern buendeln
Root aufgeraeumt: alle Konzept-/Plan-/Fach-Dokumente nach docs/ verschoben,
organisiert nach Typ (wie fuer ein separates Docs-Repo vorgeschlagen, aber bewusst
in diesem Repo, damit Plan->umsetzende-Commits nachvollziehbar bleiben):
- docs/konzepte/       (KONZEPT-*)
- docs/umsetzungsplaene/ (UMSETZUNGSPLAN-*)
- docs/ideen/          (fruehe Ideen, Platzhalter)
- docs/pruefplaene/    (PRUEFPLAN-*)
- docs/steuer/         (Steuer-/Buchhaltungs-Doks, z.B. US-CPA-Fragebogen)
- docs/README.md       (Index/Konventionen)

Getrackte Plaene als Rename verschoben (History erhalten); zuvor untracked Konzept-/
Plan-Dateien jetzt versioniert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 10:15:08 +02:00

5.4 KiB
Raw Blame History

Umsetzungsplan: Strategie-Drift-Erkennung für Master-Trader (B-S2)

Stand: 2026-07-11 Ziel: Verhaltens-Änderungen eines Masters erkennen, BEVOR sie sich im Copy-PnL niederschlagen. Die bestehende Auto-Pause (Copy-PnL-basiert) ist ein nachlaufender Indikator — bei 95-¢-Tradern sieht man den Schaden erst nach mehreren Verlusten. Verhalten läuft dem PnL voraus: Ein Wetter-Bot, der plötzlich Politik-Longshots kauft, hat die Strategie gewechselt, lange bevor die Verluste messbar sind. Modul: PolyTrader.Modules.CopyTrading (baut auf vorhandenem MasterTraderAnalyticsJob auf).


1. Der Verhaltens-Fingerprint

Je Master werden zwei Fenster verglichen: Referenz (30 Tage bzw. die von Predictalytics gelieferte Baseline) vs. aktuell (7 Tage). Datenquelle: die Activity-/History-Daten, die der MasterTraderAnalyticsJob bereits lädt (mod_copytrading_mt_history + Data-API-Activity; für Preisband/Größe die Activity-Items — Felder existieren in den bereits geparsten JSONs).

Fingerprint-Metriken (pure Klasse Logic/TraderFingerprint.cs, voll unit-getestet):

Metrik Definition Drift-Beispiel
TradesPerWeek Trade-Frequenz Bot-Betreiber wechselt von 40 auf 400/Woche
CategoryMix Einsatz-Anteil je Kategorie (Vektor) Wetter-Bot kauft plötzlich Politik
PriceBandMix Einsatz-Anteil je Einstiegs-Preisband (10-¢-Bänder) Favoriten-Halter kauft Longshots
MedianHoldHours Median Haltedauer (Kauf→Close/Resolution) Halter wird Day-Trader
SellRatio Anteil aktiv verkaufter Positionen „Stur-Halter" beginnt zu verkaufen
SizeP90Rel 90. Perzentil Positionsgröße relativ zur Referenz Martingale-/Tilt-Muster

Drift-Score

Pro Metrik eine normierte Abweichung (für Anteils-Vektoren: L1-Distanz / 2 → 0..1; für Skalare: |akt ref| / max(ref, ε) gekappt auf 1). Gesamt:

DriftScore = gewichtete Summe (Default-Gewichte: CategoryMix 0.3, PriceBandMix 0.25,
             SellRatio 0.2, TradesPerWeek 0.1, MedianHoldHours 0.1, SizeP90Rel 0.05)

Schwellen (global in CopyTradingState, per PropertyGrid änderbar, mit [Description]): DriftWarnScore (Default 0.25) und DriftPauseScore (Default 0.5). Mindeststichprobe: unter 10 Trades im 7-Tage-Fenster keine Bewertung (Rauschen).

2. Aktionen bei Drift

Stufe Bedingung Aktion
Beobachten Score < Warn nichts; Score in UI-Spalte sichtbar
Warnen Warn ≤ Score < Pause Threema-Meldung mit den 2 größten Abweichungen („Kategorie-Mix: Wetter 90→40 %, Politik 0→45 %"); Master in UI gelb
Neu-Trades pausieren Score ≥ Pause UND AutoPauseEnabled NEUE BUYs dieses Masters aussetzen (DriftPaused-Flag auf TrackedTrader, Engine-Check im BUY-Pfad analog ExitPending); offene Positionen + SELL-Handling laufen normal weiter; Threema; Reaktivierung manuell

Bewusst: Drift pausiert nur Neu-Käufe — es verkauft nichts. Bestehende Positionen sind Sache der normalen Exit-Mechanik (Halter: Resolution).

3. Umsetzung

Slice D-1: Pure Logik + Persistenz

  • Logic/TraderFingerprint.cs: Compute(IEnumerable<TradeObservation>) → Fingerprint; Drift(reference, current) → Score + Top-Abweichungen. Unit-Tests (Vektor-Distanzen, Mindeststichprobe, Rand: leere Referenz).
  • TrackedTrader: Felder FingerprintBaselineJson (Referenz, von Predictalytics importierbar ODER selbst aus 30 Tagen berechnet), DriftScore, DriftPaused, DriftDetail (Kurztext) + Migration.
  • MasterTraderHistoryRecord erweitern um die dafür nötigen Felder (EntryPrice-Band, Kategorie, Size, Haltedauer), sofern noch nicht vorhanden — beim History-Download mit befüllen (Daten sind in den API-Antworten enthalten).

Slice D-2: Job-Integration

  • Im MasterTraderAnalyticsJob nach dem History-Download: Fingerprint aktuell (7 T) vs. Referenz (30 T bzw. BaselineJson) → Score, Aktionen gemäß Tabelle.
  • Frequenz: Der Job läuft 12-stündlich — für Drift zu träge. Leichten Stunden-Tick ergänzen (nur Fingerprint-Neuberechnung aus bereits geladenen History-Daten, KEINE zusätzlichen API-Calls; die 12-h-Läufe aktualisieren die Rohdaten).
  • Referenz-Handhabung: Baseline wird NICHT automatisch nachgezogen, solange eine Warnung/Pause aktiv ist (sonst „lernt" die Referenz die Drift). Nach manueller Entwarnung: Baseline auf aktuelles 30-T-Fenster zurücksetzen (Button in UI).

Slice D-3: Engine + UI

  • Engine-BUY-Pfad: DriftPaused-Check (analog IsActive), TradeReasoning-Log.
  • MastersTradersView: Spalten DriftScore (mit Ampelfarbe) + DriftDetail; Kontextmenü „Drift entwarnen + Baseline zurücksetzen".

4. Akzeptanzkriterien

  1. Unit-Tests: konstruierte Drift-Szenarien (Kategorie-Wechsel, Frequenz-Explosion, Longshot-Umstieg) erzeugen erwartete Scores; stabile Master bleiben < Warn.
  2. Simulierter Kategorie-Wechsel in Testdaten führt zu DriftPaused + Engine verweigert Neu-BUY mit nachvollziehbarem Log.
  3. Kein zusätzlicher Data-API-Traffic durch den Stunden-Tick (nur DB/RAM).
  4. Threema-Meldungen enthalten die konkreten Top-Abweichungen, nicht nur den Score.

5. Abgrenzung

  • Ersetzt NICHT die PnL-Auto-Pause (Phase 3.3, bleibt) — Drift ist das Frühwarnsystem, PnL-Pause das Sicherheitsnetz.
  • Sniper-Metriken (Plan Phase 3.2, Median-Haltezeit via Activity-Pagination) sind ein Spezialfall dieses Fingerprints — bei Umsetzung zusammenlegen statt doppelt bauen.