Python für Forex-Backtesting — Stack, Forschungszyklus und ehrliche Vorbehalte

Zuletzt geprüft: · Zeitloser Inhalt
Risikohinweis · YMYL Dieser Artikel dient ausschließlich zu Bildungszwecken und stellt keine Anlageberatung dar. Der Handel am Forex-Markt birgt ein hohes Risiko des Kapitalverlusts — die ESMA berichtet, dass zwischen 74 % und 89 % der Privatanlegerkonten Verluste erleiden.

MT5s Strategy Tester leistet gute Arbeit, solange deine Strategie in seine Grundannahmen passt — einfache Einstiegsregeln, ein Instrument, keine externe Datenpipeline. Sobald du Broker-fremde Daten einbinden, mehrere Paare zu einem Signal verdichten oder einen Sharpe Ratio neben der Drawdown-Verteilung ausrechnen willst, stößt das Tool an seine Grenzen. Genau deshalb hat die systematisch denkende Trader-Community ihre Backtests seit Jahren in Python. Volle Kontrolle über die Regellogik, wissenschaftliche Bibliotheken, beliebige Datenquellen in einem einzigen Skript — und ein Arbeitsrhythmus, bei dem der Weg von der Idee zur Equity-Kurve nur Minuten dauert.

Warum Trader den Strategy Tester hinter sich lassen

Der Strategy Tester ist gut darin, einen Expert Advisor auf einem Paar und einem Zeitrahmen zu optimieren — und genau dort hört er auch auf. Willst du Nicht-Broker-Daten einmischen, mehrere Paare zu einem gemeinsamen Signal verbinden oder Risiokennzahlen wie den maximalen Drawdown neben dem Profit Factor anzeigen, endet die Arbeit im manuellen Zusammenfügen von CSV-Dateien in Excel. Python fasst das in ein einziges Skript: Broker-Kurse laufen in `pandas`, Makrodaten kommen per `merge` dazu, und Risikokennzahlen stammen aus akademischen Bibliotheken. Den breiteren Kontext zur Automatisierung findest du im Leitfaden zu den ersten Schritten im algorithmischen Trading in unserem Bereich Praktische Werkstatt; die Abwägung zwischen MetaQuotes und Python behandelt der Vergleich von MT5 und Python-Bots in der Rubrik Plattformen & Tools.

Der praktische Stack

Der Stack ist kompakt. Die Datenschicht liegt in `pandas` und `numpy` — `pandas` verwaltet die Zeitreihen und das Resampling von M1 auf H1, `numpy` liefert die vektorisierte Arithmetik hinter den Indikatoren. Als Backtesting-Engine kommt entweder `backtrader` von Daniel Rodriguez zum Einsatz, das in einem event-driven Strategy-und-Cerebro-Stil arbeitet, oder `vectorbt` von Oleg Polakov, wenn du Hunderte von Parameterkombinationen in Sekundenschnelle durchsweepen willst. Für Charts nutzt du `matplotlib` für statische Berichte und `plotly` für interaktive Auswertungen. Historische Kurse fließen über `yfinance` (Tagesschlusskurse), `ccxt` (Kryptomärkte) und das offizielle `MetaTrader5`-Paket (Broker-Notierungen) ins Skript. Der gesamte Stack ist kostenlos und Open Source.

Der Forschungszyklus — von der Regel zur Validierung

Ein Projekt durchläuft vier Schritte, die man sauber trennen sollte. Erster Schritt: Schreib die Ein- und Ausstiegsregeln in klarer Sprache auf — wenn du nicht sagen kannst „Ich kaufe, wenn die EMA-50-Steigung positiv ist und der Schlusskurs über dem Zwanzig-Tage-Hoch liegt", hat das Öffnen eines Editors keinen Sinn. Zweiter Schritt: Übersetze diese Regeln in vektorisierte `pandas`-Ausdrücke — eine Bedingung über eine ganze Spalte, keine Bar-für-Bar-Schleife, weshalb zehn Jahre H1-Daten in Sekunden getestet sind. Dritter Schritt: Lass die Engine auf dem vollständigen Datenbestand mit Provision, Slippage (Kursschlupf), Stop Loss und Take Profit (Gewinnmitnahme) laufen, und lies Equity-Kurve und Trade-Liste ab. Vierter Schritt — den Einsteiger gern überspringen — Out-of-Sample-Validierung: Die letzten zwei Jahre einfrieren, nur auf dem früheren Fenster optimieren, das Urteil aus unberührten Daten ablesen. Die Mechanik des rollierenden Fensters erklärt unser Artikel zur Walk-Forward-Analyse; der allgemeine Rahmen steht im Leitfaden zum Backtesting von Strategien in der Rubrik Handelsstrategien.

