Python Backtesting zur Optimierung einer Handelsstrategie

In diesem Artikel erkläre ich, wie Du Dir eine mächtige Python Backtesting Umgebung aufbaust, die die Grundlage ist um mit Python Backtesting ein gewinnbringendes automatisches Handelssystem zu entwickeln. Die Chancen sind gut, dass Du etwas Ahnung vom Programmieren hast, vielleicht schon einmal in Excel oder Visual Basic erste Schritte gegangen bist oder Dich mit dem Thema Expert Advisor (EA) für Metatrader 4/5 auseinandergesetzt hast. Für ein eigenes (größeres) Programm oder ein eigenes automatisiertes Handelssystem hat es bisher aber nicht gereicht. Lies weiter um zu erfahren wie Du – auch als Anfänger – in wenigen Schritten Deine Trading Signale per Python Backtesting auswerten kannst.

Die Python Backtesting Umgebung

Warum sich Python am besten eignet

Meine Vorstellung: Eine Backtesting Umgebung soll es mir ermöglichen schnell und einfach ein Trading System (also eine Idee die ich habe, ein Regelwerk für Kaufen, Verkaufen und Risikomanagement), z.B ein DAX Handelssystem, auf historische Daten anzuwenden. Die Umgebung / das Programm soll weiter über Optimierungsmöglichkeiten verfügen, mit denen sich Zielgrößen wie maximaler Drawdown oder Performance optimieren lassen. Eine solche Umgebung sollte:

  • Eventbasiert arbeiten („wenn OPEN größer als X, dann …“)
  • Flexibel / leicht zu erweitern sein (eigene Indikatoren und Regeln sind leicht umzusetzen)
  • Über ein Mindestmaß an technischen Indikatoren verfügen (das Rad nicht neu erfinden müssen)
  • Portfolio Performance berechnen können (das ist es ja, um was es geht)
  • Kurs und/oder Trades, ggf. Kapitalentwicklung sowie Indikatoren geeignet visualisieren können (gute Visualisierung hilft dem Gehirn beim Finden neuer Ideen und Trade Signalen)

Grundlagen für erfolgreiches Python Backtesting

Python ist eine sogenannte interpretierte, höhere Programmiersprache, die sich dadurch auszeichnet einen sehr knappen und gut lesbaren Stil (Programmierstil, also in etwa der Schreibstil des Programms) zu haben. Sie ist daher auch für Programmieranfänger und Einsteiger sehr gut geeignet. Achtung: Dieser Blog ist nicht als Python Tutorial zu verstehen – ich dokumentiere hier lediglich wie ich meine Python Backtesting Umbegung aufsetze und nutze.

Unter einer „Umgebung“ oder „Framework“ verstehe ich: eine Ansammlung an Programmen (Tools) und Bibliotheken, die mir eine effiziente Arbeitsweise auf einem bestimmten Themenfeld ermöglichen. Demnach benötige ich für Python Backtesting andere Tools als für die Datenanalyse mit Python oder der Entwicklung einer App für Android. Eine Umgebung für effiziente Büroarbeit wäre z. B. ein Office Paket mit Tabellenkalkulation, Schreib- und Emailprogramm.

Dennoch habe ich (kommt später) einige Ressourcen für Dich verlinkt, die Dir helfen, schneller in das Thema Programmieren mit Python bzw. Programmieren im Allgemeinen einzutauchen. Stehst Du auf Papier, kannst Du hier lesen welches Python Buch für Dich in Frage kommt.

Python als Programmiersprache

Zurück zu Python als interpretierende Programmiersprache. Die deutsche Sprache ist sehr exakt – ich liebe das: Der Duden definiert das Verb „interpretieren“ als „etwas verstehen, auffassen; Äußerungen o. Ä. in bestimmter Weise deuten, auslegen„. Das ist genau das was eine interpretierende Programmiersprache macht: sie liest – zeilenweise – den Programmtext (Quellcode), analysiert (deutet, auslegen) und führt diesen aus. Diese Interpretation erfolgt im Gegensatz zu sogenannten Compilern genau dann, wenn der Benutzer das Programm ausführt (= Übersetzung des Quellcodes zur Laufzeit). Im Gegensatz erstellt (übersetzt) ein Compiler ein Computerprogramm irgendwann (wie  man z. B. am Datum der exe-Datei eins Computerspiels sehen kann) – sie wird dann später vom Benutzer ausgeführt.

Über Vor- und Nachteile interpretierender Programmiersprachen möchte ich an dieser Stelle nicht schreiben, denn die Vorteile mit Python Backtesting zu betreiben überwiegen aktuell für mich alle eventuellen Nachteile (wie oft ein etwas langsameres Programm).

Welche Vorteile hat eine Python Backtesting Umgebung?

