σμ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 AcademyRoteiros
Ctrl K
AO
+1,2 mil alunos
EntrarParticipar ↗
Roteiros
AO
+1,2 mil alunos
Entrar
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Roteiro de Python›Módulo 2 · NumPy e pandas para dados de mercado›Tópico 2.18·~35 minIntermediário

Gráficos de linha com matplotlib

Posição no roteiroMódulo 2 de 11 · Tópico 18 de 20
2.18 Gráficos de linha com matplotlib
—Nota do lab— / 100XP total—Sequência—

Uma figura, um Axes, uma linha

Um gráfico é a forma mais rápida de ver que uma série de preços está limpa, em tendência ou quebrada. No matplotlib uma Figure é toda a tela e um Axes é um gráfico nela, com suas linhas, rótulos e legenda. O modo orientado a objetos é fig, ax = plt.subplots() seguido de chamadas em ax: ax.plot(x, y) desenha uma linha, ax.set_title, ax.set_xlabel e ax.set_ylabel dão nome ao gráfico. Desenhar em um Axes explícito e devolvê-lo torna uma função de desenho fácil de reutilizar e testar.

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]

Rótulos e legenda

Com várias linhas em um gráfico, cada uma precisa de um nome. Passe label="..." para ax.plot e chame ax.legend() uma vez no fim: a legenda lista os rótulos na ordem em que as linhas foram desenhadas. Um gráfico sem rótulos, título e unidades é uma imagem, não um resultado. As linhas também têm estilo: linestyle="--" dá uma linha tracejada, útil para uma média que não deve esconder os preços, e color, linewidth e marker refinam mais.

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

Linhas de referência e gráficos que você não vê

Uma linha horizontal marca um nível como um strike, um stop ou a média: ax.axhline(105, linestyle="--") a desenha por todo o gráfico (axvline faz o mesmo na vertical). O matplotlib também pode desenhar sem nenhuma janela: com o backend Agg, fig.savefig("chart.png") grava o gráfico em um arquivo, que é como relatórios e servidores produzem gráficos. Como tudo o que você desenha fica no objeto Axes, um programa (ou um teste) pode lê-lo de volta: as linhas com ax.lines, seus dados com get_ydata(), os rótulos com get_label(), o título com 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")
Feche as figuras que você criaCada plt.subplots() mantém sua figura na memória até você chamar plt.close(fig). Em um laço que desenha centenas de gráficos, ou em um servidor, esquecer isso vaza memória e acaba disparando um aviso. Crie a Figure dentro da função, devolva o que quem chama precisa e deixe que ele a feche.
  • fig, ax = plt.subplots() e depois ax.plot(x, y); dê nome ao gráfico com set_title, set_xlabel e set_ylabel.
  • Dê a cada linha um label= e chame ax.legend(); linestyle="--" desenha tracejado; ax.axhline(y) uma linha horizontal.
  • Desenhe em um Axes e devolva-o: ax.lines, get_ydata() e get_label() leem o gráfico; use savefig e plt.close em vez de show em programas.

A seguir: os gráficos de candlestick, para desenhar abertura, máxima, mínima e fechamento de cada dia.

Lab: o que é avaliado

  • Desenhar a linha de preços com plot_prices25 pts
  • Comparar duas séries em um gráfico com plot_comparison25 pts
  • Adicionar uma média móvel tracejada com plot_with_average25 pts
  • Marcar um nível de preço com plot_with_level25 pts
Explorador · lab-51-1
▾ lab-51-1
…
bash · no navegador
learner@quantcraft:~/lab-51-1$
Python ainda não carregadoPythonLn 1, Col 1Spaces: 4UTF-8

Redefinir este tópico?

Tudo em lab-51-1 volta aos arquivos iniciais e o terminal é limpo. Sua solução atual será perdida — isso não pode ser desfeito.

Será redefinido
  • main.py → código inicial
  • Histórico do terminal e saída dos testes
  • Alterações não enviadas
Será mantido
  • Melhor nota do lab
  • Seu XP e sua sequência
  • Progresso da aula e anotações

Entre para executar o seu código.

Todas as aulas são gratuitas para ler. Crie uma conta ou entre para executar código, rodar os testes e enviar este lab.

  • IDE no navegador com terminal bash — nada para instalar
  • Correção instantânea, XP e o seu lugar no roteiro
Criar uma contaEntrar
OU
Continuar com o GitHub