Kapitel 1. Finanzdaten in Python importieren und verarbeiten

Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com

In diesem Kapitel geht es darum, die Grundlagen für die Analyse von Finanzdaten durch Kodierung zu schaffen. Das erfordert einige Vorbereitungen, z. B. das Herunterladen der richtigen Software und das Erstellen eines Algorithmus, der historische Daten automatisch abruft.

Am Ende dieses Kapitels solltest du wissen, wie du mit Python automatisch historische Finanzdaten importieren kannst. Also lass uns loslegen.

Installation der Umgebung

Der erste Schritt besteht darin, die Umgebung und alles andere vorzubereiten, was für den Erfolg der Algorithmen notwendig ist. Dafür brauchst du zwei Programme:

  • Ein Python-Interpreter, mit dem du Code schreiben und ausführen kannst
  • Charting- und Finanzsoftware, die du als Datenbank verwendest

Beginnen wir mit dem Python-Interpreter. Ich verwende eine Software namens SPYDER. Manche Leute sind vielleicht mit anderer Software wie Jupyter und PyCharm vertrauter, aber der Prozess ist derselbe. Du kannst SPYDER von der offiziellen Website herunterladen oder, noch besser, als Teil eines größeren Pakets namens Anaconda, das die Installation erleichtert und mehr Tools bietet. Beachte, dass es sich um eine Open-Source-Software handelt, die kostenlos genutzt werden kann.

Die Oberfläche von SPYDER ist in drei Fenster aufgeteilt, wie du in Abbildung 1-1 sehen kannst. Das linke Fenster dient dazu, den Code zu schreiben, der später ausgeführt wird (der Algorithmus wird angewiesen, den Code auszuführen und anzuwenden). Normalerweise siehst du in diesem Bereich mehrere Codezeilen.

Das Fenster oben rechts ist der Variablen-Explorer. Jedes Mal, wenn eine Variable gespeichert wird, kannst du sie dort sehen. Das Fenster unten rechts ist die Konsole, die das Ergebnis des Codes anzeigt, egal ob es sich um einen Fehler oder eine Ausgabe handelt.

Abbildung 1-1. SPYDERs Schnittstelle

Die Arten von Daten, die du definieren und im Code verwenden kannst, werden in mehrere Kategorien eingeteilt:

Ganze Zahlen
Dies sind ganze Zahlen, die entweder positiv oder negativ sein können. Beispiele sind -8 und 745. Sie sind jedoch auf einen Bereich zwischen -2147483648 und 2147483647 beschränkt. Jede Zahl, die außerhalb dieses Bereichs liegt, wird als ein anderer Datentyp betrachtet, der als Long bezeichnet wird. Der Unterschied zwischen den Datentypen hat mit dem Speicherplatz zu tun. Ganzzahlen haben eine Breite von 32 Bit, während Longs 64 Bit breit sind.
Schwimmer
Dies sind reelle Zahlen mit Dezimalstellen wie 18,54 und 311,52.
Strings
Das sind Wörter, die in einer Variablen gespeichert sind. Wissenschaftlicher ausgedrückt, handelt es sich um eine Reihe von strukturierten Zeichen (Text). In Python schreibst du Zeichenketten zwischen einfachen oder doppelten Anführungszeichen.

In Zeile 1 des Codes in Abbildung 1-1 habe ich eine Variable namens age definiert und sie auf 13 gesetzt. Wenn du diesen Code ausführst, solltest du sehen, dass im Variablen-Explorer die Variable age mit dem Typ int (Ganzzahl) und dem Wert 13 erstellt wurde. In Zeile 3 habe ich den Code ausgeführt, der die Variable height mit dem Wert 184,50 (also einem Float-Datentyp) definiert.

Beachte, dass ich neben der Definition der Variable den Satz in centimeters geschrieben habe, dem ein Hashzeichen vorangestellt ist. Das nennt man einen Kommentar. Kommentare sind in Python sehr wichtig, um den Code zu erklären. Deshalb wird alles, dem ein # vorangestellt ist, nicht ausgeführt. Im Variablen-Explorer kannst du die Variable height mit dem Typ float sehen. In Zeile 5 wird eine Zeichenkette definiert, die im Variablen-Explorer als Typ str (String) angezeigt wird. In der Konsole kannst du sehen, dass der Code erfolgreich ausgeführt wurde, da es keine Fehler gibt, die in rot angezeigt werden würden.