Für den Python Backtesting Alltag ist es sehr hilfreich, wenn bestimmte Funktionen als Bibliotheken (englisch libraries, kurz libs) 1. vorhanden sind und 2. leicht verwendet werden können. Einfache Installation dieser Bibliotheken ist eine weitere Erleichterung. Es macht überhaupt keinen Sinn, dass jemand, der z.B. ein DAX Handelssystem backtesten will, sich die Mühe macht ein Chartingprogramm (z. B. für Balken- oder Candlesticks) oder die Vielzahl technischer Indikatoren (aus denen wir später ein Trading Signal erzeugen wollen) selber zu programmieren. Für Python als Programmiersprache gibt es viele nützliche Bibliotheken (= fertige, dokumentierte und getestete Funktionen) kostenlos und einfach zu installieren. Die Vorteile einer Python Backtesting Umbegung sowie Datenanalyse mit Python zu betreiben sind:

  • Interaktiver Modus
  • Tolle Entwicklungsumgebungen wie z. B. Spyder und PyCharm
  • Einfache Paketverwaltung (über Anaconda und pip)
  • Weite Verbreitung, große Community (man bekommt schnell Hilfe, falls ein Problem noch nicht gelöst wurde)
  • Erstellung Grafischer Oberflächen (GUI) möglich

Elemente einer Programmiersprache

Wenn Du noch nie etwas programmiert hast kannst Du Dir das jetzt vielleicht (noch) nicht vorstellen, aber: jede Programmiersprache besteht aus 5 wesentlichen Elementen:

  • Variablen (das sind Platzhalter, in die Werte gespeichert werden)
  • Anweisungen (z. B. die Grundrechenarten Plus, Minus, Mal und Geteilt)
  • Bedingungen (z. B. wenn A größer als B, dann mache …)
  • Schleifen (z. B. zähle von 1 bis 100)
  • Ein- / Ausgabe (z. B. Einlesen eine Excel Datei und Speichern eine JPG Datei)

