d36ed142cf
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.
194 lines
10 KiB
YAML
194 lines
10 KiB
YAML
# ─────────────────────────────────────────────────────────────────────────────
|
||
# 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)
|