Kursdiagramme mit Hilfe von Python und den Bibliotheken yfinance und mplfinance erstellen (2024)

Table of Contents
Voraussetzungen Befehle

Der heutige Beitrag behandelt die Beschaffung, Transformation und Darstellung von Kursdaten mit Hilfe der Python-Bibliotheken yfinance (ermöglicht den Bezug von Daten von Yahoo Finance) und mplfinance (Visualisierung von Börsendaten). Das nachfolgende Tutorial eignet sich für alle die, welche schnell und effizient ein Kursdiagramm eines Wertpapiers zeichnen und mit verschiedenen zusätzlichen Information (zum Beispiel Volumen, Trendlinien oder Verkauf-/Kaufsignale) versehen wollen.

Voraussetzungen

Damit die nachfolgenden Befehle auch korrekt ausgeführt werden können, muss eine funktionierende Python-Umgebung vorhanden sein. Eine Möglichkeit (Anaconda) wurde in einem der ersten Beiträge auf diesem Blog vorgestellt. Zusätzlich müssen noch folgende Python-Pakete installiert werden:

  • yfinance (Bezug von Daten der Webseite Yahoo Finance)
  • mplfinance (Erstellung von Kursdiagrammen)
  • ta (Technische Analysen)

Befehle

Die nachfolgenden Python-Anweisungen wurden ursprünglich mit Jupyter Notebook erstellt. Dabei handelt es sich um eine webbasierte, interaktive Plattform. Dabei werden die Ausgaben der einzelnen Befehle direkt im Anschluss an diese angezeigt. Auch Textpassagen können in Form von Markdown eingebaut werden. Die nachfolgenden Zeilen wurden direkt aus dieser Plattform exportiert.

Genug der Vorworte, nun sind wir startklar und können endlich mit dem spannenden Teil beginnen. Zuerst müssen alle benötigten Bibliotheken importiert werden:

1
2
3
4
5
import yfinance as yf
import pandas as pd
import numpy as np
import mplfinance as mpf
from ta.trend import MACD

Danach kann eine beliebige Aktie beziehungsweise ein ETF gesucht werden. Um das Ticker-Symbol zu finden, kann auf der Seite Yahoo Finance im Suchfeld die gewünschte Aktie gesucht werden, wobei das Symbol in der ersten Spalte der Suchresultate steht (bei Tesla zum Beispiel TSLA). In diesem Beispiel wird der iShares MSCI ACWI UCITS ETF USD (Acc) verwendet, welcher unter anderem an der XETRA (in Euro) gehandelt wird:

1
quote = yf.Ticker('IUSQ.DE')

Nun können verschiedene Aktionen auf dem Ticker-Objekt durchgeführt werden. Eine davon ist der Bezug von historischen Kursen. Mit Hilfe der Periode kann die Anzahl der Resultate gesteuert werden (mit max werden alle verfügbaren Datensätze geladen):

1
hist = quote.history(period='max')

Das Ergebnis der Abfrage kann angezeigt werden. Dies ist wichtig, um allfällige Fehler in den Daten zu finden. Es kann manchmal vorkommen, dass Unregelmässigkeiten in den Werten von Yahoo Finance auftauchen.

1
hist
OpenHighLowCloseVolumeDividendsStock Splits
Date
2011-10-2121.37000121.37000121.37000121.370001000
2011-10-2421.37000121.37000121.37000121.370001000
2011-10-2521.37000121.37000121.37000121.370001000
2011-10-2621.37000121.37000121.37000121.370001000
2011-10-2721.37000121.37000121.37000121.370001000
2022-03-3165.05000365.32000064.95999964.95999915833600
2022-04-0164.90000265.48999864.82000064.82000019890000
2022-04-0465.22000165.76999765.00000065.7200018353400
2022-04-0565.97000166.08000265.66000465.83999611411300
2022-04-0665.62000365.69999764.48999864.6399997784900

2651 rows × 7 columns

In der Ausgabe ist zu sehen, dass nicht nur die Schlusskurse mitgeliefert werden. Dividenden sowie das Handelsvolumen werden ebenfalls von der Datenquelle geliefert.

Nun soll der Kursverlauf in einem Diagramm visualisiert werden. Dazu sind einige Vorbereitungsarbeiten notwendig. Die nächsten beiden Zeilen definieren die Gestaltung des resultierenden Diagramms. Der dritte Befehl legt die Anzahl an Datenpunkten fest, welche in der Grafik gezeichnet werden sollen.

1
2
3
mc = mpf.make_marketcolors(up='#00ff00', down='#ff0000', inherit=True)
s = mpf.make_mpf_style(base_mpf_style='nightclouds', marketcolors=mc)
number_of_datapoints = 50

Die nachfolgende Anweisung generiert mit Hilfe von mplfinance ein Liniendiagramm inklusive Handelsvolumen. Die Werte für den Titel sowie die Y-Achse (Währungsinformation) des oberen Diagramms werden aus dem Attribut info des quote-Objektes entnommen. Mit Hilfe der Option figscale kann die Grösse der Grafik beeinflusst werden. Die Methode tail liefert die letzten x-Einträge des DataFrame’s (pandas Datenobjekt) zurück.

1
mpf.plot(hist.tail(number_of_datapoints), type='line', title=quote.info['longName'], ylabel='Price (%s)' % quote.info['currency'], volume=True, style=s, figscale=1.5)

Kursdiagramme mit Hilfe von Python und den Bibliotheken yfinance und mplfinance erstellen (1)

Nun haben wir jedoch das Problem, dass wir nur einen sehr kleinen Datenbereich anzeigen können. Um alle Datenpunkte (ca. 2’600) visualisieren zu können, müssen die Datenpunkte zusammengelegt werden. Dazu werden pandas-Hilfsmethoden verwendet, um 5 Handelstage zu einem Datensatz zusammenzulegen.

