Chartanalyse mit Python Teil 2: Datenquellen

Bevor wir mit der Datenanalyse beginnen, müssen natürlich erst einmal brauchbare Marktdaten her.

Wie schon in der Einführung geschrieben, sollen die Daten zunächst mal aus Textdateien im CSV-Format eingelesen werden. Eine Echtzeit-Kursdatenversorgung, wie man sie von den Handelsplattformen der Broker kennt, ist technisch wesentlich schwieriger umzusetzen und würde auch am Ziel vorbeischießen, denn unser Projekt zielt ja vor allem darauf ab, Marktdaten aus der Vergangenheit zu analysieren und soll nicht als Tradingstation genutzt werden.

EOD-Daten mit Yahoo

Eine recht bekannte Quelle für kostenlose End-of-day-Daten ist die Yahoo Finance-API. Weniger bekannt ist, dass Yahoo auch Intradaydaten anbietet, allerdings reichen diese nur wenige Tage oder Wochen zurück und sind um etwa 15 Minuten verzögert.

Python hat bereits fertige Funktionen implementiert, um auf die von Yahoo angebotenen Daten zuzugreifen. Sowohl im Grafik- und Plotpaket matplotlib, als auch in der Datenanalysebibliothek pandas finden sich Möglichkeiten, Aktienkurse direkt von Yahoo oder auch von anderen Quellen herunterzuladen.

Um zum Beispiel die EOD-Daten für den DAX von Mai 2015 bis Mai 2016 in eine Liste zu laden, genügt folgender Code:

Als Parameter übergibt man der Funktion das  Stockticker-Symbol, in diesem Fall  „^GDAXI“ für den DAX, sowie Start- und Enddatum als 3er-Tupel aus Jahr, Monat und Tag. Die Tickersymbole kann man unter http://finance.yahoo.com/lookup ermitteln. Beachte, dass bei Aktien deutscher Unternehmen meist ein .DE angehängt wird, z.B. ADS.DE für die Adidas-Aktie.

Die Funktion  mf.quotes_historical_yahoo  gibt eine Liste aus 6-er Tupeln zurück in der Form:   (Timestamp, Open, Close, High, Low) Dies ist die übliche Darstellung der Daten für eine einzelnen Kerze in einem Candlestick-Chart.  Ein Chartprogramm würde daraus eine Kerzendarstellung zeichnen können.  Im Timestamp steht das Datum und die Uhrzeit, zu der diese Kerze gehört und zwar als eine Zahl vom Typ float. (Es handelt sich dabei um die Anzahl von Tagen seit dem 1. 1.im Jahr  0001 um 0:00 Uhr, man kann also jeden Zeitpunkt bis zum Beginn der Zeitrechnung damit darstellen.)

Um derartige Umrechnungen muss sich der Nutzer allerdings nicht kümmern, denn es gibt die Funktion num2date  aus der Bibliothek  matplotlib.dates , mit der ein Timestamp wieder in ein datetime-Objekt umgewandelt werden kann:

Die Umkehrung mittels date2num funktioniert entsprechend. Mit den Datetime-Objekten können Zeiten addiert und subtrahiert werden, man erhält automatisch ein korrektes Kalenderdatum mit Uhrzeit. Dennoch würde die genaue Beschreibung des Datumsmanagement in Python hier zu weit führen, dazu verweise ich auf die Python-Dokumentation.

Jetzt müssen die EOD-Daten aus der Liste noch als CSV-Datei abgespeichert werden:

Zwei geschachtelte For-Schleifen gehen jedes einzelne Datum durch, zunächst zeilenweise, dann innerhalb der Zeile. Die innere Schleife schreibt die Einzelwerte gefolgt von Kommas in die Ausgabedatei, die äußere sendet mit ‚\n‘ einen Zeilenvorschub hinterher.

Auf diese Weise lässt sich eine Datenbank mit EOD-Daten verschiedener Indizes und Einzelaktien anlegen. Dafür müsste dann noch eine Funktion zum Datenupdate implementiert werden. Sie soll ein bereits bestehendes CSV-File um die neu hinzugekommenen Daten ergänzen. Dies kann dann automatisch in festen Zeitintervallen ablaufen, um den Datenbestand immer aktuell zu halten. Dazu  aber mehr in einem späteren Beitrag.

CSV-Dateien direkt vom Yahoo-Server

Anstatt die CSV-Datei selbst durch obigen Code zu erzeugen, lassen sich von Yahoo auch direkt CSV-Dateien beziehen und zwar nicht nur im EOD-Format, sondern auch für kleinere Zeiteinheiten.

Um etwa die letzten 10 Tage im EUR/USD in Minutenbars abzurufen, sendet man folgende URL:

http://chartapi.finance.yahoo.com/instrument/1.0/EURUSD=X/chartdata;type=quote;range=10d/csv

Die URL setzt sich zusammen aus dem Tickersymbol und einigen Parametern, darunter die Zeitdauer bis zu der die Daten zurückreichen. Im obigen Beispiel sind das 10d, also 10 Tage.

Die Länge der einzelnen Bars kann man dabei nicht selbst bestimmen, sondern sie wird vom Server festgelegt abhängig von der angeforderten Zeitdauer . Wenn wir statt der 10 Tage ein Jahr angefordern, dann sendet Yahoo Tagesdaten statt der Minutenbars:

http://chartapi.finance.yahoo.com/instrument/1.0/EURUSD=X/chartdata;type=quote;range=1y/csv

Die Einheit ist im Header der Dateien unter dem Eintrag unit: zu sehen.