Der nächste Schritt bei der Vorbereitung der Umgebung ist die Installation der Charting-Software, mit der du historische Daten in SPYDER importieren kannst. In diesem Buch verwende ich MetaTrader 5, ein Benchmark-Chartprogramm, das von vielen Tradern auf der ganzen Welt genutzt wird. Befolge diese Schritte:

  1. Lade SPYDER herunter und mache dich mit seiner Funktionsweise vertraut.
  2. Lade die MetaTrader 5 Software herunter.
  3. Verwende SPYDER, um historische Kurse aus dem MetaTrader 5 zu importieren.

Lade den MetaTrader 5 von der offiziellen Website herunter und installiere ihn. Du musst ein Demokonto einrichten, das einfach ein virtuelles Konto mit imaginärem Geld ist. Das Wort Demo bezieht sich nicht auf eine begrenzte Dauer der Nutzung, sondern auf die Tatsache, dass kein echtes Geld verwendet wird.

Um ein Konto zu eröffnen, wähle Datei > Konto eröffnen, wähle MetaQuotes Software Corp. und klicke dann auf Weiter. Als Nächstes wählst du die erste Option, um ein Demokonto zu eröffnen; damit kannst du mit virtuellem Geld handeln. Zum Schluss gibst du einige grundlegende Informationen wie Name, E-Mail und Kontotyp ein. Du erhältst keine Bestätigungsanfrage oder irgendeine Art von Bestätigung, denn die Demo sollte direkt starten und du kannst die Charts sehen.

Abbildung 1-2 zeigt die Oberfläche der Plattform. Standardmäßig zeigt MetaTrader 5 nicht alle Märkte an, die er abdeckt. Daher musst du sie bei Bedarf für den Import und die Visualisierung zugänglich machen. Klicke auf Ansicht, klicke auf Marktbeobachtung und klicke dann mit der rechten Maustaste auf eines der Symbole, die in der neuen Registerkarte angezeigt werden, und wähle Alle anzeigen. Auf diese Weise kannst du die erweiterte Liste mit mehr Märkten sehen.

Abbildung 1-2. Die Oberfläche von MetaTrader 5

Erstellen des Importalgorithmus

Die Möglichkeit, mit automatisch historische Daten beliebiger Zeiträume abzurufen, ist eine wunderbare Zeitersparnis, denn so kannst du dich auf die Recherche und Analyse konzentrieren, anstatt wertvolle Zeit mit der Beschaffung und Bereinigung der Daten zu verschwenden. Lass uns eine Reihe von Funktionen erstellen, die die historischen Daten eines ausgewählten Vermögenswerts fast sofort importieren.

Bevor du zum Programmieren kommst, musst du die MetaTrader 5 Python Integrationsbibliothek installieren, damit du sie später in SPYDER nutzen kannst. Das ist ganz einfach und erfordert nur einen Schritt. Öffne die Eingabeaufforderung von Anaconda und gib pip install Metatrader5 ein, wie in Abbildung 1-3 gezeigt.

Abbildung 1-3. Die Eingabeaufforderung von Anaconda zeigt den Befehl zur Installation der MetaTrader 5-Bibliothek

Die Installation ist die Brücke, die es dir ermöglicht, die für MetaTrader 5 entwickelten Python-Bibliotheken im Interpreter zu verwenden.

Der folgende Codeblock verwendet die import built-in-Anweisung, die interne (selbst erstellte) oder externe (von Dritten erstellte) Bibliotheken aufruft. Eine Bibliothek ist ein Funktionsspeicher. Daher musst du die Bibliotheken importieren, die für deine Aufgabe relevant sind. Zu Demonstrationszwecken importierst du die folgenden Module, Pakete und Bibliotheken:

import datetime
import pytz
import pandas as pd
import MetaTrader5 as mt5
import numpy as np 

