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.
Einige Indikatoren ziehen zusätzlich noch andere Eingabewerte hinzu, meistens das Handelsvolumen oder der Verlauf eines Vergleichswertes.Besonders interessant sind auch Indikatoren, die das Sentiment einbeziehen, also die Einschätzung der Masse der Anleger über den Kursverlauf in nächster Zukunft.
Dabei kann ein Indikator natürlich keine Informationen enthalten, die nicht zuvor bereits im Kursverlauf und den anderen Eingabewerten enthalten waren.
Er kann lediglich diese Informationen aufbereiten und verdichten und so auf wichtige Kursmarken und Zeitpunkte hinweisen, an denen Bewegung im Markt entstehen kann.
So erlaubt ein Indikator die schnelle Einschätzung der Marktsituation auf einen Blick, ohne komplizierte Berechnungen und Auswertungen anzustellen. Aber es ist natürlich ein Irrtum zu glauben, im Indikator liege irgendeine Prognosefähigkeit. Letztlich sind die Indikatoren nur statistische Aussagen über den vergangenen Kursverlauf.

Sinn und Unsinn von Indikatoren

Inzwischen ist die Anzahl an Indikatoren in jedem Chartprogramm nahezu unüberschaubar geworden. Es gibt Hilfsmittel für jeden Teilaspekt des Tradings.
Beliebt sind zum Beispiel Indikatoren, die die Stärke und Richtung eines Trends anzeigen (Trendanzeiger), aber auch solche, die auf mögliche Umkehrpunkte des Kursverlaufs hinweisen (Oszillatoren) und viele mehr. Welche und wieviele Indikatoren man einsetzt ist eine Sache des persönlichen Tradingstils.
Oftmals kann man beobachten, dass Tradinganfänger ihre Chartdarstellung mit einer großen Zahl von Indikatoren überladen, so dass man den Kurs vor lauter Linien kaum noch sieht.
Mit zunehmender Erfahrung werden es dann aber meist immer weniger und nicht wenige professionelle Trader arbeiten nach vielen Jahren Börsenerfahrung schließlich wieder mit dem blanken Chart.
Die vielen Indikatoren täuschen eine Sicherheit vor, die so natürlich nicht vorhanden ist. Daher würde ich auch dazu raten, eher sparsam mit zusätzlichen Indikatoren im Chart umzugehen, dennoch gibt es natürlich Situationen, in denen die Verwendung sinnvoll ist.

Dazu zählt das automatische Trading. Denn um automatisierte Handelsentscheidungen zu treffen, müssen natürlich zunächst Marktinformationen gesammelt und ausgewertet werden. Anders als ein erfahrener menschlicher Trader, der die Marktsituation anhand eines Blicks auf den Chart intuitiv einschätzen kann, muss ein Algorithmus immer mathematische Operationen anwenden, um zu Aussagen zu gelangen, ob der Trend gerade steigend oder fallend ist, ob sich ein Wert an einer Ausbruchsmarke befindet und so weiter. Beim Programmieren automatischer Handelsstrategien kommt man also nicht ohne Indikatoren aus.

Wir wollen in diesem Artikel als Beispiel zwei wichtige Indikatoren implementieren und in die bisher gezeichneten Candlestick-Charts einfügen: Den EMA (Eyponential Moving Average) und den ATR (Average True Range).

Gleitende Durchschnitte

Zu den wichtigsten und am häugigsten genutzten Indikatoren gehören gleitende Durchschnitte oder Moving Averages. In gängigen Chartprogrammen findet man vor allem den Simple Moving Average (SMA) und den Exponential Moving Average (EMA).

Wie der name bereits vermuten lässt, wird einfach der Mittelwert über eine bestimmte Anzahl vergangener Kursnotierungen gebildet und zusammen mit dem Kurs in den Chart eingezeichnet.

Je größer die Periode ist, über die gemittelt wird, desto langsamer reagiert der Indikator auf den Kurs und zeigt somit langfristige Trendverläufe an. Man geht dabei von aufwärts gerichteten Trends aus, wenn der Kurs über dem gleitenden Durchschnitt notiert und von Abwärtstrends wenn er darunter verläuft.

Eine Implementation des SMA könnte folgendermaßen aussehen:

Die eigentliche Berechnung des SMA passiert in der Zeile:
SMA[i]=data[i-window:i].sum()/window

Die for-Schleife durchläuft die Daten und bildet jeweils den Mittelwert der letzten vergangenen Kurse bis zu dem Punkt, der durch die Variable window gegeben ist.

Für die ersten Daten liegen natürlich nicht genug Werte aus der Vergangenheit vor – diese setzten wir einfach nach Ablauf der For-Schleife auf den ersten regulären Wert.

Warum exponentielle Gewichtung?

Während der SMA alle Kursnotierungen mit gleichem Gewicht in die Berechnung heranzieht, führt der Exponential Moving Average (EMA) eine zusätzliche Gewichtung ein. Je länger ein Kuswert zurückliegt, desto schwächer geht er in die Mittelwertbildung ein.

