Kursdaten laden: CSV-Dateien und kostenlose APIs, adjustierte und unadjustierte Kurse, fehlende Werte und Zeitzonen
Lesen Sie Kursdateien und API-Downloads in einen sauberen DataFrame ein, verstehen Sie, wie Split- und Dividendenadjustierungen funktionieren, und behandeln Sie Lücken und Zeitzonen korrekt.
Was Sie lernen werden
- Wie Sie eine CSV-Datei mit korrekten Datumsangaben in einen DataFrame einlesen und welche Argumente die üblichen Importprobleme beheben.
- Was kostenlose Daten-APIs liefern, was ihre Lizenzen und Standardeinstellungen bedeuten und wie Sie Downloads zwischenspeichern.
- Wie Split- und Dividenden-Adjustierungsfaktoren berechnet werden und warum ein Backtest adjustierte Kurse braucht, eine Live-Order aber unadjustierte.
- Wie Sie fehlende Werte finden und behandeln und wie Sie Zeitzonen zuweisen und umrechnen, ohne Ihre Balken zu verschieben.
Erklärung
CSV-Dateien. Eine CSV-Datei (comma-separated values, kommagetrennte Werte) ist reiner Text mit einer Zeile pro Balken. Der zentrale Aufruf lautet:
df = pd.read_csv("data/raw/xyz.csv", parse_dates=["Date"], index_col="Date")
parse_dates wandelt die Textspalte in Zeitstempel um, und index_col macht sie zum Index. Übliche Korrekturen: sep=";" und decimal="," für deutsche Exporte, dayfirst=True für Datumsangaben wie 03.04.2025 und date_format="%d.%m.%Y", wenn das Parsen falsch ist. Führen Sie nach dem Laden df = df.sort_index() aus (manche Exporte beginnen mit dem neuesten Datum), prüfen Sie df.index.is_unique und schreiben Sie die Spaltennamen mit df.columns = df.columns.str.lower() klein.
Kostenlose APIs. Eine API (application programming interface, Programmierschnittstelle) ermöglicht es Code, Daten von einem Server anzufordern. Für ein erstes Projekt ist die Bibliothek yfinance (Daten von Yahoo Finance) die übliche Wahl: yf.download("SAP.DE", start="2015-01-01"); sie ist für die private Recherche gedacht, und die Genauigkeit ist nicht garantiert. Eine Standardeinstellung ist wichtig: Stand 2026 gilt auto_adjust=True, sodass Eröffnung, Hoch, Tief und Schluss bereits um Splits und Dividenden adjustiert sind und es keine Spalte „Adj Close“ gibt; mit auto_adjust=False erhalten Sie split-adjustierte OHLC-Daten plus eine Spalte „Adj Close“, die auch Dividenden berücksichtigt. Alternativen mit kostenlosem Kontingent sind Stooq (CSV-Downloads), Alpha Vantage und Tiingo (Registrierung und API-Schlüssel erforderlich, strenge Anfragelimits); die Bedingungen ändern sich, prüfen Sie daher die aktuellen Konditionen, und Lektion 12 behandelt den Umgang mit Schlüsseln und Rate-Limits. Unabhängig von der Quelle: Speichern Sie den Roh-Download einmal in data/raw/ (CSV oder Parquet) und arbeiten Sie mit der Datei; Anbieter überarbeiten historische Daten, und Limits sind knapp.
Adjustiert und unadjustiert. Im Kurs „Systematisches Trading“ wurde erklärt, warum Splits und Dividenden Backtests verzerren; hier sehen Sie, wie die Korrektur funktioniert. Bei einem Split im Verhältnis n:1 wird jeder frühere Kurs durch n geteilt (und das Volumen mit n multipliziert). Bei einer Bar-Dividende D mit Ex-Tag t multipliziert die Standardmethode alle Kurse vor Tag t mit dem Faktor 1 − D ÷ C, wobei C der Schlusskurs am letzten Tag vor dem Ex-Tag ist. Adjustierungen wirken kumulativ rückwärts. Folgen: Die adjustierte Historie ändert sich mit jeder neuen Dividende, und prozentuale Renditen sind korrekt, Kursniveaus in Euro dagegen nicht. Regel: Backtesten Sie mit adjustierten Daten, platzieren Sie echte Orders zu unadjustierten Kursen und mischen Sie beides nie in einer Berechnung.
Fehlende Werte. pandas kennzeichnet Lücken als NaN. Finden Sie sie mit df.isna().sum(). Ein paar Kurslücken mit df["close"].ffill() vorwärts aufzufüllen ist akzeptabel, aber füllen Sie niemals das Volumen vorwärts auf und interpolieren Sie niemals Kurse, denn die Interpolation nutzt den zukünftigen Wert und schleust Look-Ahead-Bias ein (Lektion 7). Andernfalls entfernen Sie Zeilen mit df.dropna(subset=["close"]) und notieren, wie viele es waren. Beachten Sie, dass die alte Syntax fillna(method="ffill") seit pandas 2.1 als veraltet gilt und in neuem Code nicht verwendet werden sollte; schreiben Sie .ffill().
Zeitzonen. Tagesbalken brauchen sie selten, Intraday-Daten immer. tz_localize("Europe/Berlin") weist einem zeitzonenlosen Index eine Zone zu, ohne die Uhrzeiten zu ändern; tz_convert("America/New_York") ändert die Uhrzeiten. Werden UTC-Daten versehentlich als Berliner Zeit lokalisiert, verschiebt sich jeder Balken unbemerkt um ein oder zwei Stunden; prüfen Sie daher die Dokumentation des Anbieters. Die Termine der Sommerzeitumstellung unterscheiden sich zwischen Europa und den USA, und genau dann bringen falsch behandelte Zeitstempel Instrumente aus dem Takt.
Durchgerechnetes Beispiel
Hypothetisches Beispiel: Eine Aktie schließt am Montag bei €50.00. Eine Dividende von €1.00 hat ihren Ex-Tag am Dienstag, an dem die Aktie bei €49.50 schließt. Gebühren und Steuern werden ignoriert.
Adjustierungsfaktor = 1 − 1.00 ÷ 50.00 = 0.98. Alle Kurse vor Dienstag werden mit 0.98 multipliziert: Der Schlusskurs vom Montag wird zu 50 × 0.98 = €49.00; ein Schlusskurs von €48.00 aus der Vorwoche wird zu 48 × 0.98 = €47.04.
Rendite über den Ex-Tag hinweg: unadjustiert (49.50 − 50.00) ÷ 50.00 = −1.0%, was fälschlich wie ein Verlust aussieht. Adjustiert (49.50 − 49.00) ÷ 49.00 = +1.02%, was die erhaltenen €1.00 in bar gegenüber einem Kursverlust von €0.50 korrekt widerspiegelt (netto +€0.50 auf €50; die kleine Abweichung entsteht, weil die adjustierte Basis €49 beträgt).
Nun ein Split im Verhältnis 2:1: Rohschlusskurse 100, 102, 104 vorher und 52, 53 nachher. Teilt man die Kurse vor dem Split durch 2, ergibt sich 50, 51, 52, 52, 53, eine durchgehende Reihe. Ohne diese Korrektur meldet pct_change() am Tag des Splits eine Rendite von −50%, einen Crash, der nie stattgefunden hat.
Häufiger Fehler
info(), head(), tail(), isna().sum() und ein Liniendiagramm des Schlusskurses.Übungsaufgabe
Auf Papier: Eine Aktie hat an zwei Tagen Schlusskurse von €90.00 und €93.00, dann folgt ein Split im Verhältnis 3:1, danach Schlusskurse von €31.00 und €30.38 (hypothetisch). Am Tag des Schlusskurses von €30.38 hat eine Dividende von €0.60 ihren Ex-Tag, und der Schlusskurs davor lag bei €31.00. (a) Schreiben Sie die split-adjustierten Werte der beiden Schlusskurse vor dem Split auf. (b) Berechnen Sie den Dividenden-Adjustierungsfaktor und wenden Sie ihn auf alle drei Schlusskurse vor dem Ex-Tag an. (c) Geben Sie die rohe und die vollständig adjustierte Rendite vom Schlusskurs €31.00 zum Schlusskurs €30.38 an.
Lösung anzeigen
(a) Durch 3 teilen: €90.00 → €30.00 und €93.00 → €31.00.
(b) Faktor = 1 − 0.60 ÷ 31.00 = 0.98065 (gerundet). Angewendet: 30.00 × 0.98065 = €29.42; 31.00 × 0.98065 = €30.40; und auch der Schlusskurs von €31.00 vor dem Ex-Tag wird zu €30.40. Der Schlusskurs von €30.38 bleibt unverändert.
(c) Roh: (30.38 − 31.00) ÷ 31.00 = −2.00%. Adjustiert: (30.38 − 30.40) ÷ 30.40 = −0.07%, also nahezu unverändert: Der Kurs fiel ungefähr um den Dividendenbetrag, sodass der Inhaber an Gesamtrendite fast nichts verlor.
Einschränkungen: Anbieter runden Faktoren unterschiedlich, und manche verwenden einen anderen Referenzkurs; verwenden Sie konsequent die adjustierte Reihe eines einzigen Anbieters.
Kernaussagen
- Laden Sie mit
parse_datesundindex_col, sortieren Sie dann, prüfen Sie die Eindeutigkeit und vereinheitlichen Sie die Spaltennamen. - Laden Sie einmal herunter, speichern Sie die Rohdaten lokal und lesen Sie die Lizenz der API und ihre Standardeinstellungen zur Adjustierung (yfinance:
auto_adjust=True, Stand 2026). - Split-Faktor 1 ÷ n, Dividendenfaktor 1 − D ÷ C, rückwärts angewendet; backtesten Sie mit adjustierten Kursen, handeln Sie zu unadjustierten.
- Füllen Sie höchstens ein paar Kurslücken vorwärts auf, interpolieren Sie nie, füllen Sie nie das Volumen vorwärts auf und lokalisieren Sie Zeitzonen einmal mit der tatsächlichen Zone des Anbieters.
Nächster Schritt
Lektion 5 macht aus Kursen Renditen: einfache und logarithmische Renditen, kumulierte Renditen, annualisierte Rendite und Volatilität sowie rollierende Fenster.
Selbsttest
Beantworten Sie die Fragen und prüfen Sie dann Ihre Antworten. Sie können es so oft wiederholen, wie Sie möchten.
Automatischer Selbsttest zur eigenen Wiederholung. Ihre Antworten werden in Ihrem Browser geprüft und von uns weder eingesehen noch bewertet. Es ist keine Prüfung und kein Abschluss.
Ihr Fortschritt
„Erledigt“ bedeutet nur, dass Sie die Lektion als abgeschlossen markiert haben. Es ist kein Test Ihres Verständnisses. Fortschritt und Notizen werden nur in diesem Browser auf diesem Gerät gespeichert — nicht in einem Konto.