Files
Trademind/config/config.example.yaml
T
Tobias Zimmermann d36ed142cf Terminmarktmerkmale, Ollama-Erklärungen, schnelleres Lernen
Drei Erweiterungen aus der vorangegangenen Analyse.

Lerngeschwindigkeit
- background_sample_every_n_bars von 10 auf 5. Gemessen stammen nur rund 3 % der
  Beobachtungen aus echten Trades; diese Stichproben sind der wirksamste Hebel.
  Nicht weiter gesenkt, weil benachbarte Kerzen stark korreliert sind und sich die
  Label-Fenster überlappen - mehr Gradientenschritte heißt dort nicht mehr
  Information.

Funding Rate und Open Interest als Merkmale (strategy.derivatives, standardmäßig aus)
- Vier zusätzliche Merkmale vom Perpetual zum jeweiligen Spot-Paar. Gehandelt wird
  weiterhin Spot, die Kennzahlen kommen über einen zweiten ccxt-Client mit
  defaultType=future.
- Die Zuordnung ist lookahead-frei: Für jede Kerze gilt nur der Wert, der zu diesem
  Zeitpunkt bereits veröffentlicht war.
- Fällt eine Quelle aus oder deckt sie weniger als min_coverage ab, bleiben die
  Spalten neutral. Die Modelldimension bleibt dabei stabil.
- Gemessene API-Grenzen bei Binance: Open Interest reicht 30 Tage zurück, 500 Zeilen
  je Abruf; Funding Rate über ein Jahr. Beide Merkmale sind deshalb einzeln
  abschaltbar.

  ERGEBNIS: kein Nutzen. Zwei Backtests mit identischen Kerzen und Seed -
  5m/20 Tage: Rendite -1,79 % auf -1,90 %, Accuracy 51,2 % auf 50,4 %;
  15m/28 Tage: Rendite -2,22 % auf -2,67 %, LogLoss praktisch unverändert.
  Die Anbindung arbeitet einwandfrei (100 % Datenabdeckung), das Modell gewichtet
  die neuen Merkmale aber nur mit 0,01 bis 0,09 gegenüber 0,39 für ema_spread.
  Die Funktion bleibt aus und ist dafür da, das auf anderen Zeiträumen selbst zu
  prüfen - nicht weil sie sich bewährt hätte.

Ollama-Erklärungen (llm, standardmäßig aus)
- Neuer Dashboard-Bereich und POST /control/explain. Das Modell bekommt den Zustand
  als Text und gibt Text zurück; es entscheidet nichts, beeinflusst keine Order und
  wird nie aus dem Handels-Loop heraus aufgerufen. Der System-Prompt untersagt
  Anlageempfehlungen und Kursprognosen.
- Bewusst nicht als Entscheider: nicht reproduzierbar, kaum backtestbar, und es
  würde die Nachvollziehbarkeit des linearen Modells zerstören.
- Beim Test an qwen3.8:27b zeigte sich ein echter Fehler: Reasoning-Modelle legen
  ihre Denkschritte in ein eigenes Antwortfeld und verbrauchten dafür das gesamte
  Token-Budget, response blieb leer. llm.think ist jetzt standardmäßig false, die
  Fehlermeldung nennt Ursache und Ausweg statt nur "leere Antwort", und für ältere
  Ollama-Versionen ohne das Feld gibt es einen Wiederholungsversuch ohne es.

Bewusst nicht enthalten: News- und Google-Trends-Sentiment. Es fehlt eine Quelle mit
Point-in-Time-Historie; ohne die lässt sich das Merkmal nicht backtesten. Nach dem
Ergebnis oben wäre ein unvalidiertes Merkmal der falsche Schritt.

test_stop_loss_bounds_the_worst_trade läuft jetzt mit strategy.name: rules. Er hing
über die geänderte Voreinstellung an zufälligem Modellverhalten, geprüft werden soll
aber die Stop-Logik.

270 Tests (36 neue), ruff sauber. Gegen echte Binance-Daten und eine laufende
Ollama-Instanz geprüft, Dashboard-Bereich im Browser bedient.
2026-08-23 14:46:24 +02:00

