Módulo 08 AdmTech · Aula 04 · 18/11/2026 · Semana 6 · Sprint 3

Material de apoio: Da Nuvem à Fronteira

A Aula 03 deixou pronta a matriz de covariância anualizada da cesta. Esta aula usa a matriz para duas coisas: sortear 10.000 carteiras e enxergar o espaço risco-retorno (o motor do A3), e resolver as carteiras de variância mínima e de máximo Sharpe com a fronteira eficiente de 50 pontos (a base do A4). A seção 1 é o preparo antes do encontro.

1. Preparação

O encontro abre com uma votação sobre o conteúdo desta seção. Faça as três partes antes da aula, nesta ordem; 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: Carteiras e simulação de Monte Carlo com Python65 mina forma vetorial, o Sharpe e o código do motor da prática do Bloco 3
IndispensávelAs três animações da seção 1.2sem duração declaradaa nuvem do Peer Instruction, o SLSQP do Bloco 5 e a fronteira do Bloco 6
IndispensávelAutoverificação de cinco perguntas, sem notasem duração declaradamostra ao aluno o que rever antes do encontro
RecomendadoAutoestudo: Da nuvem à fronteira eficiente de Markowitz70 minbase conceitual da otimização com restrições e da fronteira
AprofundamentoLeitura complementar: seção do autoestudo sobre a fronteira como borda da nuvem, relida com o gráfico do gruposem duração declaradadepois do encontro, com o gráfico do A3

A trilha indispensável soma 65 min de autoestudo, mais as três animações e a autoverificação; com o autoestudo recomendado, a soma de autoestudo chega a 135 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 A3 e o A4 são entregas avaliadas da sprint e ficam fora do preparo.

1.1 Autoestudos da semana, na Adalove

  1. Carteiras e simulação de Monte Carlo com Python (65 min): a álgebra da carteira em forma vetorial, o Índice de Sharpe e o código da simulação.
  2. Da nuvem à fronteira eficiente de Markowitz (70 min): a fronteira como a borda da nuvem, encontrada resolvendo um problema de mínimo com restrições.

1.2 Três animações do conceito central

A nuvem de Monte Carlo. Observe onde a melhor sorteada (o ponto coral) fica conforme o número de carteiras cresce de 10 para 10.000, e quantas ficam abaixo da linha do CDI.

A fronteira sobre a nuvem. Observe que a curva passa acima e à esquerda de todas as carteiras sorteadas, e onde ficam as duas carteiras ótimas em relação à melhor sorteada.

O SLSQP no triângulo de pesos. Com três ativos, cada carteira é um ponto do triângulo. Observe o primeiro passo do otimizador e quantas iterações ele leva até parar.

1.3 Autoverificação, sem nota

Responda antes de abrir a resposta comentada.

  1. O motor sorteia números entre 0 e 1 para cada ativo e divide cada linha pela soma da própria linha. O que essa divisão garante?
    Resposta comentada

    Que os pesos somam 1, ou seja, que o dinheiro todo está alocado, e que nenhum peso é negativo, porque o sorteio só produz números positivos. As duas condições são as mesmas que o SLSQP impõe como restrição e como limite na seção 5.

  2. A carteira de pesos iguais rende 8,34% ao ano, e o CDI da janela é 11,30%. O Índice de Sharpe dela é positivo ou negativo?
    Resposta comentada

    Negativo: -0,18. O numerador do Sharpe é o retorno menos o CDI, e uma carteira que rende menos do que o CDI tem prêmio negativo, qualquer que seja a volatilidade.

  3. Na animação da nuvem, quantas das 10.000 carteiras sorteadas ficaram abaixo do CDI?
    Resposta comentada

    8.851. Oito dos 15 ativos da cesta rendem abaixo do CDI na janela, e a MGLU3 tem retorno esperado de -42,83% ao ano. Como o sorteio dá peso positivo a todos os ativos, quase toda carteira sorteada carrega um pedaço desses ativos.

  4. Na animação da fronteira, alguma carteira sorteada passa acima ou à esquerda da curva?
    Resposta comentada

    Nenhuma. Cada ponto da fronteira é a carteira de menor volatilidade possível para um retorno alvo, então nenhuma outra carteira com o mesmo retorno pode ter volatilidade menor. O teste da aula confere isso para as 10.000.

  5. Na animação do SLSQP, para onde vai o primeiro passo, e onde o otimizador para?
    Resposta comentada

    O primeiro passo vai para o vértice da PETR4, 100% em um ativo, com Sharpe 0,79. Depois o otimizador recua e para em 10 iterações em 44,31% PETR4, 23,97% IVVB11 e 31,72% GOLD11, com Sharpe 0,92. O primeiro passo segue a direção que mais melhora o Sharpe no ponto de partida, e os seguintes corrigem o excesso.

