Análise de um Portfólio de Ações em Python

“Don’t put all your eggs in one basket”

Thalissa Reis
Turing Talks
10 min readNov 15, 2020

--

Texto escrito por Diego Lottermann, GuiCola e Thalissa Reis

REUTERS/LUCAS JACKSON

Extração de Dados e Pesos de Portfólio

No Turing Talks de hoje, vamos retomar as discussões sobre finanças quantitativas, desde a extração dos dados até o cálculo de retorno, só que, agora, de um portfólio de ativos. Recomendamos que, antes de explorar este maravilhoso conteúdo, você dê uma conferida no artigo deste link, no qual exploramos os mesmos temas só que relacionados a um ativo e não a um portfólio.

Fica o mesmo aviso do último texto: você, que não sabe nada sobre finanças quantitativas ou programação, fique tranquilo, pois o propósito deste artigo é, justamente, tratar de conceitos básicos.

A primeira etapa, ao trabalharmos com um portfólio, é coletar os dados!

Se você leu o último artigo, você já sabe que não existe um caminho único para obtenção dos dados, pois séries temporais com preços de fechamento de ativos podem ser obtidas de várias maneiras, como em arquivos csv em sites específicos ou em API´s diversas. No presente artigo, coletaremos os dados da API do Yahoo Finance, devido ao antigo postulado BB (bom e barato — no caso, gratuito).

Existem outras API´s interessantes, mas que demandam cadastro para obtenção de uma key, como o Alpha Vantage, ou são pagas, como a Morningstar e a IEX. Para obtenção dos dados no Alpha Vantage seria necessário realizar um cadastro no site da API (url). Dessa maneira, você obterá uma key, utilizada para validação da coleta de dados. Se você quiser visualizar um exemplo de extração através do Alpha Vantage, é só dar uma conferida no nosso último artigo!

Já nos decidimos pelo Yahoo Finance, então vamos importar algumas bibliotecas!

A primeira biblioteca (também conhecida como o primeiro cavaleiro do apocalipse) é o pandas, muito útil em diversas aplicações no universo dos dados. Além dele, devemos importar seu adicional “data”, o leitor de dados do pandas, o qual chamaremos, carinhosamente, de wb em homenagem a Warner Bros.

Após as importações, é necessária a criação do seu data frame (local de armazenamento de seus dados) e de uma lista com todos os tickers das ações que você deseja adicionar ao seu portfólio. É importante salientar que o ticker escrito deve ser equivalente ao ticker utilizado pelo Yahoo Finance (não necessariamente coincide com o ticker oficial). No presente artigo, vamos fazer uso de algumas empresas aéreas: Azul (AZUL), Latam (LTM- LTMAQ no Yahoo Finance), Gol (GOL) e American Airlines (AAL).

A título de curiosidade, os tickers de empresas e ETF’s do Brasil possuem sempre “.SA” no final, como BOVA11.SA por exemplo. O padrão se repete em outros países, com sufixos que diferenciam a origem do ticker.

No presente artigo, por mais que o Yahoo Finance seja capaz de retornar uma série de dados, vamos fazer uso apenas do preço de fechamento das empresas X, Y, Z. Dessa forma, atribuímos todos os tickers das empresas em questão a uma variável e requisitamos os dados através desta com a limitação do Adjusted Close (Fechamento Ajustado).

Além de configurar a limitação “Adj Close” à nossa coleta de dados, temos que definir a fonte de dados (data_source=’yahoo’) e o período que queremos (‘start=’mm-dd-aa’).

Vamos ver se deu tudo certo?

Sim! Conseguimos! Contudo, nossa missão está apenas no começo.

Todos os portfólios devem possuir ativos com determinadas representatividades, chamadas de “pesos”. Você, como investidor, pode optar por possuir a mesma porcentagem de seu patrimônio em cada modalidade de investimento ou pode optar por customizá-la de acordo com suas demandas.

Os processos pelos quais os pesos podem ser definidos são diversos, contudo os meios mais usuais são análises de correlação e relações risco-retorno. Tais temas serão abordados em futuros Turing Talks com maior profundidade, então, aqui, vamos nos concentrar na definição “manual” dos pesos, através da criação de uma matriz de pesos, usualmente chamada de “weights”.

Para defini-los, basta atribuir o valor do peso a lista “weights” na mesma sequência em que os ativos foram colocados na lista “tickers” na coleta de dados. Em uma determinada situação, poderíamos atribuir 25% de peso a cada ativo em nosso portfólio composto por quatro ativos.

Após aprender a coletar os dados e a atribuir pesos, vamos ao que interessa!

Retorno de um Portfólio

