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

Ausreißer erkennen

Position in der SkillModul 2 von 11 · Thema 16 von 20
2.16 Ausreißer erkennen
—Lab-Punkte— / 100XP gesamt—Serie—

Ein Wert, der nicht stimmen kann

Eine Tagesrendite von +30 % bei einem Großwert ist entweder eine Übernahme oder ein Datenfehler wie ein vergessener Split oder ein verrutschtes Komma. Ein Ausreißer liegt weit genug von den anderen entfernt, um eine Entscheidung zu verlangen: behalten, korrigieren oder entfernen. Löschen Sie ihn nie, nur weil er stört, denn echte Schocks sind genau das, was Risikomodelle sehen müssen. Der erste Schritt ist immer, sie mit einer expliziten, wiederholbaren Regel sichtbar zu machen.

Die z-Wert-Regel und warum sie scheitern kann

Die klassische Regel markiert Werte, die mehr als 2 oder 3 Standardabweichungen vom Mittel entfernt liegen: z = (x - mean) / std. Sie ist einfach und funktioniert bei sauberen Daten. Doch der Ausreißer selbst bläht Mittelwert und vor allem Standardabweichung auf und versteckt sich so vor der Regel. Im Beispiel unten erhält der Tag mit +30 % nur einen z-Wert von 2,85 und würde bei einer Schwelle von 3 nicht markiert. Je extremer der Fehler, desto mehr schützt er sich.

import pandas as pd

returns = pd.Series([0.004, -0.002, 0.001, 0.003, -0.004, 0.002, 0.30, -0.001, 0.0, 0.002])

z = (returns - returns.mean()) / returns.std()
print(z.round(2).tolist())
# [-0.28, -0.34, -0.31, -0.29, -0.36, -0.3, 2.85, -0.33, -0.32, -0.3]

print(returns.mean().round(4), returns.std().round(4))   # 0.0305 0.0947   one day moved the mean tenfold
print(returns.drop(6).std().round(4))                    # 0.0026          the std without that day

Robuste Regeln: IQR und MAD

Robuste Statistiken werden von den Ausreißern, die sie jagen, kaum bewegt. Der Interquartilsabstand IQR = Q3 - Q1 misst die Streuung der mittleren Datenhälfte, und Werte jenseits von Q1 - 1.5 * IQR oder Q3 + 1.5 * IQR liegen außerhalb der Grenzen eines Boxplots. Die MAD (Median der absoluten Abweichungen) ersetzt die Standardabweichung durch einen Median, und der modifizierte z-Wert 0.6745 * (x - median) / MAD wird wie ein normaler z-Wert gelesen (3,5 ist eine übliche Grenze). Beide markieren den Tag mit +30 % mühelos.

# The fences of a box plot
q1, q3 = returns.quantile(0.25), returns.quantile(0.75)
spread = q3 - q1
lower, upper = q1 - 1.5 * spread, q3 + 1.5 * spread
print(round(lower, 4), round(upper, 4))                    # -0.006 0.008
print(returns[(returns < lower) | (returns > upper)].to_dict())   # {6: 0.3}

# The modified z-score, built on the median
median = returns.median()
mad = (returns - median).abs().median()
modified_z = 0.6745 * (returns - median) / mad
print(modified_z.round(1).tolist())   # [0.8, -1.2, -0.2, 0.5, -1.9, 0.2, 100.7, -0.8, -0.5, 0.2]

Winsorizing: begrenzen statt löschen

Das Löschen einer Zeile löscht auch die Information in ihren anderen Spalten und zerstört die Abstände der Daten. Winsorizing behält alle Zeilen und zieht die Extremwerte auf gewählte Quantile zurück, etwa das 1-%- und das 99-%-Quantil: Alles unter dem 1-%-Quantil wird zu diesem Quantil, alles über dem 99-%-Quantil zu diesem. In pandas ist das clip(lower, upper) mit Grenzen aus quantile. Die Form der Reihe bleibt erhalten, und die Extreme verlieren ihren Einfluss auf Mittelwerte und Regressionen.

low, high = returns.quantile(0.1), returns.quantile(0.9)
print(round(low, 4), round(high, 4))             # -0.0022 0.0336

clipped = returns.clip(lower=low, upper=high)
print(clipped.round(4).tolist())
# [0.004, -0.002, 0.001, 0.003, -0.0022, 0.002, 0.0336, -0.001, 0.0, 0.002]
#                                 ^ raised                  ^ the 30% day pulled back to the 90% quantile
# Flag with a rule, then look at what is flagged before deciding anything
mask = z.abs() > 2
print(returns[mask].to_dict())                 # {6: 0.3}        the +30% day
print(returns[~mask].std().round(4))           # 0.0026          the volatility of the remaining days
Entscheiden Sie mit einer Regel und schreiben Sie sie aufEine Ausreißerregel ist eine Modellierungsentscheidung, keine Tatsache. Prüfen Sie, was die markierten Tage sind (eine Nachricht, ein Split, ein fehlerhafter Tick), bevor Sie etwas ändern, behalten Sie die Originalspalte und notieren Sie die verwendete Schwelle. Eine andere Schwelle ergibt einen anderen Backtest.
  • Die z-Wert-Regel abs((x - mean) / std) > k ist einfach, doch Ausreißer blähen Mittel und Standardabweichung auf und können sich verstecken.
  • Robuste Regeln nutzen Quantile und Mediane: IQR-Grenzen (Q1 - 1.5 IQR, Q3 + 1.5 IQR) und den auf der MAD beruhenden modifizierten z-Wert.
  • clip(lower, upper) mit Quantilgrenzen (Winsorizing) behält die Zeilen; löschen Sie nie einen Schock, ohne zu wissen, was er ist.

Als Nächstes: Kapitalmaßnahmen, die Splits und Dividenden, die einen alten Preis mit dem heutigen unvergleichbar machen.

Lab: Was bewertet wird

  • Mit zscore_outliers die weit entfernten Renditen markieren25 Pkt.
  • Mit iqr_bounds die Grenzen des Boxplots berechnen25 Pkt.
  • Mit mad_outliers Ausreißer mit einem robusten Score markieren25 Pkt.
  • Mit winsorize die Extremwerte zähmen25 Pkt.
Explorer · lab-49-1
▾ lab-49-1
…
bash · im Browser
learner@quantcraft:~/lab-49-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

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