Chartanalyse mit Python Teil 4: Candlestick-Charts mit höheren Zeiteinheiten

Bisher haben wir aus tickstory lite ausschließlich Minutenkerzen exportiert. Das Programm erlaubt aber natürlich auch, andere Zeiteinheiten zu generieren. So ist es kein Problem, aus den heruntergeladenen Tickdaten auch Stunden- oder Tageskerzen zu generieren oder auch ganz andere Zeiteinheiten.

Die Verwendung von Minutendaten statt Tickdaten

Zum Zweck der Datenanalyse ist es aber von Vorteil, möglichst kleine Zeiteinheiten vorzuhalten. Eigentlich braucht man streng genommen sogar Tickdaten, da nur diese eine vollständige Rekonstruktion des Handels in der Vergangenheit erlauben. In späteren Kapiteln werden wir noch auf die Verarbeitung von Tickdaten eingehen. Diese ist aber deutlich aufwändiger und schwieriger, da hier schon bei relativ kurzen Untersuchungszeiträumen riesige Datenmengen anfallen.
Die Verwendung von Minutenkerzen dient also als Kompromiss, der uns erlaubt, zunächäst mal einige Analysewerkzeuge zusammenzutragen und auszuprobieren.
Viele Investoren sind ohnehin an langfristigen Strategien interessiert und basieren ihre Analysen und Strategien auf Tagescharts.
Um einen Eindruck vom großen Bild des Marktes zu bekommen ist es sinnvoll, sich zunächst einmal einen Tageschart anzuschauen.
Natürlich ist es wünschenswert, diese Tagencharts auf Basis der Minutenkerzen selbst zu erzeugen um nicht für jede neue Zeiteinheit wieder ein Datenfile erzeugen und exportieren zu müssen.Daher entwickeln wir in diesem Artikel eine Funktion, die aus einem Dataframe mit Minutenkerzen einen solchen mit den entsprechenden Tageskerzen macht.

Vom Minuten- zum Tageschart

Der grundsätzliche Aufbau ist schnell erklärt. Wir haben bereits eine Funktion fp_slice, die einen definierten Zeitbereich aus den Gesamtdaten herausschneidet.
Aufgabe der neuen Funktion wird es nun sein, den gesamten Datenbestand in Slices aufzuteilen, die jeweils nur einen einzigen Handelstag enthalten.
Aus diesen Tagesdatensätzen müssen wir dann nur noch Open, Close, High und Low bestimmen und das Ganze in einen neuen Dataframe schreiben.

Als erstes legen wir diesen Dataframe als leeren Datensatz an, der aber schon die korrekten Spaltenbezeichnungen enthält:

daycandles=pd.DataFrame(columns=['Datetime','Open','High','Low','Close','Volume'])

Ein wichtiger Datentyp aus der Datetime-Library ist timedelta. Wir der Name schon sagt, lassen sich damit Zeitdauern codieren, während Datetime-Objekte ja nur bestimmte Zeitpunkte sind.

Arithmetik mit Zeiten dank timedelta

Durch Einführung des timedelta-Typs kann man ganz natürlich mit Zeitpunkten Rechenoperationen ausführen.
Das veranschaulicht der folgende Dialog mit dem Interpreter:
>>>test=datetime.timedelta(1)
>>>heute=datetime.datetime(2016,07,15)
>>>heute+test
---> datetime.datetime(2016, 7, 16, 0, 0)
>>>

Mit datetime.timedelta(1) wird eine Zeitdauer von einem Tag definiert. Die Addition von einem Tag liefert ein neues Datetimeobjekt mit dem richtigen Datum.  Auch Monats- und Jahresüberträge werden richtig berechnet.
Durch Angabe von Keywords wie hour, minute, second lassen sich auch andere Zeitdauern definieren.
Wie man sieht, wird durch die Addition automatisch das richtige Datum berechnet.  So auch im folgenden Beispiel, wo die Addition von einer Stunde kurz vor Mitternacht zum korrekten Datumswechsel führt:

>>> test=datetime.timedelta(hours=1)
>>> time=datetime.datetime(2016,07,15,23,55)
>>> time+test
---> datetime.datetime(2016, 7, 16, 0, 55)
>>>

Dieser timedelta-Typ hilft nun, die Tagesabschnitte aus den Gesamtdaten herauszuschneiden:

Die Variable  daily_data enthält jetzt alle Minutenkerzen, die innerhalb eines bestimmten Handelstages liegen. Dies kann man natürlich analog mit allen anderen Zeitabschnitten machen und mit dieser Methode H1, H4 oder auch Wochen- und Monatscharts generieren.

Die Dataframe-Methoden machen das Leben leichter