Das Modul datetime bietet Werkzeuge zur Manipulation der Daten und Zeiten, die Bibliothek pytz bietet plattformübergreifende Zeitzonenberechnungen, die für den Import benötigt werden, und die Bibliotheken pandas und numpy werden zur Datenmanipulation und -analyse verwendet.

Hinweis

Du verwendest numpy hauptsächlich für die meisten Berechnungen und Datenmanipulationen.

Die MetaTrader 5 Bibliothek importiert die Funktionen, die sich auf das Modul der Software beziehen und ist die wichtigste Bibliothek, die es dir ermöglicht, die historischen Finanzdaten zu importieren.

Beachte, dass die drei letzten Codezeilen die Anweisung as enthalten. Diese wird verwendet, um der Bibliothek einen eigenen Namen zu geben, wenn du sie häufig verwenden und Schreibplatz sparen willst. Mit anderen Worten: Python erkennt die MetaTrader 5 Bibliothek von nun an als mt5.

Hinweis

Module sind Dateien, die Funktionen und Variablen enthalten. Ein Paket ist eine Sammlung von Modulen; es muss eine init.py-Datei haben. Eine Bibliothek ist einfach eine Sammlung von Paketen.

Das Ausführen der import Anweisungen bedeutet, dass Python die darin enthaltenen Funktionen erkennt und dir erlaubt, sie in zukünftigem Code zu verwenden, wenn du sie aufrufen möchtest. Du musst sie jedes Mal ausführen, wenn du eine neue Sitzung öffnest. Deshalb befinden sich die import Anweisungen normalerweise am Anfang des Codes.

Der nächste Schritt besteht darin, das Universum der Zeitrahmen zu erstellen, die du importieren kannst. Auch wenn ich dir zeige, wie du stündliche Daten analysierst und Backtests durchführst, kannst du ein breiteres Universum definieren, wie im folgenden Codeschnipsel gezeigt:

frame_M15 = mt5.TIMEFRAME_M15 # 15-minute time
frameframe_M30 = mt5.TIMEFRAME_M30 # 30-minute time frame
frame_H1 = mt5.TIMEFRAME_H1 # Hourly time frame
frame_H4 = mt5.TIMEFRAME_H4 # 4-hour time frame
frame_D1 = mt5.TIMEFRAME_D1 # Daily time frame
frame_W1 = mt5.TIMEFRAME_W1 # Weekly time frame
frame_M1 = mt5.TIMEFRAME_MN1 # Monthly time frame

Ein Zeitrahmen ist die Häufigkeit, mit der du die Preise aufzeichnest. Bei stündlichen Daten zeichnest du jede Stunde den zuletzt gedruckten Preis auf. Das bedeutet, dass du an einem Tag bis zu 24 stündliche Preise haben kannst. So kannst du die Intraday-Entwicklung des Preises sehen. Der Schlusskurs ist jedoch nur eines der Dinge, die du importieren möchtest. Während eines Zeitraums (egal ob stündlich oder täglich), siehst du Folgendes:

  • Der erste Kurs des Zeitraums, der genannt wird, ist der Eröffnungskurs.
  • Der höchste Preis, der während des Zeitraums gedruckt wurde, wird der Höchstpreis genannt.
  • Der niedrigste Preis, der während des Zeitraums gedruckt wurde, wird unter als Niedrigpreis bezeichnet.
  • Der letzte Kurs vor Beginn eines neuen Zeitraums, der als Schlusskurs bezeichnet wird.

Insgesamt werden diese als OHLC1 Daten, die in der Regel wie geschrieben geordnet sind.

Der folgende Code definiert die aktuelle Zeit, die verwendet wird, damit der Algorithmus beim Importieren der Daten einen Bezugspunkt hat. Im Grunde genommen erstellst du eine Variable, die die aktuelle Zeit und das Datum speichert:

now = datetime.datetime.now()

Legen wir nun das Universum der Vermögenswerte fest, die du backtesten möchtest. Ich verwende einen Mix aus vier Anlageklassen: Währungen, Kryptowährungen, Rohstoffe und Aktienindizes:

  • Währungen (auch bekannt als Forex, eine Abkürzung für Devisenmarkt) bilden den größten Finanzmarkt in Bezug auf das tägliche Volumen. Währungen werden in Paaren notiert, was bedeutet, dass du USD nicht einfach in absoluten Zahlen kaufen kannst; du musst sie mit einer anderen Währung kaufen. Daher bezieht sich das EURUSD-Paar auf den Preis von 1 EUR in USD. Das Backtesting-Universum umfasst EURUSD, USDCHF, GBPUSD und USDCAD.
