Tutorial: Índices Sharpee#

O índice Sharpee é uma maneira de calcular o quão bom é um portifólio de ações. Um portifólio de ações é o que fazemos quando temos investimentos em mais de uma ação. Neste tutorial, vamos partir de um exemplo pequeno - vamos partir de duas ações e montar nosso portifólio.

#!pip install yfinance # Descomente essa linha para instalar o yfinance
import yfinance as yf
import matplotlib.pyplot as plt
import pandas as pd

Baixando dados de ações e visualizando preços de fechamento#

acao1 = 'VVEO3.SA'
acao2 = 'VALE3.SA'

ticker1 = yf.Ticker(acao1)
ticker2 = yf.Ticker(acao2)

data1 = ticker1.history(period='1y') # O período de 1 ano é suficiente?
data2 = ticker2.history(period='1y')

plt.figure()
plt.plot(data1['Close'], label=acao1)
plt.plot(data2['Close'], label=acao2)
plt.ylabel('Valor (R\$)')
plt.title('Cotações de ações na bolsa de valores')
plt.xlabel('Data')
plt.legend()
plt.show()
_images/00bcf19cf66881811964b6dc580b7546ce874a3011c5848fcba2e6d513f4c89c.png

Comprando ações individuais / buy-and-hold#

Agora, vamos simular a situação de comprarmos algum valor (por exemplo: 1000 reais) em ações. Em quantos reais esses 1000 iniciais se converteram ao longo do tempo, considerando sempre o preço de fechamento das ações?

investimento_inicial = 1000 # reais

n_acoes1 = investimento_inicial / data1.iloc[0]['Close']
data1['Valor investido'] = n_acoes1 * data1['Close']

n_acoes2 = investimento_inicial / data2.iloc[0]['Close']
data2['Valor investido'] = n_acoes2 * data2['Close']

plt.figure()
plt.plot(data1['Valor investido'], label=acao1)
plt.plot(data2['Valor investido'], label=acao2)
plt.axhline(investimento_inicial, linestyle=':', label='Investimento inicial')
plt.ylabel('Valor (R\$)')
plt.title('Valor investido por ação')
plt.xlabel('Data')
plt.legend()
plt.show()
_images/5591165efa0f4b390ff9dd50960249fe3293ec1b48fb1a8699c90217f86476e2.png

Valor do portifólio#

Ok, mas e se temos um portifólio com nossas duas ações? Bem, o valor investido no portifólio é a soma dos valores investidos em cada uma das nossas ações. Gostaríamos que nosso valor investido no portifólio se transformasse em um valor bem alto!!!

datap = pd.DataFrame()
datap['Valor investido'] = data1['Valor investido'] + data2['Valor investido']

plt.figure()
plt.plot(datap['Valor investido'],'g',label='Portifolio')
plt.axhline(investimento_inicial*2, linestyle=':', label='Investimento inicial')
plt.ylabel('Valor (R\$)')
plt.title('Valor investido no portifólio')
plt.xlabel('Data')
plt.legend()
plt.show()
_images/422deef20eead7b3f56a85ebf0b742e0344bf885e6edb46a8faff8a9c6b33fa3.png

Retornos diários#

A cada dia, há uma variação percentual do nosso valor investido. Se essa variação oscila muito, então temos que ter mais “sangue frio” para manter nosso investimento. Gostaríamos que não houvesse muita variação no retorno diário.

ret1 = data1['Valor investido'].pct_change()
ret2 = data2['Valor investido'].pct_change()
retp = datap['Valor investido'].pct_change()

plt.figure()
plt.plot(ret1, label=acao1)
plt.plot(ret2, label=acao2)
plt.plot(retp, label='Portifólio')
plt.ylabel('Variação diária (%)')
plt.title('Retornos diários por tipo de investimento')
plt.xlabel('Data')
plt.legend()
plt.show()
_images/fc7579c3e6641b3e43afae9e1bbb5b0a9e5352cb8b5205e2fb9dc47ee8047dae.png

Correlações#

Podemos calcular as correlações entre os retornos diários das nossas ações individuais. Veja como a correlação entre a VVEO3.SA e a VALE3.SA é bem pequena:

df = pd.DataFrame()
df[acao1] = ret1
df[acao2] = ret2
df.corr()
VVEO3.SA VALE3.SA
VVEO3.SA 1.000000 0.174576
VALE3.SA 0.174576 1.000000

Índice Sharpee#

Podemos calcular o retorno de cada uma das ações e também o retorno do portifólio ao longo de todo o período. Também, podemos calcular o desvio padrão do retorno diário. Dividindo um pelo outro, temos o índice sharpee.

Veja que o retorno do portifólio está em algum lugar entre os retornos das ações individuais. Porém, o desvio padrão do portifólio é menor. Isso faz o índice Sharpee do portifólio ficar bem maior!

# Retornos totais ao longo de todo o período
ret_total1 = (data1.iloc[-1]['Valor investido']/data1.iloc[0]['Valor investido'] - 1)
ret_total2 = (data2.iloc[-1]['Valor investido']/data2.iloc[0]['Valor investido'] - 1)
ret_totalp = (datap.iloc[-1]['Valor investido']/datap.iloc[0]['Valor investido'] - 1)

# Desvios padrões diários
sigma1 = ret1.std()
sigma2 = ret2.std()
sigmap = retp.std()

# Índice sharpee
sharpe1 = ret_total1/sigma1
sharpe2 = ret_total2/sigma2
sharpep = ret_totalp/sigmap

print(ret_total1, ret_total2, ret_totalp)
print(sigma1, sigma2, sigmap)
print(sharpe1, sharpe2, sharpep)
-0.6031506919504572 -0.13472336909884497 -0.3689370305246511
0.026527538527235512 0.016334718429963955 0.015754154332936945
-22.736775646606244 -8.247670119107298 -23.418396362495997

Anotações importantes#

Nem todas as combinações de ações no portifólio levam à diminuição do índice Sharpee. Experimente, por exemplo, usar PETR4.SA e VALE3.SA. Veja o que acontece com a correlação entre os ganhos diários e com o índice Sharpee.