Im nächsten Verarbeitungsschritt müssen aus daily_data diejenigen Werte herausextrahiert werden, die später die Tageskerze für den entsprechenden Tag ausmachen:

Hier können wir die volle Funktionsvielfalt der Dataframes ausnutzen, denn die benötigten Funktionen sind alle bereits als Methoden des Dataframes an Bord.

Der Open-Wert unserer neuen Tageskerze ist einfach der erste Open-Wert im Datendatz, analog der Close als letzter Minutenclose. High und Low werden über Maximum und Minimum bestimmt und das Volumen des Handelstages ist einfach das aufsummierte Volumen aller Minutenwerte.

All diese Werte schreiben wir in den temporären Dataframe dd und hängen diesen an den Ergebnisframe an.

Damit ist im Grunde schon alles erledigt.  Aber wie immer gibt es noch ein paar Detailfragen, um die wir uns kümmern müssen.

Wann beginnt ein Tag an der Börse?

Wir müssen zum Beispiel noch festlegen, wann der Handelstag beginnt oder endet. Dies hängt vom betrachteten Markt und Instrument ab. Möchte man die regulären XETRA-Handelszeiten auswerten, dann geht der Tag von 9:00 bis 17:30. Die DAX-Futures werden aber von 8:00 bis 22:00 gehandelt.

Mitunter gibt es sogar CFD-Anbieter, die DAX-Kurse 24 Stunden lang stellen. Ungeachtet der Frage, wie sinnvoll es ist, den DAX nach 22 Uhr zu handeln, wollen wir die volle Flexibilität haben, über Tagesanfang und -Ende frei zu entscheiden.

Die Funktion, die genau das leistet, ist aber schon im Arsenal, es ist fp_timeslice, womit eine definierte Start- und Endzeit übergeben werden kann.

Über die Datetime-Methode replace lassen sich Zeiten in Datetime-Objekten beliebig verändern. Wir übergeben also jetzt Startzeit und Endzeit um festzulegen, wann der Handelstag beginnen und aufhören soll:

Im ersten Schritt schneiden wir alle Daten des Handelstages heraus, von 0 bis 23:59 Uhr. Im nächsten Schritt wird dieser Datensatz nochmal an den Rändern gestutzt und auf den vorher definierten Start- und Endzeitpunkt gebracht.

Damit wäre der Code komplett, im Zusammenhang sieht er folgendermaßen aus:

Plotten von Tagescharts

Die Berechnung von Tageskerzen stellt natürlich eine erhebliche Datenreduktion dar und es empfiehlt sich daher, eine Analyse damit zu beginnen. Im Interpreter sieht das dann folgendermaßen aus:

>>>DAXfilename='../last3years_minutebars_DEUIDXEUR.csv'
>>>DAX=fp_read_data(DAXfilename)
>>>DAXdaily=fp_generate_daycandles(DAX,endhour=22,endminute=0)

Danach kann der neue Datensatz DAXdaily an das Chartplot-Modul übergeben werden.
>>> fp_chart(DAXdaily)
Zoomt man in das Ergebnis hinein, erkennt man, dass die Candles jetzt viel zu schmal dargestellt werden:
schmalecandles

Die Funktion Candlestick hat einen Parameter width, der die Breite der Kerzen beim Einzeichnen in die Grafik festlegt. Da wir bisher nur Minutendaten gezeichnet haben, konnte hier ein fester Wert verwendet werden. Will man aber verschiedene Zeitskalen abbilden, dann muss dieser Parameter angepasst werden, denn auf einem Tageschart hätten die Kerzen sonst immer noch die Breite, die sie im Minutenchart hatten.

Wir übergeben die Breite also optional beim Aufruf der Funktion fp_chart und geben den Minutenwert als Default mit. Wird beim Aufruf keine candlewidth angegeben, dann wählt der Python-Interpreter diesen Wert.

Jetzt lässt sich das Chartmodul erneut mit einer angepassten candlewidth aufrufen:

>>> fp_chart(DAXdaily,candlewidth=1)

korrektecandles

Die Kerzenbreite bleibt das Einzige, was wir aus dem für Minutendaten entworfenen Code anpassen mussten  Die Datumsachse wird auch bei der Darstellung von Tageskerzen automatisch richtig skaliert. Dafür mussten am Code keinerlei Änderungen vorgenommen werden.

Somit sind wir jetzt in der Lage, sowohl langfristige Analysen im Tageschart, als auch Intradaystartegien mit Minutendaten zu betrachten.

Im nächsten Teil werden wir damit beginnen, Indikatoren zu berechnen und in den Chart einzuzeichnen.

Schreibe einen Kommentar

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