σμ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 2 · NumPy et pandas pour les données de marché›Sujet 2.20·~35 minIntermédiaire

Histogrammes et distributions

Position dans le parcoursModule 2 sur 11 · Sujet 20 sur 20
2.20 Histogrammes et distributions
—Score du lab— / 100XP total—Série—

Compter par intervalle

La moyenne et l'écart type compressent mille rendements en deux nombres. Un histogramme garde la forme : il découpe l'étendue des valeurs en classes et compte combien d'observations tombent dans chacune. De grandes barres au centre et de petites aux extrémités donnent la cloche familière ; une forme déséquilibrée ou aux extrémités lourdes est un avertissement. np.histogram(values, bins=edges) renvoie les effectifs et travaille sur un tableau entier. La classe i prend les valeurs de edges[i] inclus jusqu'à edges[i + 1] exclu ; seule la dernière classe inclut aussi son bord droit.

import numpy as np

returns = np.array([-0.021, -0.012, -0.008, -0.004, -0.002, 0.000, 0.001, 0.003, 0.004, 0.006, 0.009, 0.015, 0.032])
edges = np.array([-0.03, -0.01, 0.0, 0.01, 0.03])      # four bins: -3%..-1%, -1%..0%, 0%..1%, 1%..3%

counts, _ = np.histogram(returns, bins=edges)
print(counts.tolist(), counts.sum(), len(returns))      # [2, 3, 6, 1] 12 13   the 3.2% return is outside every bin

# bins=4 asks numpy for 4 equal-width bins between the minimum and the maximum
counts, edges4 = np.histogram(returns, bins=4)
print(counts.tolist(), edges4.round(4).tolist())        # [3, 6, 3, 1] [-0.021, -0.0078, 0.0055, 0.0188, 0.032]

Fréquence ou densité

Les effectifs dépendent du nombre d'observations et de la largeur des classes : deux histogrammes de tailles d'échantillon différentes ne se comparent pas. Une densité corrige cela : divisez chaque effectif par le total compté et par la largeur de classe, de sorte que l'aire des barres vaille 1. On peut alors comparer une densité à une courbe théorique, comme la cloche normale, ou à un autre échantillon. np.histogram(values, bins=edges, density=True) le fait, tout comme counts / (counts.sum() * np.diff(edges)).

counts, _ = np.histogram(returns, bins=edges)
density = counts / (counts.sum() * np.diff(edges))
print(density.round(2).tolist())              # [8.33, 25.0, 50.0, 4.17]
print((density * np.diff(edges)).sum())        # 1.0   the areas add up to 1

Le dessiner, et lire les queues

ax.hist(values, bins=10) compte et dessine en un appel : une barre par classe (ax.patches), dont les hauteurs sont les effectifs. Nommez toujours les axes, car un histogramme de rendements ne veut rien dire sans « Rendement quotidien » dessous. C'est la forme qui compte, et ce sont les queues qui font mal : compter la part des observations situées à plus de k écarts types de la moyenne, np.mean(np.abs(x - mean) > k * std), dit à quelle fréquence les extrêmes surviennent. Pour une loi normale, environ 4,6 % des valeurs sont au-delà de 2 écarts types et 0,27 % au-delà de 3. Les marchés font pire, comme le montreront les prochains sujets.

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.hist(returns, bins=5)
ax.set_xlabel("Daily return")
ax.set_ylabel("Frequency")
print(len(ax.patches), [round(p.get_height()) for p in ax.patches])   # 5 [2, 4, 5, 1, 1]   one bar per bin; the heights are the counts

# How often are the returns more than 1 standard deviation from the mean?
mean, std = returns.mean(), returns.std(ddof=1)
print(round(float(np.mean(np.abs(returns - mean) > 1 * std)), 3))     # 0.308   about 4 of 13 days
# The number of bins changes the picture: compare a few
for bins in (2, 4, 8):
    print(bins, np.histogram(returns, bins=bins)[0].tolist())
# 2 [9, 4]
# 4 [3, 6, 3, 1]
# 8 [1, 2, 2, 4, 2, 1, 0, 1]
Les classes changent l'imageTrop peu de classes cachent la forme, trop de classes font du bruit. Il n'y a pas de bon nombre unique ; essayez-en plusieurs et comparez les histogrammes avec les mêmes bornes. Rappelez-vous aussi qu'un histogramme est un échantillon : le prochain sera un peu différent, jugez donc la forme générale, pas les barres isolées.
  • np.histogram(values, bins=edges) compte les valeurs de chaque classe ; la dernière classe inclut son bord droit.
  • Une densité divise par le total compté et la largeur de classe : les aires valent 1 et les échantillons deviennent comparables.
  • ax.hist(values, bins=n) le dessine ; np.mean(np.abs(x - mean) > k * std) mesure les queues. Nommez les axes et comparez avec les mêmes bornes.

À suivre : moyenne et variance des rendements, les deux nombres qui résument une distribution, calculés à partir de leurs définitions.

Lab : ce qui est noté

  • Compter les rendements de chaque classe avec bin_counts25 pts
  • Transformer les effectifs en densité avec density25 pts
  • Mesurer les queues avec fraction_beyond25 pts
  • Dessiner l'histogramme avec plot_histogram25 pts
Explorateur · lab-53-1
▾ lab-53-1
…
bash · dans le navigateur
learner@quantcraft:~/lab-53-1$
Python pas encore chargéPythonLn 1, Col 1Spaces: 4UTF-8

Réinitialiser ce sujet ?

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