Damit wird das Nachlaufen des Indikators etwas abgemildert. Denn dadurch, dass sich die Indikatoren immer auf vergangene Kurse beziehen, kommen Handelssignale im Grunde immer zu spät zustande.  Eine starke Bewegung muss  ja im Markt bereits stattgefunden haben, damit ihre Wirkung sich irgendwie in der Anzeige eines Indikators niederschlägt. Um das nachlaufen des gleitenden Durchschnittes abzuschwächen, werden die jüngsten Kurswerte am stärksten berücksicht und je weiter eine Notierung zurückliegt, deto weniger beeinflusst sie den Wert des Durchschnittes.

Beim EMA wird mit jedem Schritt in die Vergangenheit die Wichtigkeit des Wertes um einen konstanten Faktor reduziert. Dies führt insgesamt zu einer exponentiellen Gewichtungsfunktion.

In der gängigen Literatur (z.B. Murphy, Technische Analyse) wird für die Berechnung des EMA ein rekursiver Algorithmus angegeben:

EMA(i)=EMA(i-1)+ G*(Close(i)-EMA(i-1))

Dabei ist G der Gewichtungsfaktor: G= 2/(n+1)

n ist die Größe des Mittelungsfensters.

Durch die rekursive Definition brauchen wir zur Berechnung eines EMA-Wertes denjenigen aus der vorigen Periode. Am Anfang steht dafür natürlich kein Wert zur Verfügung. Daher setzt man den Anfangswert einfach auf den entsprechenden Kurswert.

EMA(0):=Close(0)

Damit ist die Definition komplett.

Beachte, dass die konkrete Wahl eines Gewichtungsfaktors im Grunde willkürlich ist und verschiedene Versionen in den unterschiedlichen Chartprogrammen existieren. Manche ältere Software benutzt einen Gewichtungsfaktor G=1/n. Wichtig ist nur, dass die Gewichte proportional zu 1/n sind, also mit zunehmender Fenstergröße abnehmen. EMAs können unterschiedliche Werte liefern in verschiedenen Chartprogrammen!

Die klassische EMA-Definition implementieren wir wie folgt in Python:

 

Gleitende Durchschnitte in den Chart einzeichnen

Jetzt geht es daran, die gleitenden Durchschnitte in den Chart zu plotten. Wir bauen dabei auf den Code der vergangenen Artikel auf dieser Reihe auf. Dabei zeigt sich aber ein Problem, das an einer Eigenheit der DataFrames von Pandas liegt, in denen wir ja die Kursdaten gespeichert haben.

Wenn man mittels der Funktion fp_slice einen bestimmten Zeitbereich aus den Gesamtdaten herausschneidet um ihn zu analysieren, dann übernimmt dieser neue gekürzte Datensatz den Index aus den Mutterdaten. Das heißt unsere herausgeschnittenen Daten starten im allgemeinen nicht mit dem Indexwert 0, sondern mit irgendeinem größeren Zahlenwert.

Dies kollidiert jedoch mit der Berechnung der Moving Averages, weil der oben angegeben Code davon ausgeht, dass die Eingabedaten mit dem Index 0 starten. Daher müssen wir die Funktion fp_timeslice nachbessern. Wir müssen für den herausgeschnittenen Datensatz den Index neu vergeben, so dass er bei 0 startet:

Wichtig ist hier die vorletzte Zeile:

Dadurch wird der Index neu gesetzt, so dass gesichert ist, dass er bei 0 startet. Nun können die von der Funktion fp_timeslice zurückgegebenen Daten fehlerfrei von den Funktionjen fp_SMA und fp_EMA verarbeitet werden.

Die Funktion fp_chart zeichnet einen Candlestick-Chart. Zum Test legen wir die Aufrufe zum Plotten der gleitenden Durchschnitte direkt hinein.  Mit dem dort definierten Plotachsen-Objekt ax haben wir folgende Aufrufe:

Wir übergeben Datumsachse, die gleitenden Durchschnitte, danach wird die Plot-Farbe spezifiziert und zum Schluss eine Zeichenkette für die Legende übergeben, die matplotlib durch Aufruf von plt.legend automatisch im Ausgabefenster anlegt.

Im letzten Kapitel hatten wir einen DAX-Tageschart generiert.

Wenn wir die Moving Averages auf diesen Anwenden, sieht das Ergebnis schließlich so aus:
>>>fp_chart(DAX_daycandles,candlewidth=1)
EMAundSMA
Schön zu erkennen ist der hellblaue EMA und der dunkelblaue SMA .

Die gleitenden Durchschnitte gehören wie die Bollinger Bänder oder verschiedene Channel-Indikatoren zu denen, die direkt in den Chart zusammen mit den Kursen eingezeichnet werden.

Im nächsten Kapitel werden wir am beispiel der Average True Range einen weiteren Indikatorentyp implementieren. Nämlich solche, die in ein separates Fenster über oder unter dem Chart gezeichnet werden und einen eigenen, vom Kurs unabhängigen Wertebereich haben.

Schreibe einen Kommentar

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