Welche Zeitangaben noch möglich sind, ist leider nicht hinreichend dokumentiert. Hier lohnt es sich, ein wenig zu experimentieren. Um die CSV-Daten mit einem Python-Programm abzurufen und auf der Festplatte zu speichern, bedient man sich am besten eines Webscrapers, im einfachsten Fall leistet dies die Bibliothek urllib2.

 

Durch ein Update-Konzept lässt sich auch hier eine kontinuierliche Datenbank mit Minutendaten aufbauen, indem der Datenabruf automatisch in regelmäßigen Zeitabständen wiederholt wird. Auf diese Weise lässt sich ein netter Datenbestand fürs Backtesting aufbauen.

Der Vorteil von Yahoo ist, dass Daten nahezu aller Aktien vorhanden sind, die an der Börse gehandelt werden.

Eine Quelle für kostenlose historische Tickdaten

Der Nachteil aber ist, dass Yahoo als kleinste Zeiteinheit nur Minutendaten anbietet und diese auch nur wenige Tage lang vorhält . Man müsste also die Archivierung der Daten selbst vornehmen und zu Beginn des Projekts steht nur ein kurzer Zeitraum zur Verfügung, der zum Backtest genutzt werden kann.

Die höchste Genauigkeit bieten aber Tickdaten und diese sind über den Yahoo-Server nicht zu haben.

Dennoch gibt es eine Möglichkeit, an hochwertige kostenlose Tickdaten zu kommen, zwar nicht für praktisch alle gehandelten Aktien wie bei Yahoo, wohl aber für die weltweit wichtigsten Indizes und Major-Währungspaare. Diese Daten reichen mehrere Jahre in die Vergangenheit zurück, was Datenvolumen von etlichen Gigabyte bedeutet. Dies bietet der Broker Dukascopy an. Um darauf zuzugreifen empfiehlt sich das kostenlose Programm Tickstory lite.

Tickstory bietet ein Interface zum Dukascopy-Server. Das Programm kümmert sich um den Download der Daten, deren Archivierung und ist in der Lage, die Kurse in verschiedenste Formate zu exportieren. Die Form der Ausgabedaten ist völlig beliebig wählbar, es finden sich darunter bereits vordefinierte Einstellungen für die wichtigsten Tradingplattformen wie Metatrader, Ninjatrader , Amibroker oder auch für andere Analysetools wie etwa den Forextester 2.

In der Grundversion ist das Programm kostenlos. Lediglich Nutzer des Metatrader 4, die Daten aus Tickstory im dortigen Backtestbereich nutzen wollen, müssen dafür eine bezahlte Version des Programms wählen. Diese bindet den Metatrader direkt ein, das heißt man kann dann aus Tickstory heraus durch einen Button den Metatrader mit den gewählten historischen Daten starten. Der Prozess ist allerdings nicht ganz trivial und da wir ja eine eigene Backtesting-Engine entwickeln wollen, interessiert uns das hier nicht weiter. Unter dem Suchbegriff „99% Backtest“ finden Interessierte weitere Informationen hierzu.

tickinvest_screen1

Daten sammeln mit Tickstory lite

Die Bedienung des Programms ist weitgehend selbsterklärend. Eine kleine Eigenheit von Tickstory ist allerdings, dass die exportierten Daten immer ins Installationsverzeichnis des Programms geschrieben werden. Es gibt keine Möglichkeit, hierfür einen anderen Ordner auszuwählen. Daher sollten Nutzer das Programm in einen Ordner zu installieren, für den sie Schreibrechte haben. Wenn das nicht möglich ist, dann muss das Programm mit Administratorrechten ausgeführt werden, um exportierte Dateien schreiben zu können. Das funktioniert zwar, stellt aber ein Sicherheitsrisiko dar, das man auf einem zum Trading genutzten Rechner nicht haben möchte. Auch hier gibt es eine Lösung, man könnte das Programm mit virtualbox in einer virtuellen Maschine laufen lassen oder einfach auf einem anderen Rechner, der keine sensiblen Daten enthält.

Sind die Daten heruntergeladen und in der Tickstory-Datenbank eingepflegt, dann lässt sich im Export-Dialog sehr genau einstellen, wie die Ausgabedatei aussehen soll. Insbesondere kann man zwischen Kerzen im Open, Close, High, Low Format oder reinen Tickdaten mit Bid- und Ask-Preisen wählen. Letztere sind allerdings sehr speicherintensiv. Ein Jahr Tickdaten belegt zwischen 1-2 GB auf der Festplatte und das Arbeiten mit solch großen Datenmengen in Python ist ein wenig langsam und mühselig.

tickinvest_screen2

Daher werde ich zunächst für die weitere Entwicklung des Projekts auf Minutendaten zurückgreifen, jedoch die Option für Tickdaten offen halten. Sobald das Backtesting funktioniert, werde ich auch die Verarbeitung von Tickdaten implementieren. Dies bietet dann auch eine gute Gelegenheit, die Genauigkeit der beiden Varianten zu vergleichen.

Ausblick

Für die nächsten Entwicklungsschritte des Projekts habe ich mit Tickstory Datenfiles für DAX, S&P500 und EURUSD angelegt, die 5 Jahre in die Vergangenheit reichen und minutengenau sind.

Anhand dieser Beispieldaten soll das Backtesting System weiter entwickelt werden. Danach überlege ich mir Konzepte, um die ungleich größeren Datenmengen bei der Verwendung von Tickdaten zu verarbeiten.

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.