CI/CD für Trading-Strategien: Continuous Integration meets Trading.
Software-Teams haben in den letzten 15 Jahren gelernt, dass Code, der nicht automatisch getestet und deployed wird, in Produktion zu Risiken führt. Trading-Teams entdecken das gerade erst — und zahlen jeden Monat dafür, dass sie es noch nicht tun. CI/CD macht in Trading-Setups oft den Unterschied zwischen „ich glaube, die Strategie läuft" und „ich weiß, dass die Strategie läuft".
Was CI/CD im Trading-Kontext heißt.
Die Akronyme zuerst:
- CI (Continuous Integration): jeder Push in den Strategie-Code löst automatisch Tests aus. Wenn etwas bricht, weiß ich es in Minuten, nicht beim nächsten Live-Trade.
- CD (Continuous Delivery): das Strategie-Image wird automatisch gebaut, signiert und in eine Registry gepusht. Bereit zum Deploy auf Knopfdruck.
- CD (Continuous Deployment): noch eine Stufe weiter — das gebaute Image wird automatisch auf das Paper-Trading-Setup ausgerollt. Live-Deployment bleibt manuell, immer.
Vollautomatisches Deployment in das Live-Trading-System ist im Retail- und Mandanten-Kontext nicht sinnvoll. Eine Strategie, die unbeobachtet vom Test- in den Live-Account wandert, ist ein Unfallrisiko. CD endet für mich am Paper-Trading-System.
Was getestet wird — drei Test-Kategorien.
Trading-Code zerfällt in Tests, die unterschiedliche Zwecke erfüllen:
- Unit-Tests: einzelne Funktionen — Signal-Generation, Position-Sizing, Stop-Loss-Berechnung. Müssen in unter einer Sekunde laufen und keine externen Systeme brauchen.
- Integration-Tests: das Zusammenspiel mit der Broker-API. Wird gegen einen Sandbox-Endpunkt oder einen Mock gefahren. Dauert Sekunden bis Minuten.
- Regression-Tests für Backtests: ein historischer Backtest läuft auf einem festgelegten Datensatz, Endkennzahlen (Total Return, Sharpe, Max-DD, Trade-Count) werden gegen einen Referenzwert verglichen. Bricht hier etwas, hat sich die Strategie-Logik unbeabsichtigt verändert.
Die dritte Kategorie ist die wichtigste — und die seltenste. Sie ist das Sicherheitsnetz gegen die Klasse von Bugs, bei denen die Strategie noch „läuft", aber andere Trades macht als gestern.
GitHub Actions: ein realistisches Workflow-File.
Wie das in der Praxis aussieht — eine kompakte
.github/workflows/ci.yml für eine Python-Strategie:
name: ci
on:
push:
branches: [main, dev]
pull_request:
branches: [main, dev]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: pip
- name: Install
run: pip install -e ".[dev]"
- name: Lint
run: ruff check .
- name: Unit-Tests
run: pytest tests/unit -q --cov=src --cov-report=xml
- name: Integration-Tests (Sandbox)
env:
BROKER_SANDBOX_KEY: ${{ secrets.BROKER_SANDBOX_KEY }}
run: pytest tests/integration -q
- name: Backtest-Regression
run: |
python -m strategy.backtest \
--data data/regression_2020_2024.parquet \
--check-against baselines/regression.json
Der letzte Schritt ist der entscheidende Trading-spezifische: ein definierter Datensatz, ein definiertes Strategie-Setup, ein definierter Erwartungswert. Weicht der Backtest mehr als z. B. 0,1 % von der Baseline ab, schlägt der Job fehl.
Tägliche Backtest-Re-Runs als Health-Check.
Eine zweite, oft unterschätzte Anwendung: ein nightly job, der jeden Morgen einen kompletten Backtest mit aktuellen Marktdaten fährt und das Ergebnis ins Monitoring kippt. So sehen Sie Daten-Probleme oder Datenfeed-Bugs, bevor sie live Geld kosten:
name: nightly-backtest
on:
schedule:
- cron: "0 5 * * 1-5" # Mo-Fr 05:00 UTC
workflow_dispatch:
jobs:
backtest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: "3.12", cache: pip }
- run: pip install -e ".[dev]"
- name: Pull data
env:
DATA_API_KEY: ${{ secrets.DATA_API_KEY }}
run: python -m data.refresh --days 1
- name: Run rolling backtest
run: python -m strategy.backtest --window 5y --report report.json
- name: Push metrics
env:
PROM_PUSH_URL: ${{ secrets.PROM_PUSH_URL }}
run: python -m monitoring.push report.json
- uses: actions/upload-artifact@v4
with:
name: backtest-report
path: report.json
Die Sharpe-Ratio, der Max-Drawdown und der Trade-Count landen in Prometheus — und ein Grafana-Alert schlägt an, wenn einer der Werte um mehr als zwei Sigma von der historischen Verteilung abweicht. Das fängt Daten-Korruption oft Tage vor dem ersten realen Schaden.
Deployment-Pipeline: dev, paper, live.
Wie eine Strategie von einer Idee bis ins Live-Konto kommt — die Stufen, die ich für Mandanten standardmäßig aufsetze:
- 1. dev: Code auf Feature-Branch, Backtests laufen lokal, CI grün.
- 2. paper: Merge nach
dev, automatisches Deployment auf einen Paper-Trading-Account. Mindestens 3 Werktage Beobachtung, alle Trades werden mit den Backtest-Erwartungen verglichen. - 3. live klein: Manueller Merge nach
mainund Deploy mit reduzierter Positionsgröße (typisch 20 % der Zielgröße). Eine Woche Beobachtung, Vergleich mit Paper-Account und Backtest. - 4. live voll: Skalierung auf Zielgröße, weiterhin tägliches Monitoring von Live-vs-Backtest-Slippage.
Stufe 3 ist die wichtigste — und die, die am häufigsten übersprungen wird. Eine Strategie, die im Paper-Trading sauber lief und bei 20 % Größe live plötzlich Markt-Impact zeigt, verrät sich hier ohne großen Schaden. Bei voller Größe wäre das schon teuer geworden.
Rollback-Strategien.
Wenn etwas live schiefgeht — und das wird passieren — muss der Rollback geübt sein. Drei Stufen, in eskalierender Reihenfolge:
- Hot-Restart der alten Version:
git checkout prod-2029-09-10,docker compose up -d --build. Innerhalb von ein bis zwei Minuten ist die letzte funktionierende Version wieder live. - Kill-Switch: ein simples Flag in der Config (oder ein Endpoint im Bot), das alle offenen Orders cancelt, Positionen optional flattent und neue Signale stoppt. Funktioniert auch, wenn der Rollback selbst nicht mehr startet.
- Vollständiger Stopp:
docker compose down, manuelles Schließen der Positionen über den Broker-UI. Letzte Stufe, aber muss in der Runbook stehen.
Wichtig: alle drei Pfade einmal pro Quartal trocken üben. Ein Rollback, den Sie zum ersten Mal um 14:30 Uhr im Live-Stress ausprobieren, ist kein Rollback — es ist ein zweites Problem zusätzlich zum ersten.
Warum CI/CD den Unterschied macht.
Ohne CI/CD läuft Strategie-Entwicklung typischerweise so: Code-Änderung, lokaler Backtest, „sieht gut aus", Deploy. Drei Wochen später wundert man sich, warum die Live-Performance abweicht. Erst nach drei Tagen Debugging fällt auf, dass eine Hilfsfunktion seit dem letzten Refactoring andere Signale liefert.
Mit CI/CD läuft es so: Code-Änderung, Push, Backtest-Regression schlägt fehl, Merge wird blockiert. Der Bug ist gefunden, bevor er live Geld kostet. Das ist nicht romantisch — aber es ist der Unterschied zwischen „ich glaube" und „ich weiß".
Bei meinen Mandanten ist das Aufsetzen der CI/CD-Pipeline meistens das erste, das ich tue. Vor neuen Strategien, vor Infrastruktur-Upgrades. Wer ohne Sicherheitsnetz iteriert, kann nicht mehr schnell iterieren — er muss vorsichtiger werden, und das bremst.
Sie iterieren Strategien manuell und merken Bugs erst, wenn das Equity-Diagramm komisch aussieht? Erstgespräch buchen — wir bauen die CI/CD, die Ihre Strategie-Entwicklung schneller und sicherer macht.