A utilização de linguagens de programação tem permitido o uso mais frequente de cálculos complexos para o mundo das finanças, de forma simples e rápida. O Python é uma dessas linguagens, e tem encabeçado essa mudança do mundo quantitativo. No post de hoje, mostraremos o poder do Python ao realizar o cálculo da relação de risco e retorno de uma carteira de ações teóricas, bem como realizar a simulação de 200 carteiras com pesos diferentes, obtendo um gráfico de conjunto de oportunidades.
A partir de três métricas, sendo elas a média, a variância, além de uma matriz de covariância, construiremos as possíveis combinações da relação de risco x retorno de uma carteira dos ativos contendo três ações. O método aqui utilizado é bastante conhecido, sendo parte da Teoria de Carteiras. Esse método é útil para buscarmos o melhor cenário de combinações de pesos que entregam valores de retornos e risco que o investidor deseje.
Vamos seguir para o nosso código.
# Importa as bibliotecas import numpy as np import pandas as pd import matplotlib.pyplot as plt import pandas_datareader.data as web import seaborn as sns !pip install yfinance --upgrade --no-cache-dir import yfinance as yf yf.pdr_override()
# Importa os preços de fechamento prices = web.get_data_yahoo(['ITUB4.SA', 'B3SA3.SA', 'VALE3.SA'], start = '2013-01-01')['Close'] # Retira dados faltantes prices = prices.dropna() # Plota os preços de fechamento sns.set() prices.plot(subplots = True, figsize = (22, 8))
Escolhemos três ativos sem critério algum, com dados diários desde 2013 até o dia atual (14/03/2022). Visualizamos o preço de fechamento de cada ativo acima. Como vemos, os preço são similares a um passeio aleatório, portanto, não seria interessante trabalharmos com eles. Por isso, devemos realizar uma transformação, utilizando os retornos dos preços, que na prática, é uma transformação através de uma diferenciação.
Após a transformação para retornos diários, realizamos mais dois cálculos: a média dos retornos, que será aqui utilizada como o retorno esperado de cada ativo, e a matriz de covariância dos retornos, para entender a associação linear entre os ativos e entender o ponto de diversificação entre eles.
# Tamanho das colunas (número de ativos) n = len(prices.columns) # Calcula os retornos returns = prices/prices.shift(1)-1 # Retira os dados faltantes returns = returns.dropna() # Calcula a média (retorno esperado) mi = returns.mean() # Calcula a covariância sigma = returns.cov()
# Define os pesos aleatórios para os ativos w = np.array([0.4, 0.2, 0.3]) # Calcula o retono esperado da carteira retorno = np.sum(w*mi) # Calcula os desvio padrão (risco) da carteira risco = np.sqrt(np.dot(w.T, np.dot(sigma, w)))
Para criarmos o conjunto de oportunidades, isto é, as diversas carteiras teóricas que podem ser obtidas pela combinação de n pesos dos ativos, criamos um for loop com 200 simulações.
# Cria listas vazias vet_R = [] vet_Vol = [] # Realiza a simulação de 200 carteiras com pesos diferentes for i in range(200): # --------------- pesos dos ativos ---------------- # w = np.random.random(n) w = w/np.sum(w) # ---------------- Retorno e Risco ---------------- # retorno = np.sum(w*mi) risco = np.sqrt(np.dot(w.T, np.dot(sigma, w)))< # ------------------------------------------------- # vet_R.append(retorno) vet_Vol.append(risco) # Plota sns.set() plt.figure(figsize=(20, 8)) plt.plot(vet_Vol, vet_R, 'ok') plt.ylabel('Retorno Esperado') plt.xlabel('Volatilidade Esperada (Risco)') plt.title('Relação Risco x Retorno da carteira')