Mit diesen Bausteinen (und deren Kombination!) lässt sich jedes Computerprogramm – und sei es noch so komplex wie ein Betriebssystem (Windows, Linux, Android, …) oder ein Spiel wie z. B. Anno 1404) erstellen. Wie genau diese Elemente in der jeweiligen Programmiersprache (C#, Java, Python, …) heißen und umgesetzt werden bestimmt der Syntax. Der Syntax ist das Regelwerk, bei einer gesprochenen Sprache mit den Grammatikregeln vergleichbar.

Spyder als Entwicklungsumgebung

Spyder als Entwicklungsumgebung (von englischen IDE für integrated development environment) für Python ist im Grunde ein Texteditor mit großem Funktionsumfang. Prinzipiell kann jedes Programm mit dem Standard Windows Editor geschrieben und als Textdatei gespeichert werden. Die Ausführung des Programms macht immer der Python Interpreter. Für sehr kleine Programme macht es kaum einen Unterschied (Texteditor vs. IDE), sobald Du aber größere Projekte erstellen möchtest, ist eine Entwicklungsumgebung eine enorme Effizienzsteigerung.

Syntaxhervorhebung (Syntax Highlightning)

Bei der Syntaxhervorherbung werden bestimmte Programmelemente farblich hervorgehoben. Schau Dir einmal diese zwei Programme an, beide machen das Gleiche (Ausgabe der Zahlen von 1 bis 10):

    1. Ohne Syntaxhervorhebung
      
      <pre># -*- coding: utf-8 -*-
      """
      Created on Sat Aug 18 07:19:25 2018
      
      @author: steven
      """
      
      def my_func(n=10):
          ' Gibt Zahlen von 1 bis n aus.'
          for i in range(n):
              print(i)
              
      my_func(11)
    2. Mit Syntaxhervorhebung
      # -*- coding: utf-8 -*-
      """
      Created on Sat Aug 18 07:19:25 2018
      
      @author: steven
      """
      
      def my_func(n=10):
          ' Gibt Zahlen von 1 bis n aus.'
          for i in range(n):
              print(i)
              
      my_func(11)
      

Für mich ist klar die zweite Version besser lesbar.

Egal ob Du mit Windows, Linux oder Mac OS arbeitest: Zuerst musst Du einen Python Interpreter installieren. Erinnerung: der Python Interpreter „deutet“ unser Programm und macht alle Berechnungen, Ausgaben usw. Danach werden alle nötigen (und nützlichen) Pakete installiert. Erst am Ende konfigurieren wir uns die Umgebung so damit wir mit Python Backtesting ausüben und automatische Handelssysteme / Trading Roboter testen und optimieren können.

Python Installieren

Python Windows 10 Anaconda Startmenu
Nach erfolgreicher Installation findest Du Anaconda in Deinem Windows Startmenu.

Historisch bedingt – gleichzeitig für uns an dieser Stelle nicht wichtig – gibt es Python Mitte 2018 in zwei teilweise nicht zueinander kompatiblen Versionen: Python 2.7 und Python 3.6. Ich nutze für meinen Python Windows Interpreter die Distribution / Installation über Anaconda mit der Python Version 3.6. Ebenso gibt es Anaconda als Download für Mac und Linux, so dass Du meine Ergebnisse für diese Systeme bei Deinem Python Backtesting leicht übertragen kannst. Nach erfolgreicher Installation (alle Einstellungen auf Standardwerten lassen) findest Du im Startmenü einen Anaconda Navigator, Anaconda Prompt und Anaconda Cloud.

Pakete für Python Backtesting installieren

Zuerst richten wir für unser Python Backtesting eine Virtuelle Umgebung ein. Das Konzept der virtuellen Umgebung bei Python ist leicht erklärt: So kannst Du z. B. für jedes Deiner Projekte (mindestens aber für jede große Python Version 2.7 vs. 3.6) eine sogenannte virtuelle Umgebung (virtual environment) einrichten, welche in Bezug auf Pakete und Paketversionen in sich geschlossen ist. Zwei virtuelle Umgebungen verhalten sich wie zwei Python Installationen auf unterschiedlichen Computern. Pakete, die in die Umgebung für Python 2.7 installiert werden, sind in der Umgebung für Python 3.6 nicht bekannt. Für unser Python Backtesting heißt das, dass wir eine Umgebung einrichten können in der wir beliebige Pakete installieren und testen können – ohne die systemweite Installation zu beeinflussen (und zu gefährden!).

Nach dem Aufruf von Anaconda Prompt öffnet sich eine Windows Kommandozeile (DOS Box), die manche vielleicht noch von früher kennen (für Linux Anwender gehört eine Konsole ohnehin zum Alltag, ebenso ist sie bei Mac OS ein fester Bestandteil – wenn auch der typische Mac Nutzer wenig damit macht).

Mit dem  Befehl conda create --name py36_trading python=3.6 erstellst Du eine neue Umgebung mit dem Namen py36_trading (hier bist Du frei) und der Python Version 3.6 (hier bist Du nicht frei). Mit activcate py36_trading aktivierst Du die Umgebung. (Hinweis: Die Kommandos müssen jeweils mit der Enter Taste bestätigt werden.) Auf der Konsole sieht man anschließend in welcher Umgebung man sich derzeit befindet.

Notwendige Python Pakete

Folgende Pakete sind zwingend notwendig und müssen deshalb installiert werden. Hier ist noch eine kurze Erklärung zu den jeweiligen Paketen und die Befehle wie man diese installiert:

Pandas = Ein- und Ausgabe von Tabellen sowie Funktionen auf Tabellen (etwa wie Excel für Python).

Numpy = Numerische Funktionen aus der Mathematik: z. B. Mittelwerte und Summen aber auch Matrixoperationen.

SciPy = Scientific Python enthält wissenschaftlich-technische Funktionen wie z. B. Fourier Transformationen oder Korrelationsfunktionen.

matplotlib = Eine Bibliothek um Plots erstellen zu können.

spyder = Gute, für Anfänger geeignete, Entwicklungsumgebung (hilft beim Programmieren).

GPyOpt = Enthält Algorithmen (Bayes Optimierung) zur Optimierung.

backtrader = Enthält umfangreiche Python Backtesting Funktionen.

Hinweis: Nach einem Windows Neustart muss nach dem Öffnen der Konsole (Startmenü -> Anaconda Prompt) jedes Mal die Umgebung mit activate py36_tradingaktiviert werden.

  1. Pakete installieren (mit y bestätigen)
    conda install pandas numpy scipy matplotlib spyder
  2. Spyder installieren:
    conda install -c anaconda spyder
  3. GPyOpt & Backtrader installieren
    pip install GPyOpt
    pip install backtrader
  4. Test: Python starten durch Eingabe von python (+ Enter-Taste), dann:
    import GPyOpt
    import backtrader as bt
    quit()(zurück auf die Konsole)
  5. Spyder als Entwicklungsumgebung starten:
    spyder

Startet das Tool (siehe Screenshot) hat alles funktioniert und die Umgebung ist bereit zum Einsatz.

Spyder als Entwicklungsumgebung.

Fazit:

Mit den gezeigten Schritten haben wir eine sehr mächtige Python Backtesting Umgebung aufgebaut. Ich habe mich bewusst für die Bibliothek backtrader entschieden, da sie für mich (als Hobby Programmierer) intuitiv zugänglich und sehr gut dokumentiert ist. In meinem nächsten Beitrag werde ich beschreiben, wie innerhalb dieser Umgebung ein automatisches Handelssystem getestet und mit Hilfe einer Python Machine Learning Library auf Gewinn optimiert werden kann.

Schreibe einen Kommentar