Chartanalyse mit Python Teil 6: ATR und andere externe Indikatoren plotten

Wie bereits im letzten Kapitel angesprochen gibt es unter den Indikatoren solche, die direkt über den Kursverlauf in den Chart eingezeichnet werden und solche, die in einem seperaten eigenen Fenster dargestellt werden. Diese bezeichne ich hier als externe Indikatoren. Beispiele dafür wären etwa der MACD oder die vielen sogenannten Oszillatoren wie RSI oder Stochastik. Auch das Volumen zählt zu den externen Indikatoren.
Die Implementierung solcher Indikatoren in unser Python-Projekt folgt immer demselben Schema:

  • Eine Funktion definieren, die  ein Array mit den Werten des Indikators zurückliefert.
  • Im Chartplot-Modul eine neue Plotachse definieren und den Indikator dort einzeichnen.

Der zweite Punkt ist dabei eine vorläufige Lösung, um zu schnellen Ergebnissen zu kommen. In einer professionellen Chartsoftware würde man natürlich erwarten, dass ein Benutzer Indikatoren beliebeig hinzufügen und wieder löschen kann. Solange wir das Plotten aber direkt im Chartmodul coden, ist so etwas nicht möglich. Wir müssten dafür aber ein komplettes Handling zum Erstellen oder Löschen von Indikatoren implementieren und mit einer dynamischen Liste arbeiten, der beliebig viele Indikatoren hinzugefügt werden können. So etwas gehört technisch eher in den Bereich der Benutzeroberfläche und soll daher erstmal hinten angestellt werden, denn im Moment ist die Software noch nicht zur die Verwendung andere Benutzer gedacht, sondern soll nur ein Analysevehikel sein. Daher reicht es, die benötigten Indikatoren direkt „hardcoded“ in das Chartmodul einzufügen durch einen simplen Plot-Befehl.

Damit kommen wir zur Definition der ATR-Funktion

Average True Range

Der ATR oder Average Truie Range ist ein Volatilitätsindikator.

Er gibt ein Maß für die mittlere Schwankungsbreite des Kursverlaufs über die letzten Perioden. In der Standardeinstellung sind es n=14 Perioden. In Zeiten von Panik und Crash gehen die Märkte in übertriebenem Maße auf und ab. Solche Phasen sind gekennzeichnet durch hohe Volatilitäten. In Wachstumsphasen stetiger Kurssteigerungen erlebt man dagegen eher geringe Volatilität.  Entwickelt wurde der ATR von Welles Wilder, einem der Väter der technischen Analyse. Zusätzlich zur täglichen Schwankungsbreite berücksichtigt der Indikator auch Gaps: Wenn die Kursdifferenz zwischen Tageshoch und Vortagesclose größer ist, als die Intraday-Schwankungsbreite, dann geht stattdessen diese Gapgröße in die Rechnung ein.

Diese Unterscheidung ist sehr bedeutend, denn gerade in Panikphasen mit extremer Volatilität öffnen die Märkte oft mit gigantischen Gaps nach oben oder nach unten, je nach Nachrichtenlage und Stimmung der Anleger.

Um dies zu berücksichtigen, führte Wilder den True Range ein:

True Range = Maximum der drei Größen:

  • Kerzen-Schwankungsbreite,
  • Abstand Kerzenhoch zum Schlusskurs der Vorigen,
  • Abstand vom Schlusskurs der Vorigen zum Kerzentief

 

Aus dieser True Range bildet Wilder dann einfach durch einen gleitenden Mittelwert den ATR.

Dies lässt sich direkt in Python formulieren:

Als gleitenden Mittelwert können wir die bereits vorhandene Funktion fp_SMA nutzen.

Den so definierten Indikator halte ich für recht wertvoll, weil er es gestattet, Abstände an die aktuelle Marktlage anzupassen. Es ist zum Beispiel sinnvoll, Stopkurse in Einheiten des ATR zu setzen. Denn wenn der Markt eine Physe hoher Schwankungsbreite durchmacht, sollte man natürlich den Stopp für eine Trading-Position weiter weg setzen, um nicht vom Auf- und Ab des Marktrauschens immer wieder ausgestoppt zu werden.

Außerdem ist der ATR als Stimmungsanzeiger geeignet und kann in Verbindung mit einem Trendanzeiger und Sentimentdaten sehr wertvolle Grundlagen für eine Handelsentscheidung liefern.

Mehrere Plotbereiche innerhalb einer Grafik

Um den Indikator in ein neues Fenster zu plotten, müssen wir die Aufteilung der Ausgabefläche bei einer Matpoltlib-Figure genauer ansehen. Diese kann über den Befehl plt.subplot2grid in Spalten und Zeilen unterteilt werden, so dass verschiedene Plots gezielt im Ausgabefenster angeordnet werden können.

