Como otimizar um portfólio de investimentos no Python?

A gestão de portfólio tem como principal objetivo lidar com a alocação de ativos financeiros em uma carteira de investimentos e um dos mais importantes métodos construídos para auxiliar com essa questão encontra-se na seleção de carteiras através do modelo de média-variância de Markowitz. No post de hoje, iremos utilizar o Python para construir uma carteira ótima, com dados de empresas listadas na bolsa de valores brasileira.

Para que possamos calcular os pesos ótimos de uma carteira, devemos primeiro obter os retornos dos ativos financeiros, calculados a partir da seguinte equação:

    $$R_i = \frac{P_t - P_{t-1}}{P_{t-1}}$$

Ou seja, o  R_t é dado pelo preço no tempo t, dividido pelo preço no tempo t-1.

O retorno de um ativo é a estrutura do estudo, pois é basicamente dele que é encontrado  a média e a variância para que possamos realizar o cálculo do risco do nosso conjunto de ativos e encontrar os pesos ideais de um portfólio.

A média dos retornos, é denominado como o Retorno Esperado do ativo, baseado na média amostral dos retornos históricos do nossos ativos.

    $$E(R) = \frac{\sum_{t = 1}^{T}(R_it)}{T}$$

Por outro lado, a variância, denominado como o Risco do ativo, também podendo ser mensurado pelo desvio padrão, é dado por:

    $$\sigma^2 = \frac{(E[(R_i - \mu)^2])}{T-1}$$

Dito isso, sabemos que estamos lidando com ativos individuais, porém, como o contexto é dado pelo retorno de um conjunto de ativos, devemos calcular os estimadores corretos, buscando encontrar o retorno e a variância do portfólio.

O Retorno de um portfólio é calculado como:

    $$R_p = \sum_{i=1}^n(W_iR_i)$$

Ou seja, o retorno do ativo $i$ ponderado pelo seu peso  $w_i$.

Por outro lado, o risco de um portfólio não é igual ao calculo da variância de um ativo individual, devido ao fato de que devemos levar em consideração o risco entre os ativos na carteira, e que podemos calcular através da covariância ou correlação.

A covariância permite que seja calculado a dependência linear entre as variáveis.. Quando medimos a covariância (ou correlação) de dois ou mais ativos, estamos considerando o quanto os ativos se movimentam em relação ao outro, se positivamente ou negativamente.

Calculamos a covariância como:

    $$\sigma_{jk}=\frac{\sum_{t=1}^T[R_{jt}-\bar{R}_j][R_{kt}-\bar{R}_k]}{T-1}$$

Quando ocorre de os ativos terem covariância negativa, a variância ou risco do portfólio tende a diminuir. Quando a covariância é positiva, o risco do portfólio tende a aumentar. Essa questão é um principio básico da diversificação. Quanto menor a covariância dos ativos em uma carteira, menor o risco, quanto maior a covariância, maior o risco.

Sendo assim, calcula-se o risco (variância) de um portfólio como:

    $$\sigma_P=\sqrt{\sum_{j=1}^N(w_j^2 \sigma_j^2)+\sum_{j=1}^N\sum_{\substack {k=1 \\ k \neq j}}^N(w_j w_k \sigma_{jk})}$$

Mas todo o papel da covariância e variância dos ativos individuais em uma carteira, dependerá de seus pesos. Isto leva a crer que pode existir um combinação grande de pesos para uma só carteira, e o investidor se vê tentado a tentar uma combinação que melhor satisfaça suas preferências. Em muitos casos, a preferência que melhor pode atender a todos será a combinação de pesos de ativos que melhor minimize o risco do portfólio.

Para isso, Markowitz criou um método para que seja possível descobrir o pesos tal qual a relação de risco x retorno melhor se satisfaz dentro de um contexto que o retorno esperado é dado pela média amostral dos retornos e o risco é dado pela variância e covariância dos ativos.

O ponto em que é conhecido como aquele em que é minimizado o risco dados os estimadores, é conhecido como portfólio de variância mínima. Esse ponto é resolvido a partir de um problema de otimização, que possui algumas restrições:

1) a soma das proporções alocadas em cada ativo tem que ser igual a um;