Hinweis

USD ist eine Abkürzung für den US-Dollar, EUR ist eine Abkürzung für die Währung Euro, CHF ist eine Abkürzung für den Schweizer Franken, GBP ist eine Abkürzung für das britische Pfund und CAD ist eine Abkürzung für den kanadischen Dollar.

  • Kryptowährungen (auch Kryptos genannt) sind eine neue, disruptive Anlageklasse, die sich durch starke Volatilität auszeichnet. Die bekannteste Kryptowährung ist Bitcoin, gefolgt von von Ethereum. Beachte, dass beide in USD ausgedrückt werden; deshalb werden sie als BTCUSD und ETHUSD bezeichnet.
Hinweis

Beachte, dass Bitcoin (BTC) und Ethereum (ETH) gegen USD notiert werden. Sie gelten allgemein als die liquidesten Kryptowährungspaare.

  • Rohstoffe sind physische Vermögenswerte wie Gold, Silber und Kupfer. Sie werden in viele Kategorien unterteilt, z. B. Energie (Rohöl, Brent-Öl usw.) und Industriemetalle (Kupfer, Zink usw.). Im Universum der Vermögenswerte bleibe ich bei Gold und Silber.
  • Aktienindizes sind gewichtete Berechnungen eines ausgewählten Korbs von Aktien eines Landes. Sie werden verwendet, um die allgemeine Gesundheit des Aktienmarktes eines Landes zu analysieren. In diesem Buch befasse ich mich mit dem S&P 500, der stellvertretend für US-Aktien steht, und dem FTSE 100, der stellvertretend für britische Aktien steht:
assets = ['EURUSD', 'USDCHF', 'GBPUSD', 'USDCAD', 'BTCUSD', 
          'ETHUSD', 'XAUUSD', 'XAGUSD', 'SP500m', 'UK100']

Jetzt, wo du deine Zeit- und Vermögenswertvariablen bereit hast, musst du nur noch die Struktur des Importalgorithmus erstellen. Die Funktion get_quotes() erledigt dies:

def get_quotes(time_frame, year = 2005, month = 1, day = 1, 
               asset = "EURUSD"):
        
    if not mt5.initialize():
        
        print("initialize() failed, error code =", mt5.last_error())
        
        quit()
    
    timezone = pytz.timezone("Europe/Paris")
    
    time_from = datetime.datetime(year, month, day, tzinfo = timezone)
    
    time_to = datetime.datetime.now(timezone) + datetime.timedelta(days=1)
    
    rates = mt5.copy_rates_range(asset, time_frame, time_from, time_to)
    
    rates_frame = pd.DataFrame(rates)

    return rates_frame

Beachte, dass du in der Funktion get_quotes() schließlich die Bibliotheken pytz und pandas verwendest. Die Funktion beginnt mit der Definition der Olson-Zeitzone, die du selbst einstellen kannst. Hier ist eine kurze, nicht erschöpfende Liste dessen, was du je nach deiner Zeitzone eingeben kannst:

America/New_York
Europe/London
Europe/Paris
Asia/Tokyo
Australia/Sydney

Danach definiere ich zwei Variablen namens time_from und time_to:

  • Die Variable time_from enthält die Datumsangabe, die sich auf den Beginn des Importdatums bezieht (z. B. 01-01-2020).
  • Die Variable time_to enthält die Datumsangabe, die sich auf das Ende des Importdatums bezieht (z. B. 31.12.2020).

Im nächsten Schritt erstellst du eine Variable, die die Finanzdaten mit den von dir angegebenen Zeiträumen importiert. Dies geschieht über die Variable rates mit Hilfe der Funktion mt5.copy_rates_range(). Schließlich wandelst du die Daten mit pandas in einen Datenrahmen um.

Hinweis