Agora que já sabemos como importar preços históricos e como calcular o risco e retorno de ativos individuais, podemos usar esse conhecimento para começar a montar o nosso portfólio!

Como visto no artigo anterior, a fórmula do retorno de um ativo é muito simples:

Fórmula para cálculo do Retorno Simples

E sua forma acumulada:

Fórmula para cálculo do Retorno Simples Cumulativo

Logo, basta calcular os retornos de cada período para termos o retorno total. Entretanto, para carteiras com mais de um ativo é necessário ponderar o retorno de cada ativo pelo seu respectivo peso.

Para fazer isso, vamos exemplificar com uma carteira de 4 ações diferentes: Azul (AZUL), Latam (LTMAQ), Gol (GOL) e American Airlines (AAL) no período de dois anos (28/08/2018 a 28/08/2020). Cada ação possui um peso, ou seja, o quanto ela representa do total da carteira. Evidentemente, a soma desses pesos deve totalizar 1. Por exemplo: w = [0.3, 0.3, 0.2, 0.2], isso significa que temos 30% do nosso capital investido em AZUL, 30% em LTMAQ, 20% em GOL e 20% em AAL.

Existem algumas maneiras de se calcular o retorno de um portfólio em um período t, nesse artigo vamos calculá-lo pela seguinte fórmula vetorizada:

Fórmula para cálculo do retorno de um portfolio

Onde 𝑟⃗ é o vetor de retornos de cada ativo da carteira no período, e 𝑤⃗ os seus respectivos pesos.

O que essa fórmula nos diz? É muito simples, basicamente estamos multiplicando o retorno de cada ativo em cada período (minuto, dia, mês, etc) pelo seu peso e somando-os.

Mais especificamente, o resultado da multiplicação do retorno de um ativo em uma data pelo seu peso na carteira é denominado de attribution. Logo, o retorno do portfólio em uma data é a soma dos attributions de cada ativo, ou seja, suas contribuições.

Fazer essa conta por multiplicação de matrizes funciona apenas para quando os pesos dos ativos não mudam conforme o tempo passa. Caso os pesos da carteira mudem com o tempo, é necessário fazer a multiplicação “element wise”.

Finalmente, note que R será um vetor de 1 coluna e t linhas, onde t é a quantidade de períodos. E como fazemos isso em Python? Veja abaixo:

Agora que temos os retornos em cada período, basta fazermos a conta de retorno acumulado para termos o retorno ao final do período.

Vemos, portanto, que a performance dessa carteira foi bem abaixo do Ibovespa no mesmo período. Muito provavelmente devido aos prejuízos nesses setores em decorrência da pandemia do novo coronavírus.

Finalmente, vamos plotar dois cenários hipotéticos:

i. Investir R$1000,00 na carteira

ii. Investir R$1000,00 em Ibov

Note que o Ibovespa conseguiu recuperar suas perdas, enquanto que nossa carteira não.

Vale notar que as regras de retorno simples e retorno logaritmo também se aplicam, e essas foram mais bem detalhadas em nosso artigo anterior de análise de ações.

Risco e Diversificação de um Portfólio

Você provavelmente já ouviu que deve ter um portfólio diversificado. Essa diversificação deve ser feita nos tipos de ativos investidos — não é aconselhável investir em apenas um tipo de ativo (como ações) — alternando entre ações, títulos e fundos imobiliários, por exemplo. Analogamente, o portfólio de ações em si também deve ser devidamente diversificado. Mas você sabe porque é tão importante assim essa diversificação? A resposta curta seria: para minimizar o risco. Nesse tópico, vamos explorar mais a fundo como e porque essa minimização ocorre.

Primeiro, cabe analisarmos como é feito o cálculo da volatilidade de um portfólio e como esse pode ser feito utilizando Python (numpy será um ótimo aliado para tal). Tendo visto anteriormente que, para uma ação individual, o risco é calculado através do desvio padrão, o mais intuitivo pode ser pensar que, para calcular o do portfólio, basta calcular o desvio padrão de cada ação e multiplicar pelo seu respectivo peso. Esse até poderia ser o caso se a flutuação de cada uma das ações fossem eventos independentes entre si. Mas, dificilmente, esse será o caso, tendo em vista que, normalmente, as ações oscilam conjuntamente. Dessa forma, a volatilidade de um portfólio será dada por:

Fórmula da Volatilidade do Portfolio

Sendo:

  • w: array de dimensão (1 x n) com os pesos de cada ação, sendo n o número de ações do portfólio;
  • C: matriz de covariância (n x n) das ações do portfólio;
  • wT: transposição do array com os pesos de cada ação (n x 1).

