<jupyter_start><jupyter_text>Cálculo de Rentabilidade de Carteira de Ações - Cotização - Python para Investimentos  Configurações Iniciais<jupyter_code>!pip -q install yfinance
import yfinance as yf
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')
import matplotlib
matplotlib.rcParams['figure.figsize'] = (18,8)
matplotlib.style.use('seaborn-darkgrid')<jupyter_output><empty_output><jupyter_text>Fazendo o upload do arquivo trades.xlsx<jupyter_code>from google.colab import files

uploaded = files.upload()

for fn in uploaded.keys():
  print('User uploaded file "{name}" with length {length} bytes'.format(
      name=fn, length=len(uploaded[fn])))
arquivo = pd.read_excel('trades.xlsx')
arquivo<jupyter_output><empty_output><jupyter_text>Criando tabelas com os dados do arquivo  Criando tabela com colunas para cada ativo e indexando por data<jupyter_code>trade_quant = pd.pivot_table(arquivo, values='quantidade', index=['data'], columns=arquivo['ativo'].str.upper(), aggfunc=np.sum, fill_value=0)
trade_quant<jupyter_output><empty_output><jupyter_text>Criando tabela com os preços de compra e venda<jupyter_code>trade_price = pd.pivot_table(arquivo, values='preço', index=['data'], columns=arquivo['ativo'].str.upper(), fill_value=0)
trade_price<jupyter_output><empty_output><jupyter_text>Baixando os cotações das ações<jupyter_code>prices = yf.download(tickers=(trade_quant.columns+'.SA').to_list(), start=trade_quant.index[0], rounding=True)['Adj Close']
prices.columns  = prices.columns.str.rstrip('.SA')
prices.dropna(how='all', inplace=True)
prices
trades = trade_quant.reindex(index=prices.index)
trades.fillna(value=0, inplace=True)
trades
aportes = (trades * trade_price).sum(axis=1)
aportes

posicao = trades.cumsum()
posicao
carteira = posicao * prices
carteira['saldo'] = carteira.sum(axis=1)
carteira
for i, data in enumerate(aportes.index):
  if i == 0:
    carteira.at[data, 'vl_cota'] = 1
    carteira.at[data, 'qtd_cotas'] = carteira.loc[data]['saldo'].copy()
  
  else:
    if aportes[data] != 0:
      carteira.at[data, 'qtd_cotas'] =  carteira.iloc[i-1]['qtd_cotas'] + (aportes[data] / carteira.iloc[i-1]['vl_cota'])
      carteira.at[data, 'vl_cota']   =  carteira.iloc[i]['saldo'] / carteira.at[data, 'qtd_cotas']
      carteira.at[data, 'retorno']   = (carteira.iloc[i]['vl_cota'] / carteira.iloc[i-1]['vl_cota']) -1 
    else:
      carteira.at[data, 'qtd_cotas'] = carteira.iloc[i-1]['qtd_cotas']
      carteira.at[data, 'vl_cota']   = carteira.iloc[i]['saldo'] / carteira.at[data, 'qtd_cotas']
      carteira.at[data, 'retorno']   = (carteira.iloc[i]['vl_cota'] / carteira.iloc[i-1]['vl_cota']) -1 

carteira.head(50)
carteira['vl_cota'].plot();<jupyter_output><empty_output>
StarcoderdataJupyterStructuredCleanDedup