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

Courbes avec matplotlib

Position dans le parcoursModule 2 sur 11 · Sujet 18 sur 20
2.18 Courbes avec matplotlib
—Score du lab— / 100XP total—Série—

Une figure, un Axes, une ligne

Un graphique est le moyen le plus rapide de voir qu'une série de prix est propre, tendancielle ou cassée. Dans matplotlib, une Figure est tout le canevas et un Axes est un graphique sur celui-ci, avec ses lignes, ses étiquettes et sa légende. La méthode orientée objet est fig, ax = plt.subplots() suivi d'appels sur ax : ax.plot(x, y) trace une ligne, ax.set_title, ax.set_xlabel et ax.set_ylabel nomment le graphique. Dessiner sur un Axes explicite, et le renvoyer, rend une fonction de tracé facile à réutiliser et à tester.

import matplotlib
matplotlib.use("Agg")            # draw without a window (no screen needed)
import matplotlib.pyplot as plt
import pandas as pd

prices = pd.Series([100.0, 102, 101, 105, 107, 106, 110], index=pd.bdate_range("2026-03-02", periods=7))

fig, ax = plt.subplots()
ax.plot(prices.index, prices.values, label="AAPL")
ax.set_title("Closing price")
ax.set_xlabel("Date")
ax.set_ylabel("Price (USD)")

print(ax.get_title(), "|", ax.get_xlabel(), "|", ax.get_ylabel())   # Closing price | Date | Price (USD)
print(len(ax.lines), ax.lines[0].get_ydata().tolist())               # 1 [100.0, 102.0, 101.0, 105.0, 107.0, 106.0, 110.0]

Étiquettes et légende

Avec plusieurs lignes sur un graphique, chacune a besoin d'un nom. Passez label="..." à ax.plot et appelez ax.legend() une fois à la fin : la légende liste les étiquettes dans l'ordre où les lignes ont été tracées. Un graphique sans étiquettes, sans titre et sans unités est une image, pas un résultat. Les lignes ont aussi un style : linestyle="--" donne un trait en pointillés, pratique pour une moyenne qui ne doit pas masquer les prix, et color, linewidth et marker le précisent davantage.

ma = prices.rolling(3).mean()
ax.plot(ma.index, ma.values, label="MA3", linestyle="--")
ax.legend()

print([line.get_label() for line in ax.lines])                  # ['AAPL', 'MA3']
print([text.get_text() for text in ax.get_legend().get_texts()])   # ['AAPL', 'MA3']
print(ax.lines[1].get_linestyle(), ax.lines[1].get_ydata().tolist()[:3])   # -- [nan, nan, 101.0]   NaN points are simply not drawn

Lignes de référence, et graphiques invisibles

Une ligne horizontale marque un niveau comme un strike, un stop ou la moyenne : ax.axhline(105, linestyle="--") la trace sur tout le graphique (axvline fait de même à la verticale). Matplotlib peut aussi dessiner sans aucune fenêtre : avec le backend Agg, fig.savefig("chart.png") écrit le graphique dans un fichier, ce qui est la façon dont rapports et serveurs produisent des graphiques. Comme tout ce que vous dessinez reste sur l'objet Axes, un programme (ou un test) peut le relire : les lignes avec ax.lines, leurs données avec get_ydata(), les étiquettes avec get_label(), le titre avec get_title().

ax.axhline(105, linestyle=":", label="level")

level_line = ax.lines[-1]
print(list(level_line.get_ydata()), level_line.get_linestyle(), level_line.get_label())   # [105, 105] : level

fig.savefig("prices.png")   # writes the chart to a file; no window, no plt.show() needed
plt.close(fig)              # release the figure when you are done with it
def plot_prices(prices):
    fig, ax = plt.subplots()
    ax.plot(prices.index, prices.values)
    ax.set_title("Closing price")
    return ax                                   # the caller can add lines, save the chart or inspect it

ax = plot_prices(prices)
print(len(ax.lines), ax.get_title())            # 1 Closing price
plt.close("all")
Fermez les figures que vous créezChaque plt.subplots() garde sa figure en mémoire jusqu'à plt.close(fig). Dans une boucle qui dessine des centaines de graphiques, ou dans un serveur, l'oublier fait fuir la mémoire et finit par déclencher un avertissement. Créez la Figure dans la fonction, renvoyez ce dont l'appelant a besoin et laissez l'appelant la fermer.
  • fig, ax = plt.subplots() puis ax.plot(x, y) ; nommez le graphique avec set_title, set_xlabel et set_ylabel.
  • Donnez un label= à chaque ligne et appelez ax.legend() ; linestyle="--" trace des pointillés ; ax.axhline(y) une ligne horizontale.
  • Dessinez sur un Axes et renvoyez-le : ax.lines, get_ydata() et get_label() relisent le graphique ; utilisez savefig et plt.close plutôt que show dans les programmes.

À suivre : les graphiques en chandeliers, pour dessiner l'ouverture, le plus haut, le plus bas et la clôture de chaque jour.

Lab : ce qui est noté

  • Tracer la courbe des prix avec plot_prices25 pts
  • Comparer deux séries sur un graphique avec plot_comparison25 pts
  • Ajouter une moyenne mobile en pointillés avec plot_with_average25 pts
  • Marquer un niveau de prix avec plot_with_level25 pts
Explorateur · lab-51-1
▾ lab-51-1
…
bash · dans le navigateur
learner@quantcraft:~/lab-51-1$
Python pas encore chargéPythonLn 1, Col 1Spaces: 4UTF-8

Réinitialiser ce sujet ?

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