A matriz de covariância ( C ) é o fator que analisa a variação conjunta de preços de cada par de ativo. Cada covariância é calculada através da seguinte fórmula:

Fórmula da Covariância

Sendo:

  • xi: o retorno da ação A no dia i;
  • x: o retorno médio da ação A;
  • yi: o retorno da ação B no dia i;
  • y: o retorno médio da ação B;
  • n: o número de dias analisados

Aplicando essa fórmula a cada elemento da matriz de covariância C, a diagonal principal apresentará uma característica interessante: nessa, será calculada a covariância entre a ação e ela mesma, resultando, portanto, na variância da ação. Aqui, cabe lembrar que a variância corresponde ao quadrado do desvio padrão. Assim, fica nítido o porquê de ser operada a raiz quadrada da multiplicação matricial para encontrarmos a volatilidade do portfólio.

Sem mais delongas e parte teórica, vamos para a prática! Para tal, vamos considerar dois portfólios com graus diferentes de diversificação para analisarmos o impacto dessa no valor da volatilidade.

Primeiro, vamos analisar um portfólio composto por: Azul (AZUL), Latam (LTM), Gol (GOL) e American Airlines (AAL) com pesos homogeneamente distribuídos (todas com 25%) e considerando o período de dois anos (de 28/08/2018 a 28/08/2020). Não precisamos nem plotar uma matriz de correlação para perceber que esse portfólio não é nem um pouco diversificado. Todas as ações pertencem a um mesmo setor e, portanto, tendem a apresentar um padrão de flutuação altamente correlato. Vamos calcular, então, o risco deste:

Algumas observações importantes:

  • Para cálculo, consideramos o retorno logarítmico;
  • Foi multiplicado por 252 a fim de calcularmos a volatilidade anual, e não a diária, do portfólio.

Uau! Que volátil! O resultado era um tanto quanto esperado haja vista que todas as ações estão relacionadas ao mesmo setor. Vamos olhar essa relação mais de perto? Para isso, usaremos uma matriz de correlação, mas antes, cabe darmos uma relembrada na fórmula de correlação a partir da covariância:

Fórmula da Correlação

Sendo:

  • Cov(x,y): covariância entre as ações x e y;
  • σx: desvio padrão da ação x;
  • σy: desvio padrão da ação y.

Assim, percebemos que a correlação é meramente uma normalização da covariância a partir dos desvios padrões. Ela costuma ser uma forma mais direta de visualização, pois possui limite inferior e superior (varia entre -1 e 1), enquanto a covariância pode variar entre -∞ e +∞. Vale lembrar que, quanto mais próximo de 1 for o valor absoluto, mais forte é a correlação. Vamos dar uma olhada, então, na matriz de correlação do portfólio 1:

Não surpreendentemente, as ações apresentam forte correlação entre si. A menos correlata é a American Airlines, o que faz sentido considerando que, das três, ela é a única que não concentra suas operações na região da América Latina.

Agora, vamos para o segundo portfólio: esse será composto pela Tesla (TSLA), Bradesco (BBD), Lockheed Martin (LMT) e pela cotação do Ouro (GC=F), com pesos distribuídos homogeneamente (25% para cada) e considerando o mesmo período do portfólio anterior. Sigamos para o cálculo do risco:

Bem melhor, não? Vamos dar uma olhada agora na matriz de correlação desse portfólio:

Nesse portfólio, as ações apresentam uma correlação bem menor entre si. O par mais correlato deste apresenta o mesmo valor de correlação (0,46) que o segundo par menos correlato do portfólio anterior. Assim, fica evidente como este está bem mais diversificado. Nessa análise, vemos também que a ação menos correlata é a da cotação do ouro. Aqui, cabe uma observação interessante: o ouro é comumente usado pelos investidores como um hedge (ou seja, uma estratégia de proteção para os riscos) contra a inflação e demais instabilidades do mercado. Geralmente, o ouro costuma apresentar um comportamento inverso ao dólar: quando esse cai, o ouro tende a ser mais demandado e, portanto, mais valorizado. Assim, se tudo mais no mercado estiver dando errado, pelo menos, parte do seu patrimônio estaria a salvo com o investimento no ouro.

Os pesos dos portfólios exemplificados neste texto, foram escolhidos sem considerar sua forma ótima de distribuição. Mas você sabia que existem teorias e métodos que nos auxiliam na otimização da distribuição de pesos de um portfólio? Mas isso e a aplicação de IA para tal cabe a um próximo Turing Talks! Obrigada por lerem até aqui e até o próximo!

--

--

Thalissa Reis
Turing Talks

Estudante de Engenharia de Produção na Poli-USP. Membro do Grupo Turing. Entusiasta em Inteligência Artificial e Finanças Quantitativas.