σμ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 3 · Wahrscheinlichkeit & Monte-Carlo-Simulation›Thema 3.1·~40 Min.Mittelstufe

Mittelwert und Varianz von Renditen

Position in der SkillModul 3 von 11 · Thema 1 von 12
3.1 Mittelwert und Varianz von Renditen
—Lab-Punkte— / 100XP gesamt—Serie—

Zwei Zahlen für eine Verteilung

Eine Spalte von Renditen lässt sich schwer mit einer anderen vergleichen. Zwei Zahlen fassen das meiste zusammen: Der Mittelwert sagt, wo die Renditen zentriert sind, die Varianz, wie breit sie um dieses Zentrum streuen. Bei n Renditen ist der Mittelwert sum(x) / n; die Abweichungen x - mean summieren sich immer zu null, daher werden sie zum Messen der Streuung zuerst quadriert. Die Stichprobenvarianz ist die Summe der quadrierten Abweichungen geteilt durch n - 1, nicht n: Der Mittelwert wurde aus denselben Daten geschätzt, was die Abweichungen etwas zu klein macht, und die Division durch n - 1 korrigiert das.

variance = sum((x - mean)^2) / (n - 1) std = sqrt(variance)
import numpy as np

returns = np.array([0.004, -0.002, 0.001, 0.003, -0.004, 0.002, 0.006, -0.001])

mean = returns.mean()
deviations = returns - mean
print(round(mean, 5))                         # 0.00113
print(abs(deviations.sum()) < 1e-12)           # True   the deviations always add up to zero

variance = (deviations ** 2).sum() / (len(returns) - 1)
print(round(variance, 8), round(returns.var(ddof=1), 8))   # 1.098e-05 1.098e-05   the same as numpy's var(ddof=1)

Standardabweichung und Volatilität

Das Quadrieren hat die Einheiten verändert: Eine Renditevarianz liegt in „Prozent zum Quadrat“. Ihre Quadratwurzel, die Standardabweichung, ist wieder in der Einheit der Renditen und heißt in der Finanzwelt Volatilität. Sie ist das gebräuchlichste Risikomaß. Ein typischer Tag eines Großwerts bewegt sich um etwa 1 bis 2 %, also eine Volatilität von 0,01 bis 0,02 pro Tag. Sie wird relativ zum Mittelwert gelesen: Bei einer Volatilität von 1,2 % pro Tag liegt ein Tag mit -3,6 % drei Standardabweichungen entfernt.

std = np.sqrt(variance)
print(round(std, 6), round(returns.std(ddof=1), 6))   # 0.003314 0.003314   daily volatility of these returns

# How many standard deviations is the worst day from the mean?
print(round((returns.min() - mean) / std, 2))          # -1.55

Annualisieren und die Sharpe Ratio

Tageszahlen sind klein und wenig aussagekräftig, daher gibt man sie pro Jahr an. Der Mittelwert wächst linear mit der Zeit (252 Handelstage im Jahr: mit 252 multiplizieren), die Volatilität aber mit der Quadratwurzel der Zeit: mit sqrt(252) multiplizieren, etwa 15,9. Der Grund: Zufällige Tagesbewegungen heben sich teilweise auf, die Unsicherheit wächst daher langsamer als der Mittelwert. Die Sharpe Ratio teilt die durchschnittliche Rendite über dem risikofreien Zins (die Überschussrendite) durch die Volatilität: Ertrag je Risikoeinheit, auf dieselbe Weise annualisiert. So lässt sich eine ruhige Strategie mit einer wilden vergleichen.

periods = 252
print(round(mean * periods, 4))                  # 0.2835   annual mean: 28.35% (a made-up, very lucky sample)
print(round(std * np.sqrt(periods), 4))          # 0.0526   annual volatility: 5.26%

risk_free = 0.0001                               # risk-free return of one day
excess = returns - risk_free
sharpe = excess.mean() / np.sqrt(((excess - excess.mean()) ** 2).sum() / (len(excess) - 1)) * np.sqrt(periods)
print(round(sharpe, 3))                          # 4.91   absurdly good, because 8 lucky days prove nothing
# How precisely do 8 days pin down the mean? The standard error is std / sqrt(n)
standard_error = std / np.sqrt(len(returns))
print(round(float(standard_error), 6))          # 0.001172   larger than the mean itself (0.00113)
Eine Kennzahl stammt aus einer StichprobeDer Mittelwert von 8 Tagen ist eine sehr verrauschte Schätzung: Sein Standardfehler beträgt etwa std / sqrt(n), hier 0,0012, mehr als der Mittelwert selbst (0,0011). Eine großartige Sharpe Ratio über wenige Wochen sagt wenig; je mehr Beobachtungen, desto mehr kann man einem Mittelwert trauen, und Risikokennzahlen sind weit stabiler als Durchschnittsrenditen.
  • Mittelwert: x.mean(); Stichprobenvarianz: ((x - mean) ** 2).sum() / (n - 1); die Volatilität ist ihre Quadratwurzel.
  • Annualisieren Sie den Mittelwert mit * periods und die Volatilität mit * sqrt(periods): Das Risiko wächst mit der Quadratwurzel der Zeit.
  • Sharpe = mittlere Überschussrendite / ihre Standardabweichung * sqrt(periods): Ertrag je Risikoeinheit; kurze Stichproben machen sie unzuverlässig.

Als Nächstes: Schiefe und Kurtosis, die beiden Kennzahlen, die die Form der Verteilung jenseits von Zentrum und Streuung beschreiben.

Lab: Was bewertet wird

  • Mit sample_variance die Streuung der Renditen messen25 Pkt.
  • Mit sample_std die Streuung in der Einheit der Renditen ausdrücken25 Pkt.
  • Mit annualized_stats Mittelwert und Volatilität annualisieren25 Pkt.
  • Mit sharpe_ratio die Rendite je Risikoeinheit bewerten25 Pkt.
Explorer · lab-54-1
▾ lab-54-1
…
bash · im Browser
learner@quantcraft:~/lab-54-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

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