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.
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:
- Lade SPYDER herunter und mache dich mit seiner Funktionsweise vertraut.
- Lade die MetaTrader 5 Software herunter.
- 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.
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.
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
():
(
"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:
my_data
=
mass_import
(
5
,
'D1'
)
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.
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.
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.