2. A amostra desta aula

Toda a aula usa o Adj Close da cesta com o tratamento de ausência único do módulo, registrado na ADR-009 e implementado em tools/retornos.py. A regra tem quatro partes: a lacuna isolada é preenchida com o último preço, nada é preenchido antes da primeira cotação de um ativo, a métrica de um ativo usa a série inteira dele e a análise conjunta usa a janela comum dos ativos envolvidos.

O preenchimento é o tratamento que o exemplo de ADR da Aula 01 escolheu, e no snapshot ele afeta um pregão só: 24/10/2025, em que BOVA11, IVVB11 e GOLD11 ficaram sem cotação. Esse pregão entra na amostra com retorno zero nos três ETFs, e o pregão seguinte leva a variação dos dois dias. A cesta desta aula é uma análise conjunta, então usa a janela comum dos 15 ativos: como a GOLD11 só é cotada a partir de 11/12/2020, são 1.423 retornos diários para cada ativo, de 14/12/2020 a 31/08/2026.

É a mesma janela da matriz de covariância montada na Aula 03, e o otimizador consome essa matriz sem recalcular nada. A janela comum garante também que a matriz seja semidefinida positiva: uma matriz montada par a par, com uma amostra diferente em cada par, pode deixar de ser, e aí existe combinação de pesos com "variância" negativa, que o otimizador persegue.

PETR4RetornosInícioVolatilidade anual
Série inteira (Aula 02)1.90703/01/201939,25%
Janela comum dos 15 ativos (esta aula)1.42314/12/202033,40%

A tabela mede o custo da janela comum. Com a GOLD11 na cesta, a janela perde março de 2020, o mesmo efeito que a Aula 01 mostrou ao descartar datas, e a volatilidade anual da PETR4 cai de 39,25% na série inteira, a medida da Aula 02, para 33,40%. O otimizador desta aula é estimado sem o choque de 2020.

Para o ADR do grupo. A escolha da janela muda todos os números desta página. O ADR do motor ou do otimizador declara a janela que alimenta a matriz, com início e número de retornos, e decide se um ativo de histórico curto como a GOLD11 vale a perda de março de 2020, citando um número que muda com a escolha, por exemplo a volatilidade da carteira de variância mínima.

Com essa amostra, a matriz tem 15 retornos esperados e 120 variâncias e covariâncias distintas: 135 números estimados do histórico. Cada um carrega erro de estimação, e a Aula 05 mede quanto esse erro move os pesos ótimos.

3. Forma vetorial e o Sharpe com o CDI

Com w o vetor de pesos, mu o vetor de retornos esperados anuais e cov a matriz de covariância anual, as três métricas de uma carteira são:

retorno = w @ mu
volatilidade = np.sqrt(w @ cov @ w)
sharpe = (retorno - rf) / volatilidade

A variância w @ cov @ w soma, para cada par de ativos, a covariância do par multiplicada pelos dois pesos. É por isso que dois ativos de correlação negativa, como PETR4 e GOLD11 (-0,13), reduzem a volatilidade da carteira abaixo da média ponderada das volatilidades: o termo cruzado entra com sinal negativo.

