Deux nombres pour une distribution
Une colonne de rendements est difficile à comparer à une autre. Deux nombres en résument l'essentiel : la moyenne dit où les rendements sont centrés et la variance à quel point ils s'éparpillent autour de ce centre. Pour n rendements, la moyenne vaut sum(x) / n ; les écarts x - mean s'annulent toujours en somme, donc pour mesurer la dispersion on les élève au carré d'abord. La variance d'échantillon est la somme des écarts au carré divisée par n - 1, et non n : la moyenne a été estimée sur les mêmes données, ce qui rend les écarts un peu trop petits, et diviser par n - 1 corrige cela.
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)Écart type et volatilité
Élever au carré a changé les unités : une variance de rendements s'exprime en « pourcent au carré ». Sa racine carrée, l'écart type, revient dans l'unité des rendements, et en finance on l'appelle volatilité. C'est la mesure de risque la plus courante. Une journée typique pour une grande valeur bouge d'environ 1 à 2 %, soit une volatilité de 0,01 à 0,02 par jour. On la lit par rapport à la moyenne : avec une volatilité de 1,2 % par jour, une journée à -3,6 % se situe à trois écarts types.
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.55Annualiser, et le ratio de Sharpe
Les chiffres quotidiens sont petits et peu parlants, on les exprime donc par an. La moyenne croît linéairement avec le temps (252 jours de bourse par an : on multiplie par 252), mais la volatilité croît avec la racine carrée du temps : on multiplie par sqrt(252), soit environ 15,9. La raison est que les mouvements quotidiens aléatoires s'annulent en partie, si bien que l'incertitude s'accumule plus lentement que la moyenne. Le ratio de Sharpe divise le rendement moyen au-dessus du taux sans risque (le rendement excédentaire) par la volatilité : la récompense par unité de risque, annualisée de la même façon. Il permet de comparer une stratégie calme à une stratégie agitée.
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), ici 0,0012, plus que la moyenne elle-même (0,0011). Un excellent ratio de Sharpe sur quelques semaines dit peu de choses ; plus il y a d'observations, plus on peut se fier à une moyenne, et les chiffres de risque sont bien plus stables que les rendements moyens.- Moyenne :
x.mean(); variance d'échantillon :((x - mean) ** 2).sum() / (n - 1); la volatilité en est la racine carrée. - Annualisez la moyenne par
* periodset la volatilité par* sqrt(periods): le risque croît avec la racine carrée du temps. - Sharpe = rendement excédentaire moyen / son écart type *
sqrt(periods): récompense par unité de risque ; un échantillon court la rend peu fiable.
À suivre : l'asymétrie et l'aplatissement, les deux statistiques qui décrivent la forme de la distribution au-delà de son centre et de sa dispersion.
Lab : ce qui est noté
- Mesurer la dispersion des rendements avec
sample_variance25 pts - Exprimer la dispersion dans l'unité des rendements avec
sample_std25 pts - Annualiser la moyenne et la volatilité avec
annualized_stats25 pts - Évaluer le rendement par unité de risque avec
sharpe_ratio25 pts