Dos números para una distribución
Una columna de rendimientos es difícil de comparar con otra. Dos números resumen la mayor parte: la media dice dónde están centrados los rendimientos y la varianza cuánto se dispersan alrededor de ese centro. Para n rendimientos, la media es sum(x) / n; las desviaciones x - mean siempre suman cero, así que para medir la dispersión primero se elevan al cuadrado. La varianza muestral es la suma de las desviaciones al cuadrado dividida por n - 1, no n: la media se estimó con los mismos datos, lo que hace las desviaciones algo demasiado pequeñas, y dividir por n - 1 lo corrige.
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)Desviación típica y volatilidad
Elevar al cuadrado cambió las unidades: una varianza de rendimientos está en «porcentaje al cuadrado». Su raíz cuadrada, la desviación típica, vuelve a la unidad de los rendimientos, y en finanzas se llama volatilidad. Es la medida de riesgo más común. Un día típico de una gran empresa se mueve alrededor de un 1 a 2 %, es decir, una volatilidad de 0,01 a 0,02 diaria. Se lee respecto a la media: con una volatilidad del 1,2 % diario, un día de -3,6 % está a tres desviaciones típicas.
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.55Anualizar y el ratio de Sharpe
Las cifras diarias son pequeñas y poco expresivas, así que se dan por año. La media crece linealmente con el tiempo (252 días bursátiles al año: se multiplica por 252), pero la volatilidad crece con la raíz cuadrada del tiempo: se multiplica por sqrt(252), alrededor de 15,9. La razón es que los movimientos diarios aleatorios se compensan en parte, así que la incertidumbre se acumula más despacio que la media. El ratio de Sharpe divide el rendimiento medio por encima de la tasa libre de riesgo (el rendimiento excedente) entre la volatilidad: recompensa por unidad de riesgo, anualizada del mismo modo. Permite comparar una estrategia tranquila con una agitada.
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)std / sqrt(n), aquí 0,0012, mayor que la propia media (0,0011). Un gran ratio de Sharpe en pocas semanas dice poco; cuantas más observaciones, más se puede confiar en una media, y las cifras de riesgo son mucho más estables que los rendimientos medios.- Media:
x.mean(); varianza muestral:((x - mean) ** 2).sum() / (n - 1); la volatilidad es su raíz cuadrada. - Anualiza la media con
* periodsy la volatilidad con* sqrt(periods): el riesgo crece con la raíz cuadrada del tiempo. - Sharpe = rendimiento excedente medio / su desviación típica *
sqrt(periods): recompensa por unidad de riesgo; una muestra corta la hace poco fiable.
A continuación: la asimetría y la curtosis, los dos estadísticos que describen la forma de la distribución más allá de su centro y su dispersión.
Lab: qué se califica
- Medir la dispersión de los rendimientos con
sample_variance25 pts - Expresar la dispersión en las unidades de los rendimientos con
sample_std25 pts - Anualizar la media y la volatilidad con
annualized_stats25 pts - Valorar el rendimiento por unidad de riesgo con
sharpe_ratio25 pts