O teste que garante que a fórmula está certa é calcular a mesma carteira de dois jeitos. Para os pesos iguais, a série diária retornos @ w anualizada dá exatamente o mesmo retorno (8,34%) e a mesma volatilidade (16,31%) da forma vetorial. Esse teste entra no SPEC.md do A3 como caso com os dados do grupo.

Por que o CDI no lugar da taxa livre de risco

O parceiro decide onde alocar excedente de caixa, e a alternativa sem risco desse caixa é o CDI. O Sharpe mede quanto retorno acima dessa alternativa a carteira entrega por unidade de volatilidade. A taxa usada é o CDI diário da série 12 do SGS, acumulado na mesma janela dos retornos e anualizado por 252 dias úteis: 11,30% ao ano. Usar um CDI de outra janela mudaria o Sharpe de todas as carteiras e, com ele, a carteira de máximo Sharpe.

4. Por que o sorteio não alcança a ótima

SorteiosMelhor Sharpe entre os sorteados
10-0,10
1000,15
1.0000,28
10.0000,41
100.0000,41
1.000.0000,60
SLSQP, máximo Sharpe0,92

O motor da aula sorteia 15 números Uniform(0,1) e divide cada um pela soma da linha. Essa distribuição não é uniforme no conjunto de pesos possíveis (o simplex): ela acumula as carteiras perto de 1/15 por ativo. Entre as 10.000 sorteadas, o maior peso dado a um único ativo é 24,61%, e a carteira de máximo Sharpe põe 44,31% na PETR4 e zera 12 ativos, uma região que essa distribuição quase nunca visita. Multiplicar o número de sorteios por 100 leva a melhor sorteada só de 0,41 para 0,60.

Trocar a distribuição, com a mesma semente e os mesmos 10.000 sorteios, muda mais o resultado que multiplicar sorteios. A Dirichlet(1) é a uniforme no simplex; a Dirichlet(0,2) favorece carteiras concentradas, perto dos vértices (Devroye, 1986, referência 9 da página de referências). O número efetivo de ativos, 1 dividido pela soma dos pesos ao quadrado, vale 15 com pesos iguais e 1 com todo o peso num ativo.

10.000 sorteios, semente 42Melhor SharpeMaior peso da melhorAtivos efetivos, medianaCarteiras com peso acima de 25%
Uniform(0,1) dividido pela soma, o motor da aula0,4118,17%11,410,00%
Dirichlet(1), uniforme no simplex0,6455,26%8,3726,21%
Dirichlet(0,2), mais peso nos vértices0,8568,35%3,7094,91%
Máximo Sharpe, SLSQP0,9244,31%2,82 na ótimanão se aplica

Três fatores explicam a distância até a ótima. A distribuição dos pesos responde pela maior parte do ganho: a Dirichlet(1) com 10.000 sorteios (0,64) passa do motor da aula com um milhão (0,60). A dimensão pesa: no trio PETR4, IVVB11 e GOLD11, as três distribuições chegam a 0,92 com os mesmos 10.000 sorteios, e com 15 ativos nenhuma chega. E o sorteio não tem objetivo: ele não usa o Sharpe para decidir onde sortear, e a Dirichlet(0,2) chega a concentrar demais (1,90 ativos efetivos na melhor, contra 2,82 na ótima). A otimização da seção seguinte usa o Sharpe como objetivo e chega a 0,92.

A melhor sorteada é a melhor entre as sorteadas. É essa frase que o barema do A3 pede na leitura analítica, e é a pergunta que o parceiro fará: se 10.000 tentativas não bastam para achar a melhor carteira, o que basta? A resposta é a seção seguinte.

Tempo do motor. O requisito do A3 é 10.000 carteiras em menos de 10 segundos. A versão vetorizada, com einsum, roda em menos de 1 segundo, e o teste da aula trava esse limite. Um laço em Python sobre as carteiras também cumpre o requisito com 15 ativos, mas o ADR de vetorização registra o tempo medido das duas versões.

