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
| Prioridade | Item | Tempo | Para que serve no encontro |
|---|---|---|---|
| Indispensável | Autoestudo: Carteiras e simulação de Monte Carlo com Python | 65 min | a forma vetorial, o Sharpe e o código do motor da prática do Bloco 3 |
| Indispensável | As três animações da seção 1.2 | sem duração declarada | a nuvem do Peer Instruction, o SLSQP do Bloco 5 e a fronteira do Bloco 6 |
| Indispensável | Autoverificação de cinco perguntas, sem nota | sem duração declarada | mostra ao aluno o que rever antes do encontro |
| Recomendado | Autoestudo: Da nuvem à fronteira eficiente de Markowitz | 70 min | base conceitual da otimização com restrições e da fronteira |
| Aprofundamento | Leitura complementar: seção do autoestudo sobre a fronteira como borda da nuvem, relida com o gráfico do grupo | sem duração declarada | depois 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
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
| PETR4 | Retornos | Início | Volatilidade anual |
|---|---|---|---|
| Série inteira (Aula 02) | 1.907 | 03/01/2019 | 39,25% |
| Janela comum dos 15 ativos (esta aula) | 1.423 | 14/12/2020 | 33,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
| Sorteios | Melhor Sharpe entre os sorteados |
|---|---|
| 10 | -0,10 |
| 100 | 0,15 |
| 1.000 | 0,28 |
| 10.000 | 0,41 |
| 100.000 | 0,41 |
| 1.000.000 | 0,60 |
| SLSQP, máximo Sharpe | 0,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 42 | Melhor Sharpe | Maior peso da melhor | Ativos efetivos, mediana | Carteiras com peso acima de 25% |
|---|---|---|---|---|
| Uniform(0,1) dividido pela soma, o motor da aula | 0,41 | 18,17% | 11,41 | 0,00% |
| Dirichlet(1), uniforme no simplex | 0,64 | 55,26% | 8,37 | 26,21% |
| Dirichlet(0,2), mais peso nos vértices | 0,85 | 68,35% | 3,70 | 94,91% |
| Máximo Sharpe, SLSQP | 0,92 | 44,31% | 2,82 na ótima | nã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:
| Parte | No problema da carteira | Argumento |
|---|---|---|
| Função objetivo | variância w @ cov @ w, ou o Sharpe com sinal trocado | primeiro argumento |
| Restrição de igualdade | os pesos somam 1 | constraints=[{"type": "eq", ...}] |
| Limites | cada peso entre 0 e 1, sem venda a descoberto | bounds=[(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
| Medida | Variância mínima | Máximo Sharpe | Melhor sorteada |
|---|---|---|---|
| Retorno | 14,10% | 25,96% | 16,62% |
| Volatilidade | 9,67% | 15,91% | 13,05% |
| Sharpe | 0,29 | 0,92 | 0,41 |
| Ativos com peso | 10 | 3 | 15 |
| Maior peso | 26,78% IVVB11 | 44,31% PETR4 | 18,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.