Módulo 08 AdmTech · Aula 01 · 20/10/2026 · Semana 2 · Sprint 1

Material de apoio: Aquisição de Dados de Mercado

Primeira aula do módulo. O parceiro precisa decidir onde alocar excedentes de caixa, e a ferramenta de simulação de carteira eficiente que o módulo constrói depende de um histórico de preços confiável. Esta aula deixa pronto o coletor parametrizado por tickers e datas, com o preço ajustado escolhido e as ausências tratadas e documentadas. É a base do A1, Coletor e Processador de Dados de Mercado.

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

PrioridadeItemTempoPara que serve no encontro
IndispensávelAutoestudo: Cotações do Yahoo Finance no Colab, do jeito reaproveitável35 minbase do Peer Instruction de abertura, sobre o end do yf.download, e da prática do coletor
IndispensávelAnimações 1 e 2 desta seçãosem duração declaradaprevisão da MGLU3 no Bloco 2 e mapa de ausências do Bloco 5
IndispensávelAutoverificação de cinco perguntas, sem notasem duração declaradamostra ao aluno o que rever antes do encontro
RecomendadoAutoestudo: Coleta de dados financeiros e DataFrames com Pandas70 miníndice de datas, seleção de colunas e valores ausentes, usados na prática de ausências
AprofundamentoLeitura complementar: seções 4 e 5 de dados/README.mdsem duração declaradadepois 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

  1. Coleta de dados financeiros e DataFrames com Pandas (70 min)
  2. 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

  1. No yf.download, a data passada em end entra 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.

  2. 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.

  3. Qual coluna mede quanto rendeu quem reinvestiu todos os proventos, e o que o coletor precisa pedir ao yfinance para recebê-la?
    Resposta comentada

    O Adj Close. O coletor chama yf.download com auto_adjust=False, que devolve o Close e o Adj Close lado a lado; com auto_adjust=True, a biblioteca substitui o Close pelo preço ajustado e não entrega as duas visões separadas.

  4. 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.

  5. 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ãoComo é obtidaPergunta que responde
NegociadoClose multiplicado pelos fatores dos eventos posteriores à dataque preço apareceu na tela do pregão naquele dia
Closefechamento dividido pelos fatores de desdobramento, grupamento e bonificaçãoquanto rendeu quem comprou e segurou, sem reinvestir proventos
Adj CloseClose com os proventos posteriores também descontadosquanto 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

AtivoDataEventoNegociado no dia
MGLU306/08/2019desdobramento de 8 para 1-86,74%
MGLU314/10/2020desdobramento de 4 para 1-75,31%
MGLU327/05/2024grupamento de 10 para 1896,21%
B3SA317/05/2021desdobramento de 3 para 1-67,17%
WEGE328/04/2021desdobramento de 2 para 1-50,69%
BBAS316/04/2024desdobramento de 2 para 1-50,57%
EGIE327/11/2025bonificaçã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.

AtivoAdj Close sobre Close em 02/01/2019Retorno de preço (Close)Retorno total (Adj Close)
PETR426,13%87,12%616,00%
VALE352,57%52,38%189,86%
ITUB463,27%21,02%91,20%
BBAS359,77%-14,65%42,09%
BOVA11100,00%98,84%98,84%
IVVB11100,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ãoO que resolve
tickers, início e fim como argumentosa 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=1forç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.

AlternativaConta que a produz
31dias corridos de agosto
30dias corridos até a véspera do end
21pregões de agosto, tratando o end como inclusivo
20, a certapregõ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érioDescartar (dropna na cesta)Preencher (ffill)
Pregões mantidos1.423 dos 1.9081.908
Início da série da cesta11/12/202002/01/2019, com a GOLD11 vazia até a estreia
Março de 2020sai de todos os ativospermanece
Efeito em 24/10/2025pregão removidoretorno zero no dia e variação acumulada no pregão seguinte

Volatilidade anual sob cada tratamento

AtivoDescartarPreencher
PETR433,41%39,25%
VALE329,77%35,49%
MGLU367,75%65,41%
BOVA1118,51%23,41%
IVVB1117,67%20,15%
GOLD1119,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:

  1. Contexto e problema: o que os dados mostraram (as ausências medidas no coletor do grupo).
  2. Decisão: o tratamento escolhido, em uma frase.
  3. 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:

  1. 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.
  2. 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.
  3. 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.

Prof. José Romualdo · Módulo 08 AdmTech · Computação · 2026-2B-T19