Eine Preishistorie, die lügt
Teilt ein Unternehmen seine Aktien im Verhältnis 4:1, erhält jeder Inhaber vier Aktien für jede alte, und der Kurs fällt auf ein Viertel. Niemand hat etwas verloren, doch die Rohhistorie zeigt einen Tag mit -75 %. Eine Bardividende bewirkt im Kleinen dasselbe: Am Ex-Tag fällt der Kurs ungefähr um die Dividende. Eine Strategie, die Rohpreise liest, sieht Crashs, die niemandem geschadet haben. Die Lösung ist, die Historie anzupassen: alle Tage vor dem Ereignis neu zu skalieren, sodass die Reihe lückenlos und mit den heutigen Preisen vergleichbar ist.
import pandas as pd
index = pd.bdate_range("2026-03-02", periods=6)
raw = pd.Series([480.0, 484.0, 488.0, 123.0, 124.5, 126.0], index=index, name="close") # 4-for-1 split on 5 March
print(raw.pct_change().round(4).tolist())
# [nan, 0.0083, 0.0083, -0.748, 0.0122, 0.012] the -74.8% day never happened to anyoneEinen Split anpassen
Nur die Tage vor dem Split ändern sich: Teilen Sie deren Preise durch das Verhältnis (4 bei einem 4:1-Split). Die aktuellen Preise bleiben wie notiert, die angepasste Reihe endet also beim echten heutigen Preis. Bilden Sie mit index >= split_date eine Wahr/Falsch-Maske (ein String funktioniert gegen einen DatetimeIndex) und nutzen Sie where, das einen Wert behält, wo die Maske wahr ist, und sonst den Ersatz nimmt. Das Volumen geht den anderen Weg: Nach dem Split werden viermal so viele Aktien gehandelt, daher werden frühere Volumen mit dem Verhältnis multipliziert. Ein Reverse Split nutzt ein Verhältnis unter 1 und dieselben Formeln.
split_date = "2026-03-05"
adjusted = raw.where(raw.index >= split_date, raw / 4) # the days before the split, divided by 4
print(adjusted.tolist()) # [120.0, 121.0, 122.0, 123.0, 124.5, 126.0]
print(adjusted.pct_change().round(4).tolist()) # [nan, 0.0083, 0.0083, 0.0082, 0.0122, 0.012] no more crash# Volume goes the other way: older days are multiplied
volume = pd.Series([1000, 1100, 900, 4200, 4000, 4300], index=index)
print(volume.where(volume.index >= split_date, volume * 4).tolist()) # [4000, 4400, 3600, 4200, 4000, 4300]Eine Dividende anpassen
Eine Dividende ist kleiner als ein Split, die Anpassung ist daher ein Faktor nahe 1: 1 - Dividende / vorheriger Schlusskurs, wobei der vorherige Schlusskurs der letzte Schluss vor dem Ex-Tag ist. Multiplizieren Sie jeden Preis vor dem Ex-Tag mit diesem Faktor. Der Schluss unmittelbar vor dem Ex-Tag fällt dann genau um die Dividende, die Bewegung am Ex-Tag zeigt nur, was der Markt wirklich getan hat, und aus der angepassten Reihe berechnete Renditen enthalten die Dividende. Diesen bereinigten Schlusskurs sollten Renditeberechnungen verwenden. Legen Sie den Faktor in eine eigene kleine Funktion, um ihn testen und wiederverwenden zu können.
def dividend_factor(prev_close, dividend):
return 1 - dividend / prev_close
prices = pd.Series([100.0, 101.0, 102.0, 100.8, 101.5, 102.5], index=index) # a 1.50 dividend, ex-date 5 March
ex_date, dividend = "2026-03-05", 1.5
prev_close = prices[prices.index < ex_date].iloc[-1] # 102.0, the last close before the ex-date
factor = dividend_factor(prev_close, dividend)
print(round(factor, 6)) # 0.985294
adjusted = prices.where(prices.index >= ex_date, prices * factor)
print(adjusted.round(4).tolist()) # [98.5294, 99.5147, 100.5, 100.8, 101.5, 102.5]
print(prices.pct_change().round(4).tolist()[3], adjusted.pct_change().round(4).tolist()[3]) # -0.0118 0.003close und adj_close) und sagen Sie, welche eine Berechnung nutzt.- Ein Split teilt die alten Preise durch das Verhältnis und multipliziert die alten Volumen damit; nur die Tage vor dem Split ändern sich.
- Eine Dividende multipliziert die Preise vor dem Ex-Tag mit
1 - Dividende / vorheriger Schluss. - Nutzen Sie
where(index >= date, bereinigt)mit einer Maske statt einer Schleife; berechnen Sie Renditen aus bereinigten Preisen, handeln Sie zu rohen.
Als Nächstes: Liniendiagramme mit matplotlib, um die nun saubere Preisreihe zu zeichnen.
Lab: Was bewertet wird
- Mit
adjust_for_splitdie Preise über einen Split hinweg vergleichbar machen25 Pkt. - Mit
adjust_volume_for_splitdie alten Volumen skalieren25 Pkt. - Mit
dividend_factorden Anpassungsfaktor einer Dividende berechnen25 Pkt. - Mit
adjust_for_dividendden Dividendenabschlag aus der Historie entfernen25 Pkt.