σμ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.15·~40 Min.Mittelstufe

Umgang mit fehlenden Daten

Position in der SkillModul 2 von 11 · Thema 15 von 20
2.15 Umgang mit fehlenden Daten
—Lab-Punkte— / 100XP gesamt—Serie—

Lücken in den Daten

Echte Preistabellen haben Lücken: Eine Aktie wurde an dem Tag nicht gehandelt, ein Feed hat eine Notierung verloren, ein Markt hatte Feiertag. pandas markiert sie als NaN („not a number“). Bevor Sie entscheiden, was zu tun ist, schauen Sie hin: df.isna() liefert eine Wahr/Falsch-Tabelle, .sum() zählt die Lücken je Spalte, und .mean() gibt ihren Anteil. Eine zu 40 % leere Spalte ist ein anderes Problem als eine, der ein einziger Wert fehlt.

import pandas as pd

nan = float("nan")
df = pd.DataFrame(
    {"AAPL": [184.0, nan, 186.5, 187.0, nan], "MSFT": [410.0, 411.0, nan, nan, 415.0]},
    index=pd.bdate_range("2026-03-02", periods=5),
)

print(df.isna().sum().to_dict())           # {'AAPL': 2, 'MSFT': 2}   holes per column
print(df.isna().mean().round(2).to_dict())   # {'AAPL': 0.4, 'MSFT': 0.4}   share of holes

Fortschreiben oder entfernen

Bei Preisen ist die natürliche Füllung der letzte bekannte Preis: Bis eine neue Notierung eintrifft, steht der Markt noch beim alten. Das ist ffill() (Vorwärtsfüllung). Eine lange Lücke bedeutet wohl veraltete Daten, daher füllt ffill(limit=2) höchstens zwei Tage in Folge. NaN ganz am Anfang bleiben NaN, weil es keinen früheren Preis zum Fortschreiben gibt. Die Alternative ist das Entfernen: dropna() löscht jede Zeile mit einer Lücke, und dropna(subset=["AAPL"]) betrachtet nur die Spalten, die Ihnen wichtig sind. Entfernen ist sicher, verkleinert aber die Daten und ändert die Abstände zwischen den Daten.

msft = df["MSFT"]
print(msft.ffill().tolist())           # [410.0, 411.0, 411.0, 411.0, 415.0]
print(msft.ffill(limit=1).tolist())    # [410.0, 411.0, 411.0, nan, 415.0]   only one day carried

print(len(df.dropna()))                          # 1   only one row is complete
print(len(df.dropna(subset=["AAPL"])))           # 3   rows where AAPL is known

Interpolation und was man nie füllt

interpolate() füllt eine Lücke mit einer Geraden zwischen den bekannten Werten beiderseits. Es passt zu glatten Größen (Zinskurve, Volatilitätsniveau) und selten zu Preisen, die springen. Vorsicht an den Rändern: Standardmäßig kopiert interpolate() den letzten Wert auch in nachlaufende NaN, was Daten erfindet. limit_area="inside" beschränkt es auf Lücken zwischen zwei bekannten Werten. Füllen Sie nie blind mit 0: Ein Preis von 0 ist ein Crash, eine Rendite von 0 ein flacher Tag, und fillna(0) auf der falschen Tabelle verändert still jeden später berechneten Durchschnitt.

gappy = pd.Series([nan, nan, 10.0, nan, nan, 16.0, nan])

print(gappy.interpolate().tolist())
# [nan, nan, 10.0, 12.0, 14.0, 16.0, 16.0]   the last 16.0 is invented

print(gappy.interpolate(limit_area="inside").tolist())
# [nan, nan, 10.0, 12.0, 14.0, 16.0, nan]    only between known values
# Filling with 0 is a decision, not a default: it changes the statistics
print(gappy.fillna(0).tolist())   # [0.0, 0.0, 10.0, 0.0, 0.0, 16.0, 0.0]
print(gappy.mean())                # 13.0   NaN are skipped
print(gappy.fillna(0).mean())      # 3.7142857142857144   the zeros drag the average down
Füllen Sie mit der Vergangenheit, nie mit der Zukunftbfill() und interpolate() nutzen Werte nach der Lücke und verwenden damit am Datum der Lücke Informationen, die es noch nicht gab. In einem Backtest ist das Look-ahead-Bias. Verwenden Sie ffill() für alles, was eine Strategie in Echtzeit sieht, und heben Sie sich die Interpolation für die Bereinigung historischer Daten auf, die als Ganzes analysiert werden.
  • df.isna().sum() zählt die Lücken je Spalte; schauen Sie sich die Daten an, bevor Sie über die Behandlung entscheiden.
  • ffill(limit=n) schreibt den letzten bekannten Wert fort (die richtige Wahl für Preise); dropna(subset=...) entfernt unvollständige Zeilen.
  • interpolate(limit_area="inside") überbrückt nur innere Lücken; füllen Sie nie aus Gewohnheit mit 0 oder mit der Zukunft.

Als Nächstes: Ausreißer erkennen, die vorhandenen Werte finden, die nicht stimmen können.

Lab: Was bewertet wird

  • Mit count_missing die Lücken jeder Spalte zählen25 Pkt.
  • Mit forward_fill den letzten Preis fortschreiben25 Pkt.
  • Mit complete_rows nur die verlässlichen Zeilen behalten25 Pkt.
  • Mit fill_gaps die Lücken innerhalb der Daten überbrücken25 Pkt.
Explorer · lab-48-1
▾ lab-48-1
…
bash · im Browser
learner@quantcraft:~/lab-48-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

Alles in lab-48-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