1. Preparação
O encontro abre medindo o preparo, com uma pergunta de Peer Instruction sobre o conteúdo desta seção. As três partes estão abaixo, e a trilha mínima diz por onde começar quando o tempo da semana não alcança todas.
Trilha mínima
| Prioridade | Item | Tempo | Para que serve no encontro |
|---|---|---|---|
| Indispensável | Autoestudo: Cotações do Yahoo Finance no Colab, do jeito reaproveitável | 35 min | base do Peer Instruction de abertura, sobre o end do yf.download, e da prática do coletor |
| Indispensável | Animações 1 e 2 desta seção | sem duração declarada | previsão da MGLU3 no Bloco 2 e mapa de ausências do Bloco 5 |
| Indispensável | Autoverificação de cinco perguntas, sem nota | sem duração declarada | mostra ao aluno o que rever antes do encontro |
| Recomendado | Autoestudo: Coleta de dados financeiros e DataFrames com Pandas | 70 min | índice de datas, seleção de colunas e valores ausentes, usados na prática de ausências |
| Aprofundamento | Leitura complementar: seções 4 e 5 de dados/README.md | sem duração declarada | depois do encontro, com o desafio do notebook |
A trilha indispensável soma 35 min de autoestudo, mais as duas animações e a autoverificação; com o autoestudo recomendado, a soma de autoestudo chega a 105 min. Os tempos dos autoestudos são os da Adalove, fixos. As animações e a autoverificação não têm duração declarada; pelo contrato de vídeo do acervo, cada animação tem até 60 segundos. Nesta semana não há Atividade Ponderada. O A1 é a entrega avaliada da Sprint 1 e fica fora do preparo.
Autoestudos da semana
- Coleta de dados financeiros e DataFrames com Pandas (70 min)
- Cotações do Yahoo Finance no Colab, do jeito reaproveitável (35 min)
Os dois estão na Adalove. O primeiro cobre a leitura de cotações para um DataFrame do
pandas, com índice de datas, seleção de colunas e tratamento de valores ausentes; o segundo
mostra a chamada do yfinance no Colab, com os parâmetros de ticker e de datas
que o coletor da aula transforma em função.
Animação 1: as três visões de preço da MGLU3
O que observar: as três linhas são o mesmo ativo, de 2019 a 2026, em escala logarítmica. Repare em qual linha salta em cada data rotulada e qual segue contínua, e na distância entre as duas linhas de baixo, que não muda de forma nos eventos.
Animação 2: o mapa de ausências da cesta
O que observar: cada linha é um ativo e cada coluna, um pregão. Verde tem cotação, coral não tem. Repare no bloco coral do começo da GOLD11, na linha tracejada perto do fim e em quantos pregões sobram quando toda data com alguma ausência é descartada.
Autoverificação, sem nota
- No
yf.download, a data passada emendentra no resultado? Como um coletor garante o último pregão pedido?Resposta comentada
Não entra: o
endé exclusivo. O coletor da aula soma um dia à data final antes de chamar a biblioteca. Quando a data final é um pregão, esquecer esse detalhe perde exatamente o último dia da janela, sem nenhuma mensagem de erro. - Na animação 1, o que acontece com o Close da MGLU3 em 06/08/2019, data do
desdobramento de 8 para 1?
Resposta comentada
Nada visível: o Close do Yahoo já vem dividido pelos fatores de desdobramento, grupamento e bonificação. Quem salta é o preço negociado na data, que cai -86,74% de um pregão para o outro. Nenhum dos 15 eventos da cesta faz o Close variar mais de 7% no dia.
- Qual coluna mede quanto rendeu quem reinvestiu todos os proventos, e o que o coletor
precisa pedir ao
yfinancepara recebê-la?Resposta comentada
O Adj Close. O coletor chama
yf.downloadcomauto_adjust=False, que devolve o Close e o Adj Close lado a lado; comauto_adjust=True, a biblioteca substitui o Close pelo preço ajustado e não entrega as duas visões separadas. - Na animação 2, quantos pregões a GOLD11 passa sem cotação antes de estrear, e em que
data BOVA11, IVVB11 e GOLD11 ficam sem cotação juntas?
Resposta comentada
484 pregões, até a primeira cotação em 11/12/2020. As três ETFs ficam sem cotação em 24/10/2025, pregão normal da B3. Somando as duas coisas, a GOLD11 tem 485 ausências na janela.
- Num DataFrame com os 15 ativos nas colunas, o que
df.dropna()remove?Resposta comentada
Toda linha (pregão) com ao menos uma célula vazia, em qualquer ativo. Na cesta da aula, sobram 1.423 dos 1.908 pregões, e a série começa em 11/12/2020, junto com a GOLD11. Os outros 14 ativos perdem março de 2020 sem ter nenhuma ausência própria naquele mês.
2. Três visões do mesmo preço
O Yahoo Finance entrega duas colunas de fechamento, e a aula reconstrói uma terceira. As três descrevem o mesmo pregão e respondem a perguntas de negócio diferentes.
| Visão | Como é obtida | Pergunta que responde |
|---|---|---|
| Negociado | Close multiplicado pelos fatores dos eventos posteriores à data | que preço apareceu na tela do pregão naquele dia |
| Close | fechamento dividido pelos fatores de desdobramento, grupamento e bonificação | quanto rendeu quem comprou e segurou, sem reinvestir proventos |
| Adj Close | Close com os proventos posteriores também descontados | quanto rendeu quem reinvestiu cada provento; base do risco e do retorno do otimizador |
Como o preço negociado é reconstruído
serie = fechamento[ticker].dropna()
fator = np.ones(len(serie))
for data, f in zip(eventos["data"], eventos["fator"]):
fator = fator * np.where(serie.index < data, f, 1.0)
negociado = serie * fator
O fator de eventos_desdobramento.csv é o número de ações novas
por ação antiga: 8 num desdobramento de 8 para 1, 0,1 num grupamento de 10 para 1. Toda data
anterior ao evento é multiplicada por ele, o que desfaz a divisão que o Yahoo aplicou.
Depois do último evento do ativo, as duas séries coincidem.
Os saltos que só o negociado mostra
| Ativo | Data | Evento | Negociado no dia |
|---|---|---|---|
| MGLU3 | 06/08/2019 | desdobramento de 8 para 1 | -86,74% |
| MGLU3 | 14/10/2020 | desdobramento de 4 para 1 | -75,31% |
| MGLU3 | 27/05/2024 | grupamento de 10 para 1 | 896,21% |
| B3SA3 | 17/05/2021 | desdobramento de 3 para 1 | -67,17% |
| WEGE3 | 28/04/2021 | desdobramento de 2 para 1 | -50,69% |
| BBAS3 | 16/04/2024 | desdobramento de 2 para 1 | -50,57% |
| EGIE3 | 27/11/2025 | bonificação de 40% em ações | -28,51% |
No dia do desdobramento da B3SA3, o Close variou -1,51%, o movimento real do mercado. Na MGLU3, o preço negociado vai de R$ 1,32 em 24/05/2024 para R$ 13,15 em 27/05/2024: a empresa valia o mesmo nos dois pregões, dividida em dez vezes menos ações.
Um cálculo de retorno sobre o preço negociado tomaria esses saltos como movimentos de mercado e inflaria a volatilidade de qualquer ativo com evento corporativo. O negociado serve para conferir o preço da tela e o valor de mercado daquele dia; para risco e retorno, a aula usa o Adj Close.
3. Proventos: retorno de preço e retorno total
A distância entre o Close e o Adj Close são os dividendos e juros sobre capital próprio pagos depois de cada data. Quanto mais o ativo distribui, mais o Adj Close antigo fica abaixo do Close.
| Ativo | Adj Close sobre Close em 02/01/2019 | Retorno de preço (Close) | Retorno total (Adj Close) |
|---|---|---|---|
| PETR4 | 26,13% | 87,12% | 616,00% |
| VALE3 | 52,57% | 52,38% | 189,86% |
| ITUB4 | 63,27% | 21,02% | 91,20% |
| BBAS3 | 59,77% | -14,65% | 42,09% |
| BOVA11 | 100,00% | 98,84% | 98,84% |
| IVVB11 | 100,00% | 347,03% | 347,03% |
Janela de 02/01/2019 a 31/08/2026. Na PETR4, o Adj Close de 2019 vale 26,13% do Close: os proventos pagos até 2026 descontam quase três quartos do preço antigo, e o retorno total chega a 616,00%, contra 87,12% só pelo preço. A BBAS3 perdeu 14,65% no preço e ainda assim rendeu 42,09% a quem reinvestiu. BOVA11 e IVVB11 não registram provento no período, e as duas colunas coincidem.
O notebook calcula a razão para qualquer ativo com
ajustado.iloc[0] / fechamento.iloc[0].
4. Um coletor que outra pessoa consegue rodar
O critério de reprodutibilidade do A1 pede um notebook que roda do zero, sem editar
código. A função coletar da seção 2 do notebook cumpre isso com três
decisões.
| Decisão | O que resolve |
|---|---|
| tickers, início e fim como argumentos | a mesma função serve a cesta e a janela de qualquer grupo |
queda para o snapshot de dados/ | sem rede, sem yfinance instalado ou com o provedor fora do ar, o notebook termina com os dados versionados e imprime a origem |
variável M08_OFFLINE=1 | força a leitura do snapshot mesmo com rede, que é como o notebook roda no CI e no desafio da máquina limpa |
A origem impressa (yfinance, ao vivo ou snapshot de dados/)
entra no relatório do A1. Sem ela, quem lê o resultado não sabe se o número veio da coleta
do dia ou do snapshot de 17/09/2026.
Quando a coleta ao vivo falha, o coletor escreve
coleta ao vivo falhou, seguindo com o snapshot: seguido do nome da exceção. A
mensagem diz qual caminho foi seguido e por quê: uma ModuleNotFoundError indica
ambiente sem a biblioteca, e um erro de conexão indica rede ou provedor. Engolir a exceção
sem imprimir nada deixaria o grupo achando que coletou ao vivo.
5. O end exclusivo do yfinance
A pergunta de abertura do encontro pede o número de linhas de
yf.download("PETR4.SA", start="2026-08-01", end="2026-08-31"). Cada alternativa
errada corresponde a uma conta que parece razoável.
| Alternativa | Conta que a produz |
|---|---|
| 31 | dias corridos de agosto |
| 30 | dias corridos até a véspera do end |
| 21 | pregões de agosto, tratando o end como inclusivo |
| 20, a certa | pregões de 03/08 a 28/08/2026: o end exclusivo deixa de fora 31/08, uma segunda-feira com pregão |
O DataFrame do yfinance tem uma linha por pregão, sem fim de semana nem
feriado, e o intervalo segue a convenção do Python de excluir o limite final. O erro é
silencioso: a chamada termina sem aviso, e o último pregão da janela simplesmente não está
lá. Por isso o coletor soma um dia ao fim pedido:
fim_exclusivo = (pd.Timestamp(fim) + pd.Timedelta(days=1)).strftime("%Y-%m-%d")
Um caso de teste no SPEC.md que confere a última data devolvida pega esse erro na primeira execução.
6. Ausências reais do provedor
O snapshot tem 487 células vazias de preço, todas reais, nenhuma de leitura:
- GOLD11: 485 pregões sem cotação. Os 484 primeiros são anteriores à primeira cotação do fundo, em 11/12/2020, e o último é 24/10/2025.
- BOVA11 e IVVB11: um pregão cada, 24/10/2025, o mesmo da GOLD11.
24/10/2025 foi um pregão normal da B3, e os outros 12 ativos têm cotação nesse dia. A ausência é do provedor. Nenhum dado existe para preencher os 484 pregões da GOLD11 antes da estreia, e qualquer tratamento que invente preço ali cria um histórico que o fundo nunca teve.
vazios = fechamento.isna().sum()
print(vazios[vazios > 0])
print(fechamento["GOLD11"].first_valid_index())
7. Descartar ou preencher
Os dois tratamentos mais comuns mudam o risco que o otimizador vai ver, cada um por um motivo.
| Critério | Descartar (dropna na cesta) | Preencher (ffill) |
|---|---|---|
| Pregões mantidos | 1.423 dos 1.908 | 1.908 |
| Início da série da cesta | 11/12/2020 | 02/01/2019, com a GOLD11 vazia até a estreia |
| Março de 2020 | sai de todos os ativos | permanece |
| Efeito em 24/10/2025 | pregão removido | retorno zero no dia e variação acumulada no pregão seguinte |
Volatilidade anual sob cada tratamento
| Ativo | Descartar | Preencher |
|---|---|---|
| PETR4 | 33,41% | 39,25% |
| VALE3 | 29,77% | 35,49% |
| MGLU3 | 67,75% | 65,41% |
| BOVA11 | 18,51% | 23,41% |
| IVVB11 | 17,67% | 20,15% |
| GOLD11 | 19,80% | 19,80% |
Descartar tira da amostra o choque de 2020 e derruba a volatilidade da PETR4 de 39,25%
para 33,41%. A MGLU3 vai no sentido contrário, de 65,41% para 67,75%, porque os pregões de
2019 e 2020 que saem eram, para ela, menos dispersos que os seguintes. A GOLD11 não muda: a
série dela começa na mesma data em que o dropna começa a cesta.
Preencher copia o último preço para 24/10/2025. O retorno desse dia fica em zero, e o pregão seguinte, 27/10/2025, acumula a variação dos dois dias: 0,93% no BOVA11, 1,72% no IVVB11 e -3,37% na GOLD11. São três pregões em 1.908, e o efeito na volatilidade é pequeno; o que pesa na comparação acima é a janela.
Um terceiro caminho, dropna por ativo, mantém cada série no próprio
período. Ele funciona para métricas de um ativo e cria um problema quando a análise junta
ativos, como a matriz de covariância da Sprint 3: cada par passa a ser medido numa janela
diferente. As Aulas 02 a 06 preenchem a lacuna isolada, não inventam preço antes da
estreia e declaram a janela comum quando juntam ativos.
8. O primeiro ADR
O ADR (Architecture Decision Record) registra uma decisão, o contexto que a motivou e a consequência medida. No A1 ele é a parte individual da nota, 20% de cada artefato, avaliada pela autoria dos commits. O modelo do curso segue o formato MADR, com estas seções mínimas:
- Contexto e problema: o que os dados mostraram (as ausências medidas no coletor do grupo).
- Decisão: o tratamento escolhido, em uma frase.
- Consequências: o impacto numérico, com o número antes e depois, e o efeito colateral aceito.
O exemplo do deck decide preencher, citando a volatilidade anual da PETR4 de 39,25% contra 33,41% descartando. É um exemplo: o grupo decide o próprio tratamento com os números medidos na cesta dele, e um ADR que decide descartar é igualmente válido quando cita o que a decisão custa. O que reprova um ADR é a ausência do número.
9. Depois do encontro
Desafio do notebook
A seção 6 do notebook tem três partes, nesta ordem:
- Rodar o coletor num Colab novo, sem nenhum arquivo do grupo, com
M08_OFFLINE=1, e conferir que o resultado bate com o da aula: 1.908 pregões, de 02/01/2019 a 31/08/2026. - Rodar o mesmo coletor com a cesta e a janela do grupo e anotar a origem impressa, o número de pregões e as ausências por ativo.
- Registrar no SPEC.md os casos de teste das duas rodadas, com entrada, resultado esperado e origem do número, e acrescentar as verificações na célula final.
Avanço do A1
- SPEC.md com as interfaces do coletor e o plano de testes, escrito antes de codar.
- Relatório descritivo por ativo: média, desvio, mínimo e máximo.
- ADR de tratamento de ausências, assinado por cada aluno, com o número medido.
O A1 vale 3 pontos. A review da Sprint 1 e a entrega do A1 caem no mesmo dia, sexta, 23/10/2026, com entrega até 23h59. Na Aula 02, os retornos saem do Adj Close já tratado pelo coletor.
Leitura complementar
As seções 4 e 5 de dados/README.md, com as três visões de preço e as falhas
do provedor medidas no snapshot. As demais fontes estão na
página de referências.