Wir passen die Funktion fp_chart() an, indem wir nach der Erzeugung des Grafikobjekts fig=plt.figure()  ein 6×4-Gitter anlegen und den ersten Block direkt in die linke obere Ecke (0,0) legen. Dieser soll sich über 5 Zeilen und 4 Spalten erstrecken.

Dazu ersetzen wir den Befehl ax=fig.add_subplot(111)

durch folgendes:

ax=plt.subplot2grid((6,4),(0,0), rowspan=4, colspan=4)

Der Plan ist, den Indikator später in eine der sechs Zeilen zu plotten. Damit entsteht ein Verhältnis von 5 zu 1 zwischen Chartfenster und Indikatorfenster. Dies entspricht in etwa dem optischen Eindruck, den man von den meisten Chartprogrammen gewöhnt ist, wenn externe Indikatoren eingezeichnet werden.

Für den Indikator käme dann also ein Aufruf

ax0=plt.subplot2grid((6,4),(5,0),sharex=ax,rowspan=1,colspan=4)

Die Erstellung der Achsen und Ticks kopieren wir ganz einfach vom bereits bestehenden Code für die erste Achse ax.

Das Kexword shareax=ax sagt dem Interpreter, dass beide Plots eine gemeinsame x-Achse teilen. Dies ist wichtig, damit später die Ausgabe des Indikators auch an richtiger Stelle unter dem Kurs erscheint.

Allerdings würde in diesem Fall matplotlib auch die komplette Achsenbeschriftung zeichnen. Da unter der x-Achse des Charts aber der Bereich mit dem Indikator liegt würde das bedeuten, dass x-Achsen-Beschriftung des Chartfensters und das Indikatorfenster sich überschneiden.

Um dies zu vermeiden, blenden wir die Beschriftung für den ersten Plot aus:

plt.setp(ax.get_xticklabels(),visible=False) Damit können wir jetzt den Indikator berechnen und einzeichnen:
ATR=fp_ATR(data) ATRCol = '#1a8782' ax0.plot(md.date2num(data.Datetime),ATR,ATRCol,linewidth=1.5)

Das Ergebnis im Überblick

Das Ergebnis sieht mit unserem standardmäßigen DAX-EOD Datensatz dann folgendermaßen aus:

ATRimDAX

Wie gewünscht teilt sich der Plotbereich auf in Chartfenster und Indikatorfenster und beide teilen eine gemeinsame Achse.

Auf dieselbe Weise lassen sich nun natürlich noch weitere Indikatoren definieren und hinzufügen, wahlweise über oder unter dem Chartfenster. Wir müssen dann nur jeweils die subplot2grid-Parameter entsprechend anpassen.

Hier nochmal der Code des Chartmoduls, der die obige Ausgabe erzeugt hat im Zusammenhang:

Inzwischen können wir Minutendaten einlesen, daraus Kerzen höherer Zeiteinheiten generieren und Candlestick-Plots sowie auch normale Linienplots anzeigen. Außerdem Können wir externe Indikatoren hinzufügen und auch Indikatoren direkt ins Kursfenster einzeichnen.

Damit soll der Bereich der Visualisierung erst mal abgeschlossen sein, denn diese Möglichkeiten reichen zunächst völlig aus, um historische Backtests von Trading-Strategien durchzuführen und die Ergebnisse darzustellen.

 

 

Chartanalyse mit Python Teil 5: Moving Averages berechnen und plotten

Für die technische Analyse und insbesondere für das algorithmische Trading sind Indikatoren unverzichtbar. Ein Indikator ist im Grunde nur ein Zahlenwert, der aus den historischen Kursdaten berechnet wird und der meistens im Chart eingezeichnet wird, um einen bestimmten Aspekt des Kursverlaufes zu verdeutlichen. Chartanalyse mit Python Teil 5: Moving Averages berechnen und plotten weiterlesen

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. Chartanalyse mit Python Teil 4: Candlestick-Charts mit höheren Zeiteinheiten weiterlesen

Chartanalyse mit Python Teil 3: Candlestick-Charts zeichnen

Im letzten Teil habe ich eine Methode vorgestellt, um mit Tickstory lite qualitativ hochwertige historische Daten der wichtigsten Währungspaare und Indizes als Textdatei zur Verfügung zu stellen. Im nächsten Schritt wollen wir nun einige Funktionen entwickeln, um aus diesen Daten Candlestick-Charts (oder auf Deutsch Kerzen-Charts) zu erstellen.
Chartanalyse mit Python Teil 3: Candlestick-Charts zeichnen weiterlesen