σμ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.17·~45 minIntermediário

Eventos corporativos: desdobramentos e dividendos

Posição no roteiroMódulo 2 de 11 · Tópico 17 de 20
2.17 Eventos corporativos: desdobramentos e dividendos
—Nota do lab— / 100XP total—Sequência—

Um histórico de preços que mente

Quando uma empresa faz um desdobramento de 4 para 1, cada acionista recebe quatro ações por cada uma e o preço cai para um quarto. Ninguém perdeu nada, mas o histórico bruto mostra um dia de -75%. Um dividendo em dinheiro faz o mesmo em escala menor: na data ex-dividendo o preço cai aproximadamente o valor do dividendo. Uma estratégia que leia preços brutos verá quedas que não machucaram ninguém. A solução é ajustar o histórico: reescalar todos os dias anteriores ao evento para que a série seja contínua e comparável com os preços de hoje.

import pandas as pd

index = pd.bdate_range("2026-03-02", periods=6)
raw = pd.Series([480.0, 484.0, 488.0, 123.0, 124.5, 126.0], index=index, name="close")   # 4-for-1 split on 5 March

print(raw.pct_change().round(4).tolist())
# [nan, 0.0083, 0.0083, -0.748, 0.0122, 0.012]    the -74.8% day never happened to anyone

Ajustar um desdobramento

Só mudam os dias anteriores ao desdobramento: divida seus preços pela razão (4 para um desdobramento 4 para 1). Os preços atuais ficam como cotados, então a série ajustada termina no preço real de hoje. Construa uma máscara Verdadeiro/Falso com index >= split_date (uma string funciona contra um DatetimeIndex) e use where, que mantém o valor onde a máscara é Verdadeira e usa a substituição no resto. O volume vai no sentido oposto: após o desdobramento negociam-se quatro vezes mais ações, então os volumes anteriores são multiplicados pela razão. Um grupamento usa uma razão menor que 1 e as mesmas fórmulas.

split_date = "2026-03-05"
adjusted = raw.where(raw.index >= split_date, raw / 4)    # the days before the split, divided by 4

print(adjusted.tolist())                      # [120.0, 121.0, 122.0, 123.0, 124.5, 126.0]
print(adjusted.pct_change().round(4).tolist())   # [nan, 0.0083, 0.0083, 0.0082, 0.0122, 0.012]   no more crash
# Volume goes the other way: older days are multiplied
volume = pd.Series([1000, 1100, 900, 4200, 4000, 4300], index=index)
print(volume.where(volume.index >= split_date, volume * 4).tolist())   # [4000, 4400, 3600, 4200, 4000, 4300]

Ajustar um dividendo

Um dividendo é menor que um desdobramento, então o ajuste é um fator próximo de 1: 1 - dividendo / fechamento anterior, onde o fechamento anterior é o último fechamento antes da data ex-dividendo. Multiplique cada preço anterior à data ex por esse fator. O fechamento logo antes da data ex cai então exatamente o valor do dividendo, o movimento do dia ex mostra só o que o mercado realmente fez, e os retornos calculados na série ajustada incluem o dividendo. Esse fechamento ajustado é o que os cálculos de retorno devem usar. Coloque o fator em sua própria função pequena para poder testá-lo e reutilizá-lo.

def dividend_factor(prev_close, dividend):
    return 1 - dividend / prev_close


prices = pd.Series([100.0, 101.0, 102.0, 100.8, 101.5, 102.5], index=index)   # a 1.50 dividend, ex-date 5 March
ex_date, dividend = "2026-03-05", 1.5

prev_close = prices[prices.index < ex_date].iloc[-1]       # 102.0, the last close before the ex-date
factor = dividend_factor(prev_close, dividend)
print(round(factor, 6))                                    # 0.985294

adjusted = prices.where(prices.index >= ex_date, prices * factor)
print(adjusted.round(4).tolist())                          # [98.5294, 99.5147, 100.5, 100.8, 101.5, 102.5]
print(prices.pct_change().round(4).tolist()[3], adjusted.pct_change().round(4).tolist()[3])   # -0.0118 0.003
Ajustado para retornos, bruto para negociarPreços ajustados servem para medir retornos e comparar no tempo. Não são o que você paga: uma ordem é colocada ao preço bruto cotado naquele dia, e um preço ajustado antigo pode ser menor que o preço real em que a ação foi negociada. Mantenha as duas colunas (close e adj_close) e diga qual cada cálculo usa.
  • Um desdobramento divide os preços antigos pela razão e multiplica os volumes antigos por ela; só mudam os dias anteriores ao desdobramento.
  • Um dividendo multiplica os preços anteriores à data ex por 1 - dividendo / fechamento anterior.
  • Use where(index >= date, ajustado) com uma máscara, não um laço; calcule retornos com preços ajustados e negocie com os brutos.

A seguir: os gráficos de linhas com matplotlib, para desenhar a série de preços limpa que você agora tem.

Lab: o que é avaliado

  • Tornar os preços comparáveis através de um desdobramento com adjust_for_split25 pts
  • Ajustar os volumes antigos com adjust_volume_for_split25 pts
  • Calcular o fator de ajuste de um dividendo com dividend_factor25 pts
  • Remover a queda do dividendo do histórico com adjust_for_dividend25 pts
Explorador · lab-50-1
▾ lab-50-1
…
bash · no navegador
learner@quantcraft:~/lab-50-1$
Python ainda não carregadoPythonLn 1, Col 1Spaces: 4UTF-8

Redefinir este tópico?

Tudo em lab-50-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