Was Python allein nicht leistet

Wer die `backtrader`-Dokumentation liest, könnte annehmen, die Bibliothek erledige alles. Das tut sie nicht. Die Standard-Engine weiß nichts über den Spread deines Brokers, hat keine Ahnung, dass Kurse rund um Nachrichten-Releases fünf Pip auseinanderdriften, und kennt keine ECN-Provision von sieben Dollar pro Lot je Seite. All das tippst du selbst ein — `commission`, `slippage_perc`, ein eigenes Spread-Modell, das nach Tageszeit variiert. Die zweite stille Falle ist Datenqualität: Kostenlose `yfinance`-Reihen haben Wochendlücken, und Dukascopy-Tick-Daten können bei exotischen Paaren lückenhaft sein. Die dritte Fehlerquelle ist die Liebe zur glatten Kurve: Ein In-Sample-Backtest mit fünf optimierten Parametern wirbt fast immer mit 200 Prozent Jahresrendite — bis du eine Variable entfernst und die Kurve auf Daten siehst, die der Optimierer nie gesehen hat. Eine realistische Version zeigt typischerweise 30 bis 50 Prozent weniger als die naive Variante versprochen hat.

Ein illustratives Beispiel — ein hypothetisches EUR/USD-Projekt

Angenommen, du testest eine London-Open-Strategie auf EUR/USD mit M15-Bars: Long-Einstieg, wenn der Kurs nach 09:00 Uhr Warschauer Zeit das Fünf-Bar-Hoch übersteigt, Short-Einstieg beim Unterschreiten des Tiefs; Stop Loss bei 1,5-fachem Zwanzig-Perioden-ATR, Take Profit (Gewinnmitnahme) beim Doppelten des Stops. Du holst Daten von 2018 bis 2024 mit dem `MetaTrader5`-Paket, lädst sie in `pandas` und resamplest auf M15. Der Backtest — mit sechs Dollar Provision pro Lot, einem konstanten Spread von 0,8 Pip außerhalb von Nachrichtenfenstern und einem Pip randomisierter Einstiegs-Slippage — liefert eine Trefferquote von 51 Prozent, Profit Factor 1,28, maximalen Drawdown (Kapitalrückgang) von 14 Prozent und Sharpe 0,9. Teilt man die Historie in vier Jahre In-Sample und zwei Jahre Out-of-Sample auf, sinkt der Out-of-Sample-Mittelwert um etwa ein Drittel — das lässt die Deploymententscheidung auf vertretbarem Boden stehen, ohne spektakulär zu sein. Alle Zahlen sind illustrativ; sie zeigen die Form der Antwort, kein Versprechen.

„Python ist zu einer leistungsstarken Programmiersprache und einem Ökosystem für die Finanzindustrie geworden — von der Analyse von Finanzdaten über algorithmischen Handel bis hin zum Risikomanagement." — Yves Hilpisch, Python for Finance, O'Reilly, 2018

Ehrliche Vorbehalte, die zu jedem Bericht gehören

Wenn der Backtest abgeschlossen ist, füge eine kurze Caveat-Box an. Erstens: welchen Spread du angenommen hast und ob du ihn rund um Makro-Veröffentlichungen aufgeweitet hast — die Differenz zwischen einem flachen 0,8 Pip und einem realistischen 2,5 Pip während des NFP ist oft der gesamte Edge. Zweitens: ob die Daten frei von Look-Ahead-Bias sind, das heißt, ob du einen Indikator auf einem laufenden Bar-Schlusskurs berechnest, den du in Echtzeit noch gar nicht kennen würdest. Drittens: wie viele Parameter du gleichzeitig optimiert hast — fünf ist die Schwelle, ab der selbst Walk-Forward keinen ausreichenden Schutz mehr bietet. Viertens: ob das Ergebnis Out-of-Sample überlebt hat oder nur auf der Gesamthistorie gilt. Ohne diese vier Sätze ist ein Bericht Marketing, kein Audit. Die BaFin weist in ihren Hinweisen für Kleinanleger ausdrücklich darauf hin, dass vergangene Performance — einschließlich backtestbasierter — keine verlässliche Grundlage für künftige Ergebnisse ist. Weitere Facetten der Forschungsroutine beleuchtet der Trader's Workshop auf ForexMechanics.

