Spaces:
Runtime error
Runtime error
import streamlit as st | |
import pandas as pd | |
import yfinance as yf | |
from babel.numbers import format_currency | |
chart_data = pd.DataFrame([[]]) | |
text = '' | |
ativos = [ | |
'BBAS3', | |
'PETR4', | |
'MGLU3', | |
'IRBR3', | |
'BBSE3', | |
'B3SA3', | |
'BOVA11', | |
'BBDC4', | |
'ITUB4', | |
'TRPL4', | |
'SAPR4', | |
'TAEE11', | |
'VIVT3', | |
] | |
ativos.sort() | |
option = st.selectbox( | |
'Selecione um ativo:', ativos) | |
start_date = st.date_input('Selecione a data da primeira compra:') | |
taxa_renda_fixa = st.number_input("Taxa mensal de renda fixa:") | |
patrimonio_renda_fixa = '' | |
patrimonio_variavel = '' | |
invested = '' | |
period_time=0 | |
def simulate(): | |
global chart_data, patrimonio_renda_fixa,patrimonio_variavel, invested, period_time | |
ticker=yf.download(f'{option}.SA', start=str(start_date), actions=True) | |
actions = ticker[(ticker.Dividends!=0) | (ticker['Stock Splits'] !=0)] | |
new_index = pd.date_range(start=ticker.index[0], end=ticker.index[-1], freq='MS') | |
first_monday = pd.offsets.WeekOfMonth(week=0, weekday=0) # 0 is Monday | |
first_monday_index = new_index + first_monday | |
first_monday_index_set = [] | |
for date in set(first_monday_index.values): | |
first_monday_index_set.append(str(date).split('T')[0]) | |
final_index = first_monday_index.union(actions.index) | |
df = ticker.reindex(final_index) | |
df=df.dropna() | |
df['BUY'] = df.apply(lambda row: str(row.name).split(' ')[0] in first_monday_index_set , axis=1) | |
wallet_variavel = {"stocks": 0, "money": 0, "invested": 1000} | |
wallet_fixo = {"stocks": 0, "money": 0, "invested": 1000} | |
for _, row in df.iterrows(): | |
div = 0 | |
if row.Dividends != 0: | |
div = wallet_variavel['stocks']*row.Dividends | |
if row['Stock Splits'] != 0: | |
wallet_variavel['stocks'] *= row['Stock Splits'] | |
if row.BUY: | |
period_time += 1 | |
wallet_variavel['invested'] += 1000 | |
wallet_variavel['stocks'] += int(wallet_variavel['money']/row.Open) | |
wallet_variavel['money'] = 1000 + int(wallet_variavel['money']%row.Open) | |
wallet_fixo['money'] = 1000 + int(wallet_fixo['money']*(1.0+(taxa_renda_fixa/100))) | |
wallet_fixo['invested'] += 1000 | |
wallet_variavel['money'] += div | |
patrimonio_variavel_val = format_currency(ticker.iloc[-1].Close * wallet_variavel["stocks"], 'BRL', locale='pt_BR') | |
patrimonio_variavel = f'Você teria acumulado um total de {patrimonio_variavel_val}. Tendo acumulado {wallet_variavel["stocks"]} ações de {option}.' | |
patrimonio_renda_fixa_val = format_currency(wallet_fixo["money"], 'BRL', locale='pt_BR') | |
patrimonio_renda_fixa = f'Você teria acumulado um total de {patrimonio_renda_fixa_val} investindo em renda fixa com uma taxa de {taxa_renda_fixa} ao mês.' | |
invested_val = format_currency(wallet_fixo['invested'], 'BRL', locale='pt_BR') | |
invested = invested_val | |
chart_data = ticker[['Open']] | |
clicked = st.button('Simular') | |
if clicked: | |
simulate() | |
st.markdown(f"##### * Você teria investido um total de {invested}") | |
st.markdown(f"##### * O prazo selecionado foi de {period_time} mes(es).") | |
st.markdown(f"##### * O investimento esta sendo feito na primeira segunda feira de cada mês.") | |
st.markdown(f"##### * A cada mes é feito um aporte de R$ 1000,00.") | |
st.markdown(f"##### * Os dividendos recebidos são sempre aportados no mes seguinte.") | |
st.markdown(f"##### * A taxa média do CDI desde 2000 no Brasil foi de 0.9494 ao mês.") | |
st.markdown(f"##### * A taxa média do IGPM desde 2000 no Brasil foi de 0.68122 ao mês.") | |
st.markdown(f"##### * A taxa média do IPCA desde 2000 no Brasil foi de 0.5124 ao mês.") | |
left_column, right_column = st.columns(2) | |
with right_column: | |
st.markdown("### Patrimonio em renda fixa com os mesmos aportes:") | |
st.markdown('**'+patrimonio_renda_fixa+'**') | |
with left_column: | |
st.markdown("### Patrimonio comprando o ativo:") | |
st.markdown("##### Gráfico de variação do preço da ação no período:") | |
line_chart = st.line_chart(chart_data) | |
st.markdown('**'+patrimonio_variavel+'**') | |