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 riskEs 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 noiseWie 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- Sharpe =
(mean - rf) / std * sqrt(Perioden); Sortino ersetzt die Standardabweichung durch die Abwärtsabweichungsqrt(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 istS * 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_rationur die schlechten Tage bestrafen25 Pkt. - Mit
rolling_sharpedie Veränderung der Kennzahl über die Zeit beobachten25 Pkt. - Mit
sharpe_standard_errordas Glück in einer Sharpe Ratio bemessen25 Pkt. - Mit
sharpe_t_statfragen, ob es echt ist25 Pkt.