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

Criando IA Assistant usando Shiny no Python

Nesta postagem, ensinamos a como criar um chatbot interativo utilizando o Shiny Python. Veremos os principais conceitos sobre o módulo Chat do Shiny e como integrá-lo a modelos de IA generativa, como Gemini, para criar um chatbot funcional em poucos passos.

Como coletar dados para relatórios de câmbio com Python

O monitoramento do mercado cambial permite tomar melhores decisões de consumo e investimento, por sua influência em diversos preços da economia. Neste artigo, mostramos rotinas simples de Python para coleta e análise de dados que são comumente utilizados em relatórios de câmbio.

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.