Im gesamten Buch wirst du mit Arrays und nicht mit Datenrahmen zu tun haben. importiert die Funktion get_quotes() jedoch aus Kompatibilitätsgründen zunächst die Werte als Datenrahmen und wandelt sie dann in ein Array um. Der Hauptunterschied zwischen einem Datenrahmen und einem Array ist auf jeden Fall die Art der Daten, die du darin speichern kannst, und die Struktur der Achsen.

Die letzte Funktion, die für den Importvorgang benötigt wird, ist die Funktion mass_import(). Sie lässt dich den Zeitrahmen über die Variable auswählen und verwendet dann die Funktion get_quotes(), um die Daten zu importieren und sie in ein Array zu formatieren. Der folgende Codeschnipsel definiert die Funktion mass_import():

def mass_import(asset, time_frame):
                
    if time_frame == 'H1':
        data = get_quotes(frame_H1, 2013, 1, 1, asset = assets[asset])
        data = data.iloc[:, 1:5].values
        data = data.round(decimals = 5)        
        
    if time_frame == 'D1':
        data = get_quotes(frame_D1, 2000, 1, 1, asset = assets[asset])
        data = data.iloc[:, 1:5].values
        data = data.round(decimals = 5)        
          
    return data 

Die Funktion mass_import() wandelt den Datenrahmen automatisch in ein Array um, sodass du dich beim automatischen Import nicht um die Umwandlung kümmern musst.

Hinweis

Der Algorithmus importiert eine vom MetaTrader 5 begrenzte Anzahl historischer Daten. Obwohl diese Zahl hoch ist, kann es sein, dass du mit der Zeit das Jahresargument höher einstellen musst, um die Daten zu erhalten. Wenn du zum Beispiel mit der Funktion mass_import() ein leeres Array erhältst, versuche, ein aktuelleres Jahr in die Funktion get_quotes() einzugeben ("2014" statt "2013", wie im vorangegangenen Beispiel gezeigt).

Auch wenn es eine MAC-Version von MetaTrader 5 gibt, funktioniert die Python-Bibliothek nur unter Windows. Sie erfordert einen Emulator auf einem Mac. Mac-Benutzer können auch die später im Kapitel beschriebene manuelle Importmethode ausprobieren.

Alles zusammenfügen

Schauen wir uns nun ein vollständiges Beispiel für den Datenimport an. Erinnere dich daran, dass der vollständige Importcode im GitHub-Repository des Buches zu finden ist. Normalerweise beschäftige ich mich in diesem Buch nur mit stündlichen Daten, weil Trader sie häufig nutzen und dadurch interessante Signale erzeugen. Aber wir wollen ein paar Beispiele für den Import von Daten ausprobieren, nachdem wir die Funktionen in diesem Kapitel definiert haben:

  • Um die täglichen ETHUSD-Daten zu importieren, gib den folgenden Code ein:
my_data = mass_import(5, 'D1')
  • Um die stündlichen GBPUSD-Daten zu importieren, gib den folgenden Code ein:
my_data = mass_import(2, 'H1')

Es gibt viele Möglichkeiten, Daten in Python zu importieren; einige sind automatisch, andere manuell. Du hast gerade die erste Möglichkeit gesehen, bei der du Code verwendest, um mit einer Charting-Plattform zu kommunizieren und die Daten herunterzuladen. Bei der manuellen Methode hast du eine Excel-Datei mit OHLC-Daten, die du von einem Drittanbieter heruntergeladen hast. In diesem Fall kannst du die pandas Bibliothek verwenden, um sie zu importieren und in ein Array umzuwandeln.

Angenommen, der Excel-Dateiname lautet my_data und die Datei ist auf deinem Desktop gespeichert. Du musst sicherstellen, dass sich das SPYDER-Verzeichnis am selben Ort befindet wie die Datei. Laienhaft ausgedrückt: SPYDER muss den Desktop nach der Excel-Datei durchsuchen. Um das richtige Verzeichnis zu wählen, musst du auf die Ordner-Schaltfläche neben dem Pfeil klicken, wie in Abbildung 1-4 gezeigt.

Abbildung 1-4. Registerkarte Verzeichnis

