ARTIKEL 22
QuantConnect mit Python: Einstieg in algorithmische Handelssysteme
SEO-Titel: QuantConnect mit Python – Einstieg in algorithmisches Trading
Meta-Description: QuantConnect mit Python lernen: QCAlgorithm, initialize, on_data, Wertpapiere, Indikatoren, Orders, Portfolio und Backtests verständlich erklärt.
URL-Slug: /blog/quantconnect-python/
Haupt-Suchbegriff: QuantConnect Python
Weitere Suchbegriffe: QuantConnect Python Tutorial, Python Trading Algorithmus, QCAlgorithm, algorithmisches Trading Python
QuantConnect und Python
Python gehört zu den wichtigsten Programmiersprachen der quantitativen Finanzanalyse.
Die Sprache besitzt ein umfangreiches Ökosystem für:
- Datenanalyse,
- Statistik,
- Machine Learning,
- Visualisierung,
- Finanzmodellierung.
QuantConnect ermöglicht es, dieselbe Sprache auch für die Implementierung von Handelssystemen in der LEAN Engine zu verwenden.
Damit kann ein Quant einen relativ durchgängigen Workflow aufbauen:
Research → Modell → Python-Code → Backtest → Live-System
Grundstruktur eines Python-Algorithmus
Ein einfacher QuantConnect-Algorithmus beginnt mit dem Import der Algorithmusumgebung:from AlgorithmImports import *
Anschließend wird eine Klasse definiert, die von QCAlgorithm erbt:class MyAlgorithm(QCAlgorithm): def initialize(self): pass def on_data(self, data: Slice): pass
Die aktuelle QuantConnect-Dokumentation verwendet diese Python-Namenskonvention.
initialize
Die Methode initialize wird einmal zu Beginn des Algorithmus ausgeführt.
Hier wird die Umgebung konfiguriert.
Beispielsweise:def initialize(self): self.set_start_date(2020, 1, 1) self.set_end_date(2025, 12, 31) self.set_cash(100000) self._symbol = self.add_equity( "SPY", Resolution.DAILY ).symbol
Damit werden unter anderem definiert:
- Backtestzeitraum,
- Startkapital,
- gewünschtes Wertpapier,
- Datenauflösung.
Symbol und Security
add_equity liefert ein Equity- beziehungsweise Security-Objekt.
Das symbol dient als eindeutige Referenz für das Instrument.
Beispiel:self._symbol = self.add_equity("SPY").symbol
Dieses Symbol kann später für:
- Indikatoren,
- Orders,
- Portfoliozugriffe,
- historische Daten
verwendet werden.
on_data
on_data wird aufgerufen, wenn neue Daten entsprechend den Abonnements verfügbar werden.
Beispiel:def on_data(self, data: Slice): if not self.portfolio.invested: self.market_order(self._symbol, 10)
Damit würde der Algorithmus bei entsprechender Ausführung zehn Einheiten kaufen, sofern das Portfolio nicht bereits investiert ist.
Dieses Beispiel zeigt lediglich die technische Struktur.
Es stellt keine Handelsstrategie dar.
Portfolio
Über self.portfolio kann auf den aktuellen Portfoliostatus zugegriffen werden.
Dazu gehören beispielsweise:
- investiert oder nicht investiert,
- Holdings,
- Positionsgrößen,
- nicht realisierte Gewinne und Verluste.
Eine wichtige Trennung besteht zwischen:
Signal
und
Portfolioposition.
Ein Signal sollte nicht unkontrolliert direkt in beliebige Positionsgrößen übersetzt werden.
Orders
QuantConnect unterstützt unterschiedliche Ordertypen und Ordermanagement-Funktionen.
Eine einfache Market Order kann beispielsweise konzeptionell mit:self.market_order(self._symbol, 10)
erzeugt werden.
Bei professionelleren Systemen müssen zusätzlich berücksichtigt werden:
- Limit Orders,
- Stop Orders,
- Order Tickets,
- Updates,
- Cancel-Logik,
- Teilausführungen.
Indikatoren
LEAN enthält zahlreiche technische Indikatoren.
Ein einfacher Moving Average kann beispielsweise in initialize erzeugt werden.self._sma = self.sma( self._symbol, 20, Resolution.DAILY )
Danach kann geprüft werden, ob der Indikator bereit ist und welchen aktuellen Wert er besitzt.
Warum Warm-up wichtig ist
Ein 20-Tage-Indikator benötigt zunächst historische Beobachtungen.
Ohne diese Daten wäre der Indikator unmittelbar nach Start noch nicht vollständig aufgebaut.
LEAN kann Indikatoren deshalb vor dem eigentlichen Handelsbeginn mit historischen Daten aufwärmen.
QuantConnect stellt dafür eigene Warm-up-Funktionen zur Verfügung.
Ein einfaches Beispiel
Ein minimalistisches Lehrbeispiel könnte so aussehen:from AlgorithmImports import * class SimpleMovingAverageAlgorithm(QCAlgorithm): def initialize(self): self.set_start_date(2020, 1, 1) self.set_end_date(2025, 12, 31) self.set_cash(100000) self._symbol = self.add_equity( "SPY", Resolution.DAILY ).symbol self._sma = self.sma( self._symbol, 20, Resolution.DAILY ) self.set_warm_up( 20, Resolution.DAILY ) def on_data(self, data: Slice): if self.is_warming_up: return if not self._sma.is_ready: return if self._symbol not in data.bars: return price = self.securities[self._symbol].price if price > self._sma.current.value: self.set_holdings(self._symbol, 1) elif self.portfolio[self._symbol].invested: self.liquidate(self._symbol)
Dieses Beispiel dient ausschließlich dazu, die Struktur zu demonstrieren.
Es ist kein Beleg dafür, dass eine Moving-Average-Strategie profitabel ist.
set_holdings
Mit set_holdings kann eine gewünschte Portfoliogewichtung angefordert werden.
Beispielsweise:self.set_holdings(self._symbol, 0.5)
würde konzeptionell versuchen, ungefähr 50 Prozent des Portfolios diesem Asset zuzuweisen.
Eine professionelle Strategie sollte die Positionsgröße allerdings aus einem expliziten Risikomodell ableiten.
Liquidation
Eine Position kann beispielsweise mit:self.liquidate(self._symbol)
geschlossen werden.
Auch hier ist zu beachten:
Der Methodenaufruf ist keine Garantie für einen bestimmten Ausführungspreis im Live-Markt.
Historical Data
Historische Daten werden nicht nur für Backtests benötigt.
Sie können auch verwendet werden für:
- Feature-Berechnung,
- Indikatorinitialisierung,
- statistische Schätzungen,
- Regimeanalyse.
History Requests sollten jedoch bewusst eingesetzt werden.
Insbesondere im Live-Trading können sie andere Performanceeigenschaften besitzen als im Backtest.
Scheduled Events
Nicht jede Strategie soll bei jedem neuen Datenpunkt handeln.
Bei einer monatlich rebalancierten Strategie ist es oft sinnvoller, eine geplante Funktion auszuführen.
Scheduled Events können beispielsweise verwendet werden für:
- tägliche Routinen,
- monatliches Rebalancing,
- Marktöffnungslogik,
- Reporting.
Das führt häufig zu saubererem Code als zahlreiche Zeitprüfungen innerhalb von on_data.
Datenauflösung richtig wählen
Eine Tagesstrategie benötigt normalerweise keine Tickdaten.
Umgekehrt kann eine Intraday-Strategie nicht sinnvoll allein mit Tagesdaten modelliert werden.
Die Auflösung sollte deshalb aus dem Anlagehorizont abgeleitet werden.
Gebühren und Slippage
Ein Python-Algorithmus kann historisch hervorragend aussehen und trotzdem wirtschaftlich wertlos sein.
Deshalb sollten im Backtest realistische Modelle verwendet werden für:
- Gebühren,
- Slippage,
- Fills,
- Brokerage-Bedingungen.
LEAN stellt dafür Reality-Modeling-Komponenten bereit.
Debugging und Logging
Während der Entwicklung sind Logging- und Debug-Funktionen hilfreich.
Allerdings sollte ein Live-System nicht jeden einzelnen Datenpunkt ungefiltert protokollieren.
Sinnvolle Logs konzentrieren sich beispielsweise auf:
- Signaländerungen,
- Trades,
- Warnungen,
- Fehler,
- Risikoverletzungen.
Python-Code sauber strukturieren
Je größer das Projekt wird, desto weniger sinnvoll ist es, die gesamte Logik in on_data zu schreiben.
Besser ist eine Modularisierung.
Beispielsweise:main.py signals.py risk.py portfolio.py execution.py
Dadurch lassen sich Research, Risiko und Ausführung besser voneinander trennen.
Klassischer Algorithmus versus Framework
Ein klassischer QCAlgorithm eignet sich gut zum Erlernen der Plattform.
Bei komplexeren Portfoliostrategien kann das Algorithm Framework Vorteile besitzen.
Dort werden:
- Alpha,
- Portfolio Construction,
- Risk Management,
- Execution
in getrennte Module aufgeteilt.
Fehler, die Einsteiger vermeiden sollten
1. Sofort Orders senden
Bevor Indikatoren bereit sind.
2. Zukunftsinformation verwenden
Beispielsweise falsche Datenzeitpunkte.
3. Keine Kosten modellieren
Dies kann Ergebnisse stark verzerren.
4. Alles in on_data schreiben
Das erschwert Wartung und Tests.
5. Backtest als Beweis betrachten
Ein Backtest ist lediglich historische Evidenz.
Empfohlener Lernweg
Für Python-Einsteiger in QuantConnect ist folgende Reihenfolge sinnvoll:
1. QCAlgorithm verstehen
2. add_equity und Symbol
3. on_data
4. Portfolio
5. Orders
6. Indikatoren
7. Historical Data
8. Scheduled Events
9. Backtesting
10. Risk Management
11. Algorithm Framework
12. Live-Trading
Fazit
QuantConnect mit Python ermöglicht es, quantitative Modelle in einer produktionsnahen Umgebung zu implementieren.
Die technische Einstiegshürde ist relativ überschaubar.
Die größere Herausforderung liegt nicht in der Syntax.
Sie liegt darin, ein methodisch belastbares Handelssystem zu entwickeln.
Python ist das Werkzeug.
QuantConnect ist die Infrastruktur.
Die Strategiequalität entsteht durch:
Hypothese → Daten → Validierung → Risiko → saubere Implementierung
Weiterführende Quellen
- QuantConnect Documentation: Getting Started
- QuantConnect Documentation: Initialization
- QuantConnect Documentation: Securities
- QuantConnect Documentation: Trading and Orders
- QuantConnect Documentation: Historical Data
Passendes Fachbuch
Handelssysteme in QuantConnect von Olaf Sund.
Weiterführende Artikel
- QuantConnect auf Deutsch
- Backtesting mit QuantConnect
- QuantConnect Algorithm Framework
- Quant Engineering