σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademySkills
Ctrl K
AO
+1,2 Tsd. Lernende
AnmeldenBeitreten ↗
Skills
AO
+1,2 Tsd. Lernende
Anmelden
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Python-Skill›Modul 2 · NumPy & pandas für Marktdaten›Thema 2.17·~45 Min.Mittelstufe

Kapitalmaßnahmen: Splits und Dividenden

Position in der SkillModul 2 von 11 · Thema 17 von 20
2.17 Kapitalmaßnahmen: Splits und Dividenden
—Lab-Punkte— / 100XP gesamt—Serie—

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 anyone

Einen 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.003
Bereinigt für Renditen, roh für den HandelBereinigte Preise dienen dazu, Renditen zu messen und über die Zeit zu vergleichen. Sie sind nicht das, was Sie zahlen: Eine Order wird zum rohen, an dem Tag notierten Preis erteilt, und ein alter bereinigter Preis kann unter dem echten Kurs liegen, zu dem die Aktie gehandelt wurde. Behalten Sie beide Spalten (close 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_split die Preise über einen Split hinweg vergleichbar machen25 Pkt.
  • Mit adjust_volume_for_split die alten Volumen skalieren25 Pkt.
  • Mit dividend_factor den Anpassungsfaktor einer Dividende berechnen25 Pkt.
  • Mit adjust_for_dividend den Dividendenabschlag aus der Historie entfernen25 Pkt.
Explorer · lab-50-1
▾ lab-50-1
…
bash · im Browser
learner@quantcraft:~/lab-50-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

Alles in lab-50-1 wird auf die Startdateien zurückgesetzt und das Terminal geleert. Ihre aktuelle Lösung geht verloren – das lässt sich nicht rückgängig machen.

Wird zurückgesetzt
  • main.py → Startcode
  • Terminal-Verlauf und Testausgabe
  • Nicht eingereichte Änderungen
Bleibt erhalten
  • Beste Lab-Punktzahl
  • Ihre XP und Ihre Serie
  • Vorlesungsfortschritt und Notizen

Melde dich an, um deinen Code auszuführen.

Alle Lektionen kannst du kostenlos lesen. Erstelle ein Konto oder melde dich an, um Code auszuführen, Tests zu starten und dieses Lab abzugeben.

  • IDE im Browser mit Bash-Terminal — nichts zu installieren
  • Sofortige Bewertung, XP und dein Platz auf der Skill
Konto erstellenAnmelden
ODER
Weiter mit GitHub