σμ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.2·~40 minIntermédiaire

Asymétrie et aplatissement

Position dans le parcoursModule 3 sur 11 · Sujet 2 sur 12
3.2 Asymétrie et aplatissement
—Score du lab— / 100XP total—Série—

Au-delà de la moyenne et de la variance

Deux séries de rendements peuvent avoir la même moyenne et la même volatilité tout en étant très différentes à détenir. L'une monte lentement et chute de temps en temps de 6 % en une journée ; l'autre est symétrique et calme. La moyenne et la variance sont les deux premiers moments d'une distribution. Le moment centré d'ordre k est la moyenne de (x - mean) ** k. Les moments 3 et 4 décrivent la forme : l'asymétrie dit quelle queue est la plus longue, l'aplatissement (kurtosis) à quel point les queues sont épaisses.

m_k = mean((x - mean)^k) skewness = m3 / m2^1.5 excess kurtosis = m4 / m2^2 - 3
import numpy as np

def central_moment(x, k):
    return float(np.mean((x - x.mean()) ** k))

# Calm days of about +1%, and one crash of -6%
returns = np.array([0.010, 0.012, 0.008, 0.011, 0.009, 0.010, 0.012, -0.060, 0.010, 0.009])

print(round(central_moment(returns, 2), 8))     # 0.00044389   the variance with ddof=0
print(round(central_moment(returns, 3), 10))    # -2.47823e-05   odd powers keep the sign: the crash dominates
print(round(central_moment(returns, 4), 12))    # 1.587946e-06   even powers are always positive

Asymétrie : quelle queue est la plus longue

Élever au cube conserve le signe de chaque écart et fait peser beaucoup plus les grands, si bien que le troisième moment est dominé par les valeurs les plus extrêmes. Diviser par m2 ** 1.5 supprime les unités et donne l'asymétrie : 0 pour une distribution symétrique, négative quand la longue queue est à gauche (rares grosses pertes), positive quand elle est à droite (rares gros gains). Les indices actions ont en général une asymétrie négative : hausses lentes, baisses soudaines. L'asymétrie d'un échantillon de 100 000 valeurs normales est d'environ 0.

m2 = central_moment(returns, 2)
m3 = central_moment(returns, 3)
print(round(m3 / m2 ** 1.5, 3))     # -2.65   strongly negative: one big loss among calm gains

mirror = -returns                    # flip every return: the long tail moves to the right
print(round(central_moment(mirror, 3) / central_moment(mirror, 2) ** 1.5, 3))   # 2.65

Aplatissement : l'épaisseur des queues

La puissance quatre fait peser énormément les valeurs extrêmes, donc m4 / m2 ** 2 croît avec les queues. Pour une loi normale il vaut 3, c'est pourquoi on cite l'aplatissement en excès, m4 / m2 ** 2 - 3 : il vaut 0 pour une loi normale, il est positif pour des queues épaisses (les journées extrêmes surviennent plus souvent que ne le prévoit la cloche) et négatif pour des queues fines (le plus fin possible, deux pics égaux, donne -2). Les rendements quotidiens de la plupart des actifs ont un excès d'aplatissement nettement positif, souvent 5 ou plus. Les deux statistiques ne changent pas quand on met les rendements à l'échelle ou qu'on les décale : elles ne décrivent que la forme.

m4 = central_moment(returns, 4)
print(round(m4 / m2 ** 2 - 3, 3))   # 5.059   fat tails: one crash dominates the fourth moment

calm = np.array([-0.02, -0.01, -0.005, 0.0, 0.005, 0.01, 0.02, -0.015, 0.015, 0.0])
c2, c3, c4 = (central_moment(calm, k) for k in (2, 3, 4))
print(round(c3 / c2 ** 1.5, 3), round(c4 / c2 ** 2 - 3, 3))   # 0.0 -1.033   symmetric, slightly thin tails
# Shape does not depend on scale or shift: multiply the returns by 3 and add 1
rescaled = returns * 3 + 1
print(round(central_moment(rescaled, 3) / central_moment(rescaled, 2) ** 1.5, 3))   # -2.65
print(round(central_moment(rescaled, 4) / central_moment(rescaled, 2) ** 2 - 3, 3))  # 5.059   the same two numbers
Un seul krach peut tout changerL'asymétrie et l'aplatissement sont gouvernés par les quelques valeurs les plus extrêmes ; ils sont donc bien moins stables que la moyenne ou la volatilité : ajoutez ou retirez un jour et ils sautent. Calculez-les sur assez de données (au moins des centaines de jours) et regardez aussi l'histogramme avant de vous fier à un chiffre.
  • Le moment centré d'ordre k est mean((x - mean) ** k) : les moments 2, 3 et 4 donnent variance, asymétrie et aplatissement.
  • Asymétrie m3 / m2 ** 1.5 : négative = longue queue à gauche (rares grosses pertes) ; aplatissement en excès m4 / m2 ** 2 - 3 vaut 0 pour une normale.
  • Un aplatissement en excès positif signifie des queues épaisses ; les deux statistiques dépendent de quelques jours extrêmes, il leur faut beaucoup de données.

À suivre : les queues épaisses et les tests de normalité, pour vérifier formellement si les rendements suivent la courbe en cloche.

Lab : ce qui est noté

  • Calculer la brique de base avec central_moment25 pts
  • Mesurer quelle queue est la plus longue avec skewness25 pts
  • Mesurer l'épaisseur des queues avec excess_kurtosis25 pts
  • Nommer la forme avec shape_label25 pts
Explorateur · lab-55-1
▾ lab-55-1
…
bash · dans le navigateur
learner@quantcraft:~/lab-55-1$
Python pas encore chargéPythonLn 1, Col 1Spaces: 4UTF-8

Réinitialiser ce sujet ?

Tout le contenu de lab-55-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