Analisando ações da Bovespa

César Menezes Vieira
6 min readMar 13, 2019

--

Sempre tive muito interesse em estudar finanças, especialmente quando comecei a investir. Depois de algumas experiências com a linguagem C durante a pós-graduação, e vendo as experiências de amigos da pós sobre o quanto o Python é versátil, resolvi estudar um pouco de finanças e, de quebra, aprender um pouco de Python.

Foi então em um curso da Udemy que eu vi a oportunidade de estudar as duas coisas. Esse curso tem uma estrutura interessante: a primeira parte é dedicada ao estudo de Python, e a outra aborda conceitos de finanças e como aplicá-los utilizando os conceitos de Python vistos anteriormente.

Embora o meu perfil de investidor atual esteja em algum lugar entre conservador e moderado, nesse meio tempo eu comecei a me animar em colocar um pé — talvez a unha seja mais apropriado — na renda variável, após ler um pouco e conversar sobre o assunto com um amigo do trabalho que tem um perfil de investidor mais agressivo.

Nesse meu primeiro post, eu escolhi algumas ações que eu acompanho e resolvi registrar aqui algumas análises que eu estou aprendendo enquanto faço o curso da Udemy.

1) Preços das ações

Primeiramente, utilizei o Pandas para importar os dados históricos diários das ações de Itaúsa (ITSA4), Fleury (FLRY3) e Lojas Renner (LREN3) desde 01/01/2010 até 13/03/2019 a partir do banco de dados do Yahoo Finance. Após pesquisar no próprio site do Yahoo os códigos (tickers) das ações que eu desejava analisar, criei uma variável (prices), que é basicamente uma tabela (pandas.Dataframe()) que é preenchida com os dados a serem importados. Os dados importados contém uma série de colunas, como preço de abertura, preço de alta, preço de baixa etc. Nesta análise, estou importando apenas uma coluna que fornece o preço de fechamento ajustado ('Adj Close') de cada ativo. Achei incrível como o Python pode importar tantos dados com tamanha facilidade!

import numpy as np
import pandas as pd
from pandas_datareader import data as wb
TickerA='ITSA4.SA'
TickerB='FLRY3.SA'
TickerC='LREN3.SA'
prices=pd.DataFrame()
tickers = [TickerA, TickerB, TickerC]
for t in tickers:
prices[t]=wb.DataReader(t, data_source='yahoo', start='2010-1-1')['Adj Close']

Utilizando o Matplotlib, plotei no gráfico da figura abaixo os preços de cada um dos três ativos. O eixo horizontal representa o tempo, enquanto o eixo vertical representa o preço do ativo normalizado, isto é, inicialmente todos os preços começam em 100. Essa normalização (prices/prices.iloc[0]*100) toma todos os dados (prices) de cada ativo, divide pelo seu valor inicial (prices.iloc[0]), e o multiplica por 100. É uma operação muito conveniente especialmente quando desejamos apresentar os dados em uma mesma figura.

Preços normalizados de Itaúsa (ITSA4.SA), Fleury (FLRY3.SA) e Lojas Renner (LREN3.SA) de 01/01/2000 até 13/03/2019.
import matplotlib.pyplot as plt(prices/prices.iloc[0]*100).plot(figsize=(15,5))
plt.ylabel('NORMALIZED PRICES')
plt.xlabel('DATE')
plt.show()

2) Retornos diários

Para calcular quanto um ativo retornou em um dia, basta tomar a variação do preço no dia anterior para o preço no dia atual (P1 - P0), e dividir pelo valor do ativo no dia anterior (P0):

Essa variação percentual pode ser facilmente calculada em Python da seguinte maneira: prices/prices.shift(1) - 1. Dessa forma, prices.shift(1) toma o valor da linha imediatamente acima da linha atual.

Outra forma de apresentar os retornos é calculando a taxa de retorno logarítmica, dada por np.log(P1/P0). No gráfico da figura abaixo, apresentamos os retornos logarítmicos diários de cada um dos ativos com o tempo.

log_returns=np.log(prices/prices.shift(1))log_returns.plot(figsize=(15,5))
plt.ylabel('LOG DAILY RETURNS')
plt.xlabel('DATE')
plt.show()

3) Retornos diários médios x Retornos anuais médios

