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

Die Sharpe-Ratio

Position in der SkillModul 3 von 11 · Thema 7 von 12
3.7 Die Sharpe-Ratio
—Lab-Punkte— / 100XP gesamt—Serie—

Ertrag je Risikoeinheit

Eine Strategie mit 12 % Ertrag bei 20 % Volatilität ist nicht besser als eine mit 6 % bei 5 %. Die Sharpe Ratio bringt beide auf eine Skala: die durchschnittliche Rendite über dem risikofreien Zins geteilt durch die Volatilität, (mean - rf) / std, annualisiert mit sqrt(Perioden). Die Formel kennen Sie aus dem Thema Mittelwert und Varianz. Dieses Thema behandelt ihre Anwendung: wie man eine Sharpe Ratio liest, verbessert und vor allem, wie weit man ihr trauen kann. Ein Sharpe von 0,5 ist mäßig, 1 gut, 2 hervorragend und verdächtig.

Volatilität zählt Aufwärts- und Abwärtsbewegung gleich, doch niemand beschwert sich über einen Überraschungsgewinn. Die Sortino Ratio behält nur die schlechte Seite: Sie ersetzt die Standardabweichung durch die Abwärtsabweichung sqrt(mean(min(r - mar, 0)²)), wobei mar die Mindestrendite ist. Tage über mar tragen null bei, zählen aber im Durchschnitt mit. Eine Strategie mit großen positiven Sprüngen und kleinen Verlusten schneidet bei Sortino viel besser ab als bei Sharpe.

import math
import numpy as np
import pandas as pd

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

sharpe = returns.mean() / returns.std(ddof=1) * math.sqrt(252)
print(round(sharpe, 3))                                  # 0.598

mar = 0.0                                                # a day below zero is a bad day
downside = math.sqrt(np.mean(np.minimum(returns - mar, 0) ** 2))
sortino = (returns.mean() - mar) / downside * math.sqrt(252)
print(round(downside, 5), round(sortino, 3))             # 0.00329 0.804   the up days no longer count as risk

Es sich bewegen sehen

Eine einzige Sharpe Ratio für die ganze Historie verbirgt die Geschichte. Eine gleitende Sharpe Ratio berechnet sie auf den letzten window Renditen neu, sodass man die guten und schlechten Phasen der Strategie sieht. In pandas ist es der gleitende Mittelwert geteilt durch die gleitende Standardabweichung, annualisiert. Beachten Sie, wie wild kurze Fenster springen: Ein Monat Daten reicht bei Weitem nicht, um Strategien zu ordnen.

series = pd.Series(returns)
rolling = series.rolling(5)
rolling_sharpe = rolling.mean() / rolling.std() * math.sqrt(252)
print(rolling_sharpe.round(2).tolist())
# [nan, nan, nan, nan, 1.89, 0.0, 6.96, 4.97, -3.66, 0.51, 0.51, -4.69]   a 5-day Sharpe ratio is mostly noise

Wie viel davon ist Glück?

Eine Sharpe Ratio ist eine Schätzung, und Schätzungen haben Fehler. Für eine Sharpe Ratio je Periode sr, gemessen an n Renditen, beträgt der Standardfehler etwa sqrt((1 + 0,5 * sr²) / n). Bei unseren 12 Tagen sind es 0,29 pro Tag gegenüber einem Sharpe von 0,04: Der Fehler ist das Siebenfache der Schätzung. Annualisiert ergeben dieselben 12 Tage 0,6 ± 4,6. Für eine jährliche Sharpe Ratio S über years Jahre ist die t-Statistik S * sqrt(years), man braucht also (1,96 / S)² Jahre, um zu 95 % sicher zu sein, dass sie nicht null ist: 15 Jahre bei Sharpe 0,5, 4 Jahre bei Sharpe 1. Kurze Backtests bescheidener Strategien beweisen nichts.

per_period = returns.mean() / returns.std(ddof=1)            # the per-day Sharpe ratio
std_error = math.sqrt((1 + 0.5 * per_period ** 2) / len(returns))
print(round(per_period, 4), round(std_error, 4))            # 0.0376 0.2888   the error is 7 times the estimate
print(round(std_error * math.sqrt(252), 3))                 # 4.584           annualised: 0.6 +/- 4.6

# Years needed for an annual Sharpe ratio to reach t = 1.96
for annual in (0.5, 1.0, 2.0):
    print(annual, round((1.96 / annual) ** 2, 1))
# 0.5 15.4
# 1.0 3.8
# 2.0 1.0
# A yearly Sharpe of 1.0 observed over 4 years (1,008 days): how precise is it?
per_day = 1.0 / math.sqrt(252)
error_per_day = math.sqrt((1 + 0.5 * per_day ** 2) / 1008)
print(round(per_day, 4), round(error_per_day, 4), round(error_per_day * math.sqrt(252), 3))   # 0.063 0.0315 0.5   so 1.0 +/- 0.5
Der beste Backtest ist der am wenigsten vertrauenswürdigeProbieren Sie 100 Varianten einer Strategie und behalten die mit der höchsten Sharpe Ratio, ist die Zahl des Gewinners durch die Auswahl aufgebläht: Selbst Strategien ohne Vorteil erzeugen zufällig einen Sharpe von 1 oder mehr. Teilen Sie Ihre Begeisterung durch die Zahl der probierten Varianten, testen Sie an Daten, die die Auswahl nie sah, und bevorzugen Sie Ideen mit ökonomischem Grund.
  • Sharpe = (mean - rf) / std * sqrt(Perioden); Sortino ersetzt die Standardabweichung durch die Abwärtsabweichung sqrt(mean(min(r - mar, 0)²)).
  • Eine gleitende Sharpe Ratio (rolling.mean() / rolling.std()) zeigt, wie sich die Kennzahl ändert; kurze Fenster sind überwiegend Rauschen.
  • Sein Standardfehler ist sqrt((1 + 0,5 * sr²) / n) je Periode; die t-Statistik einer jährlichen Sharpe Ratio ist S * sqrt(years): Ein Sharpe von 1 braucht etwa 4 Jahre.

Als Nächstes: Drawdowns, die Verluste vom Höchststand, die Anleger tatsächlich spüren.

Lab: Was bewertet wird

  • Mit sortino_ratio nur die schlechten Tage bestrafen25 Pkt.
  • Mit rolling_sharpe die Veränderung der Kennzahl über die Zeit beobachten25 Pkt.
  • Mit sharpe_standard_error das Glück in einer Sharpe Ratio bemessen25 Pkt.
  • Mit sharpe_t_stat fragen, ob es echt ist25 Pkt.
Explorer · lab-60-1
▾ lab-60-1
…
bash · im Browser
learner@quantcraft:~/lab-60-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

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