Die Schlusskurslinie folgt der Kursbewegung jeder Kerze. Berechnest du den Durchschnitt mehrerer aufeinanderfolgender Schlusskurse, erhältst du eine ruhigere Linie. In diesem Kapitel erstellst du zwei gleitende Durchschnitte auf Basis von zehn Kerzen.

Den Durchschnitt berechnen

Der einfache Durchschnitt von drei Werten ist ihre Summe geteilt durch drei. Für die Werte 100, 103 und 101 ergibt sich:

(100 + 103 + 101) / 3 = 101.333...

Die Größe des Fensters eines gleitenden Durchschnitts bleibt gleich, aber das Fenster wandert mit den Kerzen weiter. Bei einem Fenster über drei Kerzen kommt auf der nächsten Kerze der neue Schlusskurs hinzu, während der älteste herausfällt.

Ist der neue Schlusskurs 105, lautet die nächste Berechnung bereits (103 + 101 + 105) / 3, also 103. Der erste Schlusskurs von 100 ist in diesem Fenster nicht mehr enthalten.

Für einen einfachen gleitenden Durchschnitt über zehn Kerzen brauchst du den aktuellen und die neun vorherigen Schlusskurse. Wir verwenden nicht den aktuellen und zehn weitere frühere Kerzen: Zehn ist die Gesamtzahl der berücksichtigten Werte.

Die Funktionen von ta

Der Namensraum ta enthält fertige Berechnungen. ta.sma(close, 10) liefert den einfachen gleitenden Durchschnitt von zehn Schlusskursen. SMA steht für „simple moving average“.

Die beiden Argumente des Aufrufs:

  • close: die Quelle für die Durchschnittsberechnung;
  • 10: die Fenstergröße in Kerzen.

Auf den ersten neun Kerzen stehen noch keine zehn Schlusskurse bereit. Dort ist der SMA na; sein erster gültiger Wert erscheint auf der zehnten Kerze. Diesen Anfangsabschnitt nennt man auch Aufwärmphase.

Die Fenstergröße ist keine Zeitdauer in Sekunden. Zehn Tageskerzen und zehn Stundenkerzen decken unterschiedliche Zeiträume ab.

SMA und EMA nebeneinander

Der EMA, also exponentielle gleitende Durchschnitt, gewichtet neuere Werte stärker. Auch ta.ema(close, 10) verwendet einen Längenparameter von zehn Kerzen, rechnet aber mit einer anderen Formel.

Der EMA beginnt mit dem einfachen Durchschnitt des ersten vollständigen Fensters. Bei Länge zehn erscheinen daher beide Linien auf der zehnten Kerze. Danach addiert der EMA zu seinem vorherigen Wert einen Anteil der Differenz zwischen neuem Kurs und vorherigem EMA. Dieser Anteil beträgt 2 / (10 + 1).

Lege die Datei moving_averages.py an:

"""
@pyne edge
"""
from pynecore.lib import close, color, plot, script, ta


@script.indicator("Two Moving Averages", overlay=True)
def main():
    simple_average = ta.sma(close, 10)
    exponential_average = ta.ema(close, 10)
    plot(simple_average, "SMA 10", color=color.blue, linewidth=2)
    plot(exponential_average, "EMA 10", color=color.orange, linewidth=2)

Führe sie auf den Demodaten aus. Der blaue SMA und der orangefarbene EMA erscheinen bei den Kurskerzen. Verschiebe den Kurschart und betrachte Stellen mit einem plötzlichen Richtungswechsel. Die beiden Durchschnitte reagieren nicht unbedingt gleich schnell.

Nach der Ausführung von moving_averages.py zeigt die PyneIDE einen blauen SMA und einen orangefarbenen EMA bei den Kerzen.
Aus denselben Schlusskursen entstehen SMA und EMA mit Länge zehn.

Ein Durchschnitt ist eine aus vergangenen Werten berechnete Linie. Ihre glattere Form allein sagt nicht voraus, wohin sich der Kurs bewegt.

Warum rechnen wir auf jeder Kerze?

ta.sma und ta.ema verwenden zwischen aufeinanderfolgenden Ausführungen auch gespeicherten Berechnungszustand. Im Beispiel laufen beide Aufrufe auf jeder Kerze.

Später schreiben wir auch Code, der eine Aktion nur in bestimmten Fällen ausführt: etwa eine Markierung zeichnen, wenn der Schlusskurs über dem Durchschnitt liegt. Das lernst du im Kapitel Bedingungen und Markierungen.

Berechne auch dann den Durchschnitt auf jeder Kerze und entscheide erst danach, wofür du ihn verwendest. Rufst du ta.sma beispielsweise nur auf steigenden Kerzen auf, fehlt die Berechnung auf den übrigen Kerzen. Das Ergebnis kann dann vom Durchschnitt über die vollständige Kerzenfolge abweichen. Achte vorerst darauf, dass beide Durchschnittsberechnungen auf jeder Kerze laufen.

Für diese beiden Linien brauchen die eigenen Variablen keine Kennzeichnung als Series: Wir zeichnen ihre aktuellen Werte und verwenden keinen Ausdruck simple_average[1]. Wenn du später die Historie deiner Variablen direkt indizieren möchtest, gib Series[float] an.

Längeres und kürzeres Fenster

Mit einer größeren Länge beeinflussen mehr frühere Kurse den Durchschnitt. Die Linie wird meist glatter und folgt Kursänderungen später. Bei kürzerer Länge treten neue Kursbewegungen stärker hervor.

Probiere das mit denselben Daten aus:

  1. Starte beide Durchschnitte mit Länge zehn und betrachte einen gut erkennbaren Wendepunkt.
  2. Ändere die Länge in beiden Aufrufen auf 30.
  3. Ändere auch die Linientitel auf SMA 30 und EMA 30.
  4. Starte das Programm erneut und suche denselben Zeitpunkt.

Wir ändern den Titel mit, weil "SMA 10" nur eine Beschriftung ist. Die Zahl darin verändert die Berechnung nicht. Das zweite Argument des Aufrufs bestimmt das Fenster.

Probiere es selbst aus

Erstelle zwei einfache gleitende Durchschnitte: einen über fünf und einen über zwanzig Kerzen. Der kurze soll blau und der lange orange sein. Gib beiden einen passenden Titel.

Lösung der Aufgabe

Ersetze die beiden Berechnungen und die Darstellung im Rumpf von main() durch:

fast_average = ta.sma(close, 5)
slow_average = ta.sma(close, 20)
plot(fast_average, "SMA 5", color=color.blue, linewidth=2)
plot(slow_average, "SMA 20", color=color.orange, linewidth=2)

Bei Länge fünf fehlen die Werte der ersten vier Kerzen, bei Länge zwanzig die der ersten neunzehn. Nach der Aufwärmphase verwenden beide Linien dieselbe Schlusskursfolge mit unterschiedlichen Fenstergrößen.

Prüfe das Fenster

Einen SMA über drei Kerzen kannst du von Hand prüfen. Stelle die Länge auf drei, wähle drei aufeinanderfolgende Schlusskurse und berechne ihren Durchschnitt. Auf der dritten Kerze zeigt der Chart denselben Wert. Auf den ersten beiden Kerzen gibt es noch kein vollständiges Fenster.