5. Otimização com restrições no SLSQP

Um problema de otimização tem três partes, e cada uma vira um argumento de scipy.optimize.minimize:

ParteNo problema da carteiraArgumento
Função objetivovariância w @ cov @ w, ou o Sharpe com sinal trocadoprimeiro argumento
Restrição de igualdadeos pesos somam 1constraints=[{"type": "eq", ...}]
Limitescada peso entre 0 e 1, sem venda a descobertobounds=[(0, 1)] * n

A soma 1 sozinha não impede peso negativo: uma carteira com -50% num ativo e 150% em outro também soma 1. São os limites que proíbem a venda a descoberto, e o A4 exige os dois. O minimize só maximiza trocando o sinal: maximizar o Sharpe é minimizar o Sharpe negativo.

O que conferir no resultado

O objeto devolvido traz x (os pesos), success e message. Usar x sem olhar success é o erro mais comum da sprint: quando o SLSQP para por limite de iterações ou por não achar direção de descida, x continua preenchido, com pesos que parecem plausíveis e não são ótimos. O notebook da aula falha de propósito com assert resultado.success, para o erro aparecer na hora em vez de virar um número errado no relatório ao parceiro.

No trio PETR4, IVVB11 e GOLD11, partindo de 10%, 80% e 10%, o primeiro passo vai até o vértice da PETR4 (Sharpe 0,79), e o otimizador para em 10 iterações no mesmo Sharpe de 0,92 da cesta inteira. Os outros 12 ativos não entram na carteira de máximo Sharpe, então o trio reproduz o ótimo da cesta.

6. As duas ótimas e a fronteira

MedidaVariância mínimaMáximo SharpeMelhor sorteada
Retorno14,10%25,96%16,62%
Volatilidade9,67%15,91%13,05%
Sharpe0,290,920,41
Ativos com peso10315
Maior peso26,78% IVVB1144,31% PETR418,17%

A variância mínima procura só o menor risco e espalha o peso em 10 ativos, com IVVB11, GOLD11 e EGIE3 somando 68,68%. Ela tem volatilidade de 9,67%, abaixo da menor sorteada (11,87%). O máximo Sharpe aceita mais volatilidade em troca de retorno e concentra em três ativos de correlação baixa ou negativa entre si. A tabela comparativa do A4 pede a leitura de qual carteira serve a qual perfil de investidor do parceiro.

A fronteira liga essas carteiras. Cada um dos 50 pontos fixa um retorno alvo, de 14,10% (variância mínima) a 37,53% (o retorno da PETR4, onde a carteira vira um ativo só), e resolve a menor volatilidade com mais uma restrição de igualdade, w @ mu == alvo. O ponto de partida de cada alvo é a solução do alvo anterior, o que deixa a sequência estável e rápida.

O otimizador converge para o passado. Os pesos desta seção são ótimos para a janela de 14/12/2020 a 31/08/2026. A PETR4 domina o máximo Sharpe porque rendeu 37,53% ao ano nessa janela, e nada garante que repita. A Aula 05 testa as duas carteiras fora da amostra.

7. Depois do encontro

Desafio do notebook. Repetir o máximo Sharpe com um peso máximo por ativo (seção 6 do notebook) e comparar os pesos e o Sharpe com os da aula.

Avanço do A3 e prévia do A4. O gráfico integrando nuvem, fronteira e os dois pontos ótimos, a tabela comparativa das duas carteiras e o ADR das restrições da otimização, com o impacto numérico da decisão. O A3 vale 3 pontos: a review da Sprint 3 é em 19/11/2026 e a entrega, na sexta, 20/11/2026, às 23h59. O A4 vale 3 pontos e entrega o otimizador num módulo Python; a Adalove o lista nas Sprints 3 e 4, ponto em aberto com a coordenação.

Leitura complementar. A seção do autoestudo sobre a fronteira como borda da nuvem, relida com o gráfico do próprio grupo. A página de referências lista as fontes.

O laboratório completo está no notebook da Aula 04.

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