Es sollte ein separates Fenster erscheinen, in dem du den Speicherort des Desktops auswählen und die Auswahl bestätigen kannst. Wenn du das getan hast, sollte die Registerkarte wie in Abbildung 1-5 aussehen.

Abbildung 1-5. Registerkarte Verzeichnis

Du musst die Funktion read_excel() verwenden, um die Werte in der Excel-Datei zu erhalten. Befolge diese Syntax:

# Importing the excel file into the Python interpreter
my_data = pd.read_excel('my_data.xlsx')

Im Moment hast du einen Datenrahmen namens my_data mit vier verschiedenen Spalten, die den Eröffnungs-, Höchst-, Tiefst- und Schlusskurs darstellen. In der Regel musst du den Namen der Bibliothek eingeben, bevor du eine Funktion verwendest, die zu gehört; deshalb wird read_excel() von pd eingeleitet.

Hinweis

Erinnere dich an, dass pd die Abkürzung ist, mit der auf pandas verweist. Gleichzeitig ist np die Abkürzung, mit der numpy verweist.

Die folgende Syntax zeigt, wie man strukturierte Elemente aus einem Datenrahmen in ein Array umwandelt, um die Manipulation zu erleichtern. Die Array-Bibliothek, die ich verwende, heißt numpy. Sie ist die Hauptbibliothek, die in diesem Buch verwendet wird.

Hinweis

Aus Kompatibilitätsgründen empfehle ich Windows-Nutzern den automatischen Weg und macOS-Nutzern den manuellen Weg.

Was solltest du deiner Meinung nach tun, bevor du die Funktionen von numpy verwendest? Wenn deine Antwort lautet: Importiere die Bibliothek, dann hast du recht. Der folgende Codeschnipsel importiert numpy und wandelt my_data in ein Array um, damit es für die Analyse bereit ist:

# Importing the library
import numpy as np

# Converting from data frame to array
my_data = np.array(my_data)

Alternativ kannst du das alles in einer Zeile machen, indem du einfach .values zu pd.​read_excel('my_data.xlsx') hinzufügst. So wird aus pd.read_excel('my_data.xlsx').​values ein Array statt eines Datenrahmens.

Zusammenfassung

Der Forschungs- und Handelsrahmen setzt sich aus vier verschiedenen Algorithmen zusammen, die im nächsten Kapitel näher erläutert werden. Sie lassen sich wie folgt zusammenfassen:

Algorithmus importieren
Dies ist der Algorithmus, der in diesem Kapitel gezeigt wird und sich mit dem Import und der Vorbereitung der historischen OHLC-Daten für die Analyse oder den Backtest beschäftigt. Ich glaube, dass du das in diesem Stadium leicht automatisch und manuell machen kannst.
Signal-Algorithmus
Dieser Algorithmus, den du in Kapitel 2 kennenlernen wirst, ist für die Erstellung der Kauf- und Verkaufsaufträge verantwortlich. Im Wesentlichen handelt es sich um eine Reihe von Bedingungen, die grünes Licht dafür geben, dass ein Muster erschienen ist und ein Handel stattfinden kann.
Charting-Algorithmus
Dies ist der einfachste Algorithmus. Du wirst ihn verwenden, um die Signale auf dem Preisdiagramm darzustellen. Er dient dazu, die Kauf- und Verkaufssignale auf dem Chart visuell zu analysieren. Auch das wirst du in Kapitel 2 lernen.
Leistungsalgorithmus
Dieser Algorithmus wird verwendet, um die Ergebnisse des Signalalgorithmus zu berechnen und zu analysieren. Im Grunde genommen berechnet er Leistungskennzahlen für die Signale, die nach den Bedingungen der Muster erzeugt werden. Auch darüber wirst du in Kapitel 2 etwas erfahren.

Es ist wichtig, dass du weißt, wie du Finanzdaten, die du später analysieren willst, automatisch importieren und aufbereiten kannst. Python bietet dafür leistungsfähige und schnelle Werkzeuge. Deshalb solltest du diese Technik beherrschen, damit du deine Recherchefähigkeiten verbessern kannst.

1 Eine Abkürzung für Open, High, Low und Close.

Get Finanzielle Mustererkennung beherrschen now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.