2) cada ativo tem que ter peso maior ou igual a zero;

3) em cada problema escolhemos um retorno esperado para o qual minimizaremos o risco.

A otimização é calculada como:

    $$min_{w_i} \sum_{j=1}^N(w_j^2 \sigma_j^2)+\sum_{j=1}^N\sum_{\substack{k=1 \\ k \neq j}}^N(w_j w_k \sigma_{jk})$$

s.a.

$\sum_{j=1}^N w_j = 1$

$w_j \geq 0, \forall i$

$\sum_{j=1}^N w_i\bar{R}_j = \bar{R}_p$

Como dito, a solução deste problema nos dá os pesos ótimos para investir em cada um dos ativos.

Agora que entendemos um pouco sobre o conceito de otimização de Markowitz, vamos entender na prática como podemos encontrar os pesos ótimos de uma carteira. Para tanto, iremos utilizar o Python seguindo os seguintes passos:

  1. Realizar a importação dos preços de ações através do Yahoo Finance utilizando o pandas_datareader e yfinance.
  2. Calcular o Retorno Histórico diário com base nos preços dos ativos;
  3. Utilizar a biblioteca riskfolio para calcular as estatísticas dos retornos e encontrar o ponto no qual os pesos minimizam o risco da carteira;
  4. Plotar os resultados.

Realizamos todo o procedimento com um vídeo explicativo do código no Clube AM. . Não deixe de se inscrever gratuitamente aqui no boletim AM e receber todo o nosso conteúdo no seu e-mail.

Devemos primeiramente escolher os ativos a serem utilizados. Para o exercício, usaremos seis ações escolhidas aleatoriamente, dentro do período de 2017 até 30/09/2022. Com a função get_data_yahoo buscamos os dados dos preços ajustados diário no Yahoo Finance.

Com os preços em mãos, podemos calcular facilmente os retornos diários por meio do método pct_change.

Com os retornos, agora podemos construir o nosso portfólio e otimizar. Com a função Portfolio da biblioteca riskfolio, construímos um objeto para criar os parâmetros da otimização da carteira por meio do métodos existentes na classe construída.

Para estimar o portfolio otimizado pelo algortimo de Markowitz, escolhemos que o modelo será o Classic; a medida de risco é a mean-variance e a função objetiva será a minimização dos risco, isto é, da variância. Rodamos tudo dentro do método optimization.

 

Podemos analisar o resultados dos pesos em um gráfico de pizza.

Outra forma interessante de analisar a otimização é através do conjunto de oportunidades das possibilidades de alocação. Na estrela vermelha, temos o local onde se obtêm a minimização dos risco.

Por fim, para realizar uma comparação do conjunto de oportunidades, podemos plotar a composição da alocação para cada ponto.

__________________

Quer saber mais?

Veja nosso curso de Python para Investimentos.

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Como selecionar variáveis para modelos de previsão no Python?

Em oposição à crença popular, grande parte dos modelos de machine learning não produzem previsões magicamente. É papel do cientista de dados executar uma boa engenharia de variáveis para não cair no clássico problema de “garbage in, garbage out” (GIGO) em aprendizado de máquina. Neste sentido, aprender a fazer uma boa seleção de variáveis é fundamental e neste artigo exploramos algumas possibilidades práticas usando o Python.

Resultado IPCA-15 - Novembro/2024

A Análise Macro apresenta os resultados do IPCA-15 de Novembro de 2024, com gráficos elaborados em Python para coleta, tratamento e visualização de dados. Todo o conteúdo, disponível exclusivamente no Clube AM, foi desenvolvido com base nos métodos ensinados nos cursos da Análise Macro, permitindo aos assinantes acesso aos códigos e replicação das análises.

Resultado PNADc Trimestral - 3° Trimestre/2024

A Análise Macro apresenta os resultados da PNADc Trimestral do 3º trimestre de 2024, com gráficos elaborados em Python para coleta, tratamento e visualização de dados. Todo o conteúdo, disponível exclusivamente no Clube AM, foi desenvolvido com base nos métodos ensinados nos cursos da Análise Macro, permitindo aos assinantes acesso aos códigos e replicação das análises.

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.