Quanto cada ativo variou, em média, por dia, desde 2000 até hoje? De posse dos retornos diários, isto é, quanto cada ativo variou percentualmente de um dia para o outro, podemos utilizar o Python para calcular o valor médio (diário) dos dados:

log_returns.mean()

O quadro abaixo mostra o resultado obtido para a média dos retornos diários para Itaúsa, Fleury e Lojas Renner. Como se trata de porcentagens, podemos então afirmar que, na média, a Renner teve o maior rendimento diário médio, por volta de 0.12%.

ITSA4.SA    0.000483
FLRY3.SA 0.000586
LREN3.SA 0.001188
dtype: float64

E como calcular os retornos médios anuais? Em Python, basta multiplicarmos o valor da média diária pelo dia de dias úteis em um ano, que é um número por volta de 250:

log_returns.mean()*250

O quadro abaixo mostra o resultado obtido para a média dos retornos anuais para Itaúsa, Fleury e Lojas Renner.

ITSA4.SA    0.120666
FLRY3.SA 0.146458
LREN3.SA 0.297069
dtype: float64

Sendo assim, as ações da Itaúsa, Fleury e Lojas Renner tiveram um rendimento anual médio de 12.07%, 14.65% e 29.71%, respectivamente.

4) Computando o risco (desvio padrão)

Ao realizar uma aplicação financeira, o investidor geralmente procura bons retornos, mas o risco de perder dinheiro muitas vezes pode levá-lo a tomar uma atitude mais conservadora, e consequentemente obter um retorno menor. Por quê? Porque geralmente maiores retornos têm uma maior probabilidade de virem acompanhados de riscos maiores. Se o risco é importante, então como poderíamos estimar o risco de um determinado ativo?

Conceitos de estatística como variância e desvio padrão podem nos ajudar quando desejamos quantificar o risco de um ativo. É esperado que uma ação volátil possa desviar muito do seu valor médio, para mais ou para menos. Essa medida do quanto a variável desvia do seu valor médio é a variância, dada pela fórmula

Na equação acima, n representa o número de dados, e o termo negativo no numerador é o valor médio de x. A raiz quadrada da variância (ou seja, s) é chamada de desvio padrão. Em finanças, o desvio padrão representa o risco (ou a volatilidade) do ativo.

Em Python, para calcularmos o desvio padrão dos retornos diários dos dados que estamos interessados, basta utilizar a função .std() (do inglês, standard deviation):

log_returns.std()

O quadro abaixo mostra o resultado obtido para a volatilidade dos retornos diários para Itaúsa, Fleury e Lojas Renner.

ITSA4.SA    0.022981
FLRY3.SA 0.018971
LREN3.SA 0.021377
dtype: float64

5) Correlações entre retornos diários

Podemos utilizar o conceito de correlação para analisar o quanto a variação de um ativo pode ou não interferir na variação do outro. A correlação entre duas variáveis x e y (corr(x,y)) se apresenta como um número real entre -1 e 1, onde: 0 < corr(x,y) < 1 (correlação positiva) significa que o aumento de x influencia no aumento de y; -1 < corr(x,y) < 0 (correlação negativa) significa que o aumento de x influencia na redução de y; e corr(x,y) = 0 significa que as variáveis x e y são independentes. Dessa forma, duas variáveis fortemente correlacionadas terão o valor absoluto da correlação muito próximo de 1 (podendo ser positivamente ou negativamente correlacionadas).

Em Python, para calcular as correlações entre os retornos diários (log_returns), basta digitar log_returns.corr(). Os resultados que obtidos estão listados na tabela abaixo:

CORRELATION (LOG DAILY RETURNS):
ITSA4.SA FLRY3.SA LREN3.SA
ITSA4.SA 1.000000 0.213815 0.377377
FLRY3.SA 0.213815 1.000000 0.229163
LREN3.SA 0.377377 0.229163 1.000000

Podemos interpretar a tabela acima como uma matriz em que cada elemento é a correlação da linha e da coluna associadas. Dessa forma, naturalmente que a variação do preço de Itaúsa, por exemplo, é fortemente correlacionada com ela mesma (corr(x,x)=1). Além disso, é fácil entender que corr(x,y)=corr(y,x). Podemos observar também que, no caso analisado, as ações cujos retornos diários possuem a maior correlação são Itaúsa e Lojas Renner, com um valor de 0.377377.

--

--