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 anyoneAjustar 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.003close 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