σμ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 AcademyParcours
Ctrl K
AO
+1,2 k apprenants
ConnexionRejoindre ↗
Parcours
AO
+1,2 k apprenants
Connexion
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Parcours Python›Module 3 · Probabilités et simulation Monte-Carlo›Sujet 3.1·~40 minIntermédiaire

Moyenne et variance des rendements

Position dans le parcoursModule 3 sur 11 · Sujet 1 sur 12
3.1 Moyenne et variance des rendements
—Score du lab— / 100XP total—Série—

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.

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)

É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.55

Annualiser, 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)
Une statistique vient d'un échantillonLa moyenne de 8 jours est une estimation très bruitée : son erreur standard vaut environ 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 * periods et 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
Explorateur · lab-54-1
▾ lab-54-1
…
bash · dans le navigateur
learner@quantcraft:~/lab-54-1$
Python pas encore chargéPythonLn 1, Col 1Spaces: 4UTF-8

Réinitialiser ce sujet ?

Tout le contenu de lab-54-1 revient aux fichiers de départ et le terminal est vidé. Votre solution actuelle sera perdue : cette action est irréversible.

Sera réinitialisé
  • main.py → code de départ
  • Historique du terminal et sortie des tests
  • Modifications non soumises
Sera conservé
  • Meilleur score du lab
  • Votre XP et votre série
  • Progression du cours et notes

Connectez-vous pour exécuter votre code.

Tous les cours sont gratuits à lire. Créez un compte ou connectez-vous pour exécuter du code, lancer les tests et soumettre ce lab.

  • IDE dans le navigateur avec terminal bash — rien à installer
  • Correction instantanée, XP et votre place dans le parcours
Créer un compteSe connecter
OU
Continuer avec GitHub