194 lines
10 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ─────────────────────────────────────────────────────────────────────────────
# TradeMind Beispielkonfiguration
#
# Kopieren nach config/config.yaml und anpassen:
# cp config/config.example.yaml config/config.yaml
#
# ${VAR} wird durch die Umgebungsvariable VAR ersetzt (leer = nicht gesetzt)
# ${VAR:-wert} nutzt "wert" als Rückfallwert
# TRADEMIND__A__B überschreibt zusätzlich den Schlüssel a.b (z. B. TRADEMIND__RISK__MAX_OPEN_POSITIONS=5)
# ─────────────────────────────────────────────────────────────────────────────
# paper = simulierte Ausführung auf echten Live-Kursen; das Modell trainiert mit ← Standard
# backtest = historische Daten im Schnelldurchlauf
# live = echte Orders (erfordert live_confirmation + API-Schlüssel)
mode: ${TRADEMIND_MODE:-paper}
log_level: ${TRADEMIND_LOG_LEVEL:-INFO}
# Muss für mode: live wörtlich auf I_UNDERSTAND_THE_RISK stehen. Sicherheitsnetz gegen
# versehentlichen Echtgeldhandel.
live_confirmation: ${TRADEMIND_LIVE_CONFIRMATION}
# ─────────────────────────────── Börsenanbindung ────────────────────────────
# id: jede von ccxt unterstützte Börse. Liste anzeigen mit: trademind exchanges
# binance · binanceus · kraken · krakenfutures · coinbase · bybit · okx
# kucoin · bitget · gate · mexc · bitstamp · bitfinex · huobi · cryptocom · …
exchange:
id: ${TRADEMIND_EXCHANGE:-binance}
api_key: ${TRADEMIND_API_KEY}
api_secret: ${TRADEMIND_API_SECRET}
# Passphrase nötig bei OKX, KuCoin, Coinbase Advanced, Bitget
password: ${TRADEMIND_API_PASSWORD}
# true = Testnet/Sandbox der Börse (soweit unterstützt). Für die ersten Live-Tests dringend empfohlen.
sandbox: ${TRADEMIND_SANDBOX:-true}
enable_rate_limit: true
timeout_ms: 20000
options:
defaultType: spot # spot | swap | future je nach Börse
# ──────────────────────────────── Marktauswahl ──────────────────────────────
market:
# Alle Symbole müssen dieselbe Quote-Währung haben (hier USDT).
symbols:
- BTC/USDT
- ETH/USDT
timeframe: 5m # 1m 3m 5m 15m 30m 1h 2h 4h 6h 8h 12h 1d 3d 1w
history_bars: 500 # Kerzen pro Abfrage (Indikatoren brauchen ≥ 140)
poll_interval_seconds: 20 # wie oft nach einer neuen Kerze gesehen wird
# ───────────────────── Simulation (Modus paper und backtest) ────────────────
paper:
starting_balance: 10000
quote_currency: USDT
fee_rate: 0.001 # 0,1 % Taker-Gebühr pro Seite
slippage_bps: 5 # 5 Basispunkte Ausführungsnachteil
max_volume_participation: 0.1 # max. 10 % des Kerzenvolumens pro Order
# ────────────────────────── Automatisierter Handel ──────────────────────────
trading:
# true = der Bot handelt ab dem Start automatisch (bisheriges Verhalten)
# false = er sammelt Daten und lernt, eröffnet aber erst nach Freigabe im Dashboard
# Positionen. Für den ersten Live-Einsatz die sicherere Wahl.
autostart: true
# Nur mode: live Start des Handels über das Dashboard verlangt die ausdrückliche
# Bestätigung START_LIVE_TRADING. Pausieren geht immer ohne Bestätigung.
require_confirmation_for_live: true
# ──────────────────────────────── Risikoregeln ──────────────────────────────
risk:
max_position_pct: 0.20 # je Position, gemessen an der Equity
max_total_exposure_pct: 0.60 # Summe aller Positionen
max_open_positions: 3
stop_loss_atr_mult: 2.0 # Stop = Einstieg 2 × ATR (0 = kein Stop)
take_profit_atr_mult: 3.0 # Ziel = Einstieg + 3 × ATR (0 = kein Ziel)
trailing_stop_atr_mult: 0.0 # > 0 aktiviert den nachziehenden Stop
max_holding_bars: 0 # 0 = unbegrenzt
max_daily_loss_pct: 0.05 # Notbremse bis zum nächsten UTC-Tag
max_drawdown_pct: 0.25 # Notbremse bis zum Neustart (schließt Positionen)
min_notional: 10 # kleinste sinnvolle Ordergröße in Quote-Währung
cooldown_bars_after_exit: 3 # Pause pro Symbol nach einem Ausstieg
# ───────────────────────────────── Strategie ───────────────────────────────
strategy:
# adaptive = Regelwerk erzeugt Signale, das Lernmodell filtert sie
# rules = nur das Regelwerk, kein Lernen
name: adaptive
rules:
fast_ema: 12
slow_ema: 26
rsi_period: 14
rsi_oversold: 35
rsi_overbought: 70
atr_period: 14
trend_filter_period: 100 # 0 = Trendfilter aus
min_holding_bars: 3 # Signalausstiege erst danach; Stop/Ziel gelten immer
# Zusatzmerkmale aus dem Terminmarkt. Die Daten stammen vom Perpetual zum jeweiligen
# Spot-Paar (BTC/USDT -> BTC/USDT:USDT); gehandelt wird weiterhin Spot.
#
# In zwei Backtests (5m über 20 Tage, 15m über 28 Tage) brachten sie KEINE Verbesserung
# die Anbindung funktioniert, die Merkmale trugen nichts bei. Deshalb standardmäßig aus.
# Zum Selberprüfen einschalten und gegen einen Lauf ohne vergleichen.
#
# Achtung: Ein- und Ausschalten ändert die Anzahl der Merkmale. Ein gespeichertes Modell
# mit anderer Dimension wird verworfen, das Training beginnt von vorn.
derivatives:
enabled: false
funding_rate: true # was Longs den Shorts zahlen, alle 8h
open_interest: true # offene Kontrakte reicht bei Binance nur 30 Tage zurück
oi_change_bars: 12 # über wie viele Kerzen die OI-Veränderung gemessen wird
max_pages: 40 # Obergrenze für Seitenabrufe je Symbol
min_coverage: 0.9 # darunter gilt die Reihe als unbrauchbar und bleibt neutral
learner:
enabled: true
model_path: /data/models/adaptive.npz
entry_threshold: 0.55 # ab welcher Gewinnwahrscheinlichkeit gehandelt wird
exploration_rate: 0.05 # Anteil bewusst gegen das Modell gehandelter Signale
learning_rate: 0.02
l2: 0.0001
replay_size: 5000
batch_size: 64
train_every_n_samples: 5
warmup_samples: 200 # bis dahin entscheidet allein das Regelwerk
label_horizon_bars: 12 # Bewertungsfenster für ein Signal
label_target_bps: 30 # 30 bps = 0,3 % Kursziel gilt als Treffer
trade_sample_weight: 3.0 # echte Trades zählen dreifach gegenüber Shadow-Labels
# Einstiegssignale sind selten. Zusätzliche Stichproben des Marktzustands verkürzen die
# Aufwärmphase von Wochen auf Tage (0 = aus).
# Der wirksamste Hebel für die Lerngeschwindigkeit: Nur rund 3 % der Beobachtungen
# stammen aus echten Trades, der Rest aus diesen Stichproben. Von 10 auf 5 halbiert
# die Zeit bis zur Einsatzbereitschaft.
# Nicht zu klein wählen benachbarte Kerzen sind stark korreliert, unter dem halben
# label_horizon_bars überlappt praktisch jede Stichprobe mit ihrem Nachbarn.
background_sample_every_n_bars: 5
background_sample_weight: 0.5
# Beim Start ein noch untrainiertes Modell aus der Kurshistorie vorlernen, damit der Bot
# nach Sekunden einsatzbereit ist statt nach Tagen (0 = aus).
bootstrap_bars: 3000
freeze_in_live: false # true = im Live-Modus nicht weiterlernen
save_every_n_updates: 50
# ───────────────────────────────── Persistenz ───────────────────────────────
storage:
database_path: /data/trademind.sqlite3
# Im Dashboard geänderte Werte. Liegt im beschreibbaren Datenvolume, weil diese Datei
# hier üblicherweise read-only eingehängt ist. Löschen = alle Änderungen zurücksetzen.
overrides_path: /data/config.overrides.yaml
# ─────────────────────────── Status-Server / Monitoring ─────────────────────
server:
enabled: true
host: 0.0.0.0
port: 8080
enable_metrics: true # /metrics im Prometheus-Textformat
# Steuerbefehle im Dashboard: historisches Nachtraining anstoßen und das
# kontinuierliche Lernen ein-/ausschalten. Auf false setzen für rein lesenden Betrieb.
enable_control: true
# Schützt ALLE Steuerbefehle (Header X-TradeMind-Token). Lesende Endpunkte bleiben offen.
# Dringend empfohlen, sobald der Port nicht nur lokal erreichbar ist.
control_token: ${TRADEMIND_CONTROL_TOKEN}
# ──────────────────────────────── Benachrichtigungen ────────────────────────
notifications:
# Slack- oder Discord-Webhook (leer lassen = aus)
webhook_url: ${TRADEMIND_WEBHOOK_URL}
notify_on_trade: true
notify_on_risk_halt: true
# ──────────────── Erklärungen über ein lokales Sprachmodell (Ollama) ────────
# Fasst auf Knopfdruck zusammen, was die Zahlen zeigen. Hat KEINEN Einfluss auf den
# Handel es entscheidet nichts, es formuliert nur.
llm:
enabled: false
base_url: http://127.0.0.1:11434
model: llama3.2
timeout_seconds: 120
temperature: 0.2
max_tokens: 700
max_answer_chars: 2000
# Reasoning-Modelle (qwen3, deepseek-r1) verbrauchen sonst das gesamte Token-Budget für
# ihre Denkschritte und liefern eine leere Antwort. Für eine Zustandsbeschreibung
# wird kein Reasoning gebraucht.
think: false
# ───────────────────────────── Backtest-Voreinstellungen ────────────────────
backtest:
bars: 5000
start: # z. B. 2024-01-01T00:00:00Z überschreibt bars
end:
csv_dir: # OHLCV aus CSV statt von der Börse (Spalten: timestamp,open,high,low,close,volume)