Was jetzt zu tun ist

  1. Installiere Python 3.11 oder neuer zusammen mit `pandas`, `numpy`, `backtrader`, `matplotlib` und dem offiziellen `MetaTrader5`-Paket — ein einziger `pip install`-Aufruf reicht für den gesamten Stack — und lade dann zwei Jahre H1-Daten für das Paar, das du tatsächlich handelst, herunter und speichere sie als CSV, damit spätere Iterationen auf einer stabilen lokalen Quelle aufbauen können.
  2. Formuliere die Strategie-Regeln zuerst in klarer Sprache — je einen Satz für Einstieg, Ausstieg, Stop Loss und Take Profit (Gewinnmitnahme) — und übertrage sie erst dann in vektorisierte `pandas`-Ausdrücke; der gesamte Test sollte in dreißig Zeilen ohne Bar-für-Bar-Schleife passen, und Parameteroptimierung in diesem Stadium ist fehl am Platz.
  3. Führe den Backtest mit realer Provision, einem konstanten Spread und einem Pip randomisierter Slippage (Kursschlupf) durch und vergleiche das Ergebnis mit einer kostenfreien Version; die Differenz zeigt dir, wie viel des angenommenen Edges ein Artefakt der Midprice-Ausführung ist — wenn die Kosten mehr als die Hälfte des Bruttogewinns aufzehren, ist die Strategie für den Live-Betrieb zu dünn.
  4. Teile die Historie in vier Jahre In-Sample und ein Jahr Out-of-Sample auf, optimiere höchstens zwei Parameter auf dem In-Sample-Fenster, friere den besten Parametersatz ein und führe den Out-of-Sample-Test genau einmal aus; wenn die Trefferquote um mehr als ein Drittel sinkt, vereinfache die Logik, anstatt nach einer besseren Optimierung zu suchen.
  5. Führe ein schlichtes Notizbuch — eine Markdown-Datei im selben Repository — und schreibe nach jedem Backtest vier Sätze: welchen Spread du verwendet hast, ob Indikatoren frei von Look-Ahead sind, wie viele Parameter du eingestellt hast und ob die Out-of-Sample-Equity über der Hälfte des In-Sample-Niveaus geblieben ist; ohne dieses Journal weißt du nach drei Monaten nicht mehr, welcher Bericht ehrlich war.
Jarosław Wasiński
Über den Autor

Jarosław Wasiński

Chefredakteur bei MyBank.pl · Finanz- und Marktanalyst

Unabhängiger Analyst und Praktiker mit über 20 Jahren Erfahrung im Finanzsektor. Gründer und Chefredakteur des Portals MyBank.pl, aktiv seit 2004. Fundamentalanalyse der Devisen- und Makromärkte seit 2007. Schreibt aus europäischer Marktperspektive im regulatorischen Rahmen von ESMA und BaFin.

Quellen und Literatur

  1. Backtrader Backtrader documentation — Introduction · oficjalna dokumentacja open-source'owej biblioteki Daniela Rodrigueza: model event-driven, klasy Strategy i Cerebro, integracja danych www.backtrader.com ↗
  2. vectorbt vectorbt usage documentation · oficjalny przewodnik po wektorowym backtestowaniu w numpy/pandas — przykłady i sweep parametrów vectorbt.dev ↗
  3. O'Reilly Media Yves Hilpisch — Python for Finance, 2nd Edition (2018) · kanoniczna pozycja o zastosowaniach Pythona w analityce finansowej, algorytmice i zarządzaniu ryzykiem www.oreilly.com ↗
  4. MQL5 MetaTrader 5 Python Integration — official reference · oficjalne API pakietu MetaTrader5: pobieranie historycznych OHLC i tików, dostęp do konta i składanie zleceń z Pythona www.mql5.com ↗
  5. pandas pandas — Time series / date functionality · referencja czasu w pandas: konwersje, resampling, indeksowanie i przesunięcia używane w każdym backteście pandas.pydata.org ↗

Häufig gestellte Fragen

Brauche ich fortgeschrittene Python-Kenntnisse, um anzufangen?

Python-Grundlagen genügen — Schleifen, Listen, Funktionen, Bibliotheken importieren und eine CSV einlesen. Den Rest lernst du unterwegs, denn jedes Backtesting-Projekt nutzt dieselbe Handvoll Operationen: Daten laden, resampling, Indikator berechnen, Einstiegsbedingung definieren, Ergebnisse aggregieren. Eine erste Strategie passt meist in dreißig Codezeilen, deshalb hat es keinen Sinn, auf das „vollständige Beherrschen von Python" zu warten. Der gesündere Rhythmus ist es, zwei Stränge parallel zu verfolgen: einen kurzen Grundlagenkurs (vier bis sechs Wochen à eine Stunde täglich) und das konkrete Projekt, an dem du gerade übst. Wenn du eine Excel-Tabelle mit Formeln bauen kannst und weißt, was eine Funktion ist, hast du das Minimum — pandas ersetzt das Tabellenblatt nahezu vollständig, arbeitet schneller und erlaubt eine saubere Out-of-Sample-Validierung.

Warum backtrader statt vectorbt wählen — oder umgekehrt?

Die beiden Bibliotheken folgen unterschiedlichen Philosophien. Backtrader ist event-driven: Die Engine läuft Bar für Bar, ruft die next()-Methode deiner Strategy-Klasse auf und spiegelt den realen Handelsfluss wider — Positionsmanagement, Trailing Stops oder Teilaufstiege lassen sich so problemlos einbauen. Der Preis dafür ist Geschwindigkeit: Zehn Jahre M5-Daten auf einem einzigen Paar können einige Minuten dauern. Vectorbt geht den entgegengesetzten Weg — du drückst die gesamte Strategie als vektorisierte Operationen auf pandas-Spalten aus, die Engine rechnet alles parallel in numpy durch, und ein Sweep über hundert Parameterkombinationen ist in Sekundenbruchteilen fertig. Der Preis ist der Ausdrucksrahmen: komplexe Einstiegslogik, die vom Portfolio-Zustand abhängt, lässt sich schwerer abbilden. In der Praxis halten erfahrene Trader beide bereit — vectorbt für schnelle Exploration und Parametersweeps, backtrader für die finale Validierung des besten Kandidaten mit einem realistischen Provisions- und Slippage-Modell.

Woher bekomme ich zuverlässige historische Daten?

Drei Quellen, in der Reihenfolge des gesunden Menschenverstands. Erste: das offizielle MetaTrader5-Paket — du bekommst die History direkt von deinem eigenen Broker, sodass Spread, Swap (Rollover) und Provision im Backtest dem entsprechen, was du später auf dem Live-Konto siehst. Das ist die ehrlichste Option für jede Strategie, die du tatsächlich einsetzen willst. Zweite: Dukascopy veröffentlicht Tick- und M1-Daten für die wichtigsten Paare seit 2003 — institutionelle Qualität, aber die Spreads stammen von der Dukascopy-Plattform, nicht von deinem Broker. Dritte: yfinance für Tagesschlusskurse und ccxt für Kryptomärkte — beide taugen für Prototyping, aber die Wochendlücken und gelegentlich fehlenden Minuten schließen sie für die Validierung von Intraday-Strategien aus. Halte die Quelle jedes Mal im Skript-Header fest, damit du sechs Monate später noch weißt, worauf der Bericht basierte — ein kleines Detail, das die Arbeit bei jedem Audit rettet.

Woran erkenne ich, dass ein Backtest zu gut ist, um wahr zu sein?

Vier Signale reichen. Erstes: eine Trefferquote über 75 Prozent bei mehr als zweihundert Trades — das ist außerhalb des Scalpings in sehr engen Märkten praktisch unerreichbar; das Ergebnis deutet auf Look-Ahead-Bias oder einen Datenfehler hin. Zweites: eine Equity-Kurve ohne nennenswerte Rücksetzer — reale Strategien haben zweistellige Drawdowns (Kapitalrückgänge), eine glatte Aufwärtslinie ist ein Curve-Fit-Warnsignal. Drittes: ein Profit Factor über 3,5 — extrem selten im Forex-Markt, wo allein der ECN-Spread einen zweistelligen Anteil des Edges aufzehrt. Viertes: starke Parameterempfindlichkeit — wenn das Verschieben der Periode eines gleitenden Durchschnitts von 14 auf 12 das Ergebnis zum Einsturz bringt, hat die Strategie das Rauschen gelernt, nicht die Struktur. Wenn zwei der vier Signale gleichzeitig aufleuchten, ist der Bericht unabhängig von den Headline-Metriken verdächtig; vereinfache die Logik, wirf einen oder zwei Parameter heraus und führe den Test erneut auf Out-of-Sample-Daten durch.

Tiefer eintauchen · der vollständige Leitfaden