1
hist_1w = hist.asfreq('1D').resample('5D').agg({'Open': lambda x: x.bfill().iloc[0], 'High': max, 'Low': min, 'Close': lambda x: x.pad().iloc[-1], 'Volume': sum})

Danach wird das Resultat überprüft und die Anzahl der Datenpunkte erhöht:

1
hist_1w
OpenHighLowCloseVolume
Date
2011-10-2121.37000121.37000121.37000121.3700010.0
2011-10-2621.37000121.37000121.37000121.3700010.0
2011-10-3121.37000121.37000121.37000121.3700010.0
2011-11-0521.37000121.37000121.37000121.3700010.0
2011-11-1021.37000121.37000121.37000121.3700010.0
2022-03-1762.72000164.18000062.20000163.779999242524.0
2022-03-2264.30999864.93000064.20999964.690002309921.0
2022-03-2764.98999865.62999764.83999664.959999567759.0
2022-04-0164.90000266.08000264.82000065.839996396547.0
2022-04-0665.62000365.69999764.48999864.63999977849.0

765 rows × 5 columns

1
number_of_datapoints = 200

Die Python-Bibliothek mplfinance bietet auch die Möglichkeit, den bestehenden Graphen mit weiteren Informationen zu überlagern. Nun soll in einem nächsten Schritt ein Element der technischen Analyse integriert werden. In diesem Fall handelt es sich um den MACD Oszillator, welcher auf dem Schlusskurs berechnet wird:

1
macd_obj = MACD(hist_1w['Close'].tail(number_of_datapoints))

Nun werden die zusätzlichen Datenpunkte in einem Array abgelegt. Mit dem Attribut panel wird der Ort angegeben, wo die Punkte gezeichnet werden sollen (wobei das erste Diagramm den Wert 0 hat):

1
2
3
4
5
adps = [
mpf.make_addplot(macd_obj.macd_diff(), type='bar', ylabel='MACD', panel=1),
mpf.make_addplot(macd_obj.macd(), type='line', color='w', panel=1),
mpf.make_addplot(macd_obj.macd_signal(), type='line', color='r', panel=1)
]

Nach diesem Schritt kann die neue Grafik kreiert werden. Dieses Mal wird ein Kerzen-Diagramm mit einem gleitenden Durchschnitt (SMA, mit Fenstergrösse 14) erstellt. Darunter ist der MACD Oszillator zu finden:

1
mpf.plot(hist_1w.tail(number_of_datapoints), addplot=adps, type='candle', mav=(14,), style=s, figscale=1.5)

Kursdiagramme mit Hilfe von Python und den Bibliotheken yfinance und mplfinance erstellen (2)

Als letzter Schritt sollen die Kauf- beziehungsweise Verkaufssignale berechnet und im Diagramm angezeigt werden. Dazu werden wieder Methoden der pandas-Bibliothek verwendet. Ändert das MACD-Histogramm von Zeitpunkt t-1 zu t das Vorzeichen (Plus zu Minus), handelt es sich um ein Verkaufssignal. Wechselt das Vorzeichen von Minus zu Plus, bedeutet dies ein Kaufsignal.

1
2
sell_signal = macd_obj.macd_diff().rolling(2).apply(lambda x: 1 if x[0] > 0 and x[1] < 0 else 0).fillna(0).rename('Sell_Signal')
buy_signal = macd_obj.macd_diff().rolling(2).apply(lambda x: 1 if x[0] < 0 and x[1] > 0 else 0).fillna(0).rename('Buy_Signal')

Im Anschluss werden die Signale zu dem bestehenden Datenobjekt hinzugefügt und als Subgraph in das bereits bestehende Array aufgenommen

1
2
3
4
hist_1w['Sell_Signal'] = hist_1w.join(sell_signal).apply(lambda x: x['High'] + 2 if x['Sell_Signal'] == 1 else np.nan, axis=1)
adps.append(mpf.make_addplot(hist_1w['Sell_Signal'].tail(number_of_datapoints), type='scatter', markersize=50, marker='v', panel=0))
hist_1w['Buy_Signal'] = hist_1w.join(buy_signal).apply(lambda x: x['Low'] - 2 if x['Buy_Signal'] == 1 else np.nan, axis=1)
adps.append(mpf.make_addplot(hist_1w['Buy_Signal'].tail(number_of_datapoints), type='scatter', markersize=50, marker='^', panel=0))

Danach wird das finale Diagramm erstellt:

1
mpf.plot(hist_1w.tail(number_of_datapoints), addplot=adps, type='candle', mav=(14,), style=s, figscale=1.5)

Kursdiagramme mit Hilfe von Python und den Bibliotheken yfinance und mplfinance erstellen (3)

Die verwendeten Bibliotheken bieten natürlich noch viele weitere Funktionalitäten an. Auf den Projekt-Webseiten sind weitere Beispiele und Ideen zu finden.

Kursdiagramme mit Hilfe von Python und den Bibliotheken yfinance und mplfinance erstellen (2024)
Top Articles
Latest Posts
Article information

Author: Ouida Strosin DO

Last Updated:

Views: 5862

Rating: 4.6 / 5 (76 voted)

Reviews: 83% of readers found this page helpful

Author information

Name: Ouida Strosin DO

Birthday: 1995-04-27

Address: Suite 927 930 Kilback Radial, Candidaville, TN 87795

Phone: +8561498978366

Job: Legacy Manufacturing Specialist

Hobby: Singing, Mountain biking, Water sports, Water sports, Taxidermy, Polo, Pet

Introduction: My name is Ouida Strosin DO, I am a precious, combative, spotless, modern, spotless, beautiful, precious person who loves writing and wants to share my knowledge and understanding with you.