from multiprocessing import Value import matplotlib matplotlib.use('Agg') import streamlit as st from yahooquery import Ticker import pandas as pd import numpy as np import plotly.graph_objects as go import datetime as dt from collections import OrderedDict import style as style import scrap as scraping def flatten(d): ''' Flatten an OrderedDict object ''' result = OrderedDict() for k, v in d.items(): if isinstance(v, dict): result.update(flatten(v)) else: result[k] = v return result def comparacao_ativos(): #código para ativar bootstrap css st.markdown( """ """,unsafe_allow_html=True ) col1, col2,col3 = st.columns([0.1,0.4,0.1]) with col2: st.title('Comparação de ativos') st.subheader('Escolha 4 ativos para comparar') codigo_nome = pd.read_excel('data/classification_b3.xlsx') nome_do_ativo1 = st.selectbox('Nome do 1º ativo', (codigo_nome['Código']),key=1 ) nome_do_ativo2 = st.selectbox('Nome do 2º ativo', (codigo_nome['Código']),key=2) nome_do_ativo3 = st.selectbox('Nome do 3º ativo', (codigo_nome['Código']),key=3 ) nome_do_ativo4 = st.selectbox('Nome do 4º ativo', (codigo_nome['Código']),key=4 ) style.space(1) if nome_do_ativo4 != "": st.subheader('Analisando os dados') nome_do_ativo1 = str(nome_do_ativo1 + '.SA').upper() nome_do_ativo2 = str(nome_do_ativo2 + '.SA').upper() nome_do_ativo3 = str(nome_do_ativo3 + '.SA').upper() nome_do_ativo4 = str(nome_do_ativo4 + '.SA').upper() df = Ticker([nome_do_ativo1,nome_do_ativo2,nome_do_ativo3,nome_do_ativo4],country='Brazil') time = df.history( start='2020-01-01', end = (dt.datetime.today() + dt.timedelta(days=1)).strftime(format='20%y-%m-%d')) lista = scraping.get_data() todos = pd.DataFrame(flatten(lista).keys()).transpose() todos.columns = todos.iloc[0] for i in range(len(lista)): todos = pd.concat([todos,pd.DataFrame(lista[i]).transpose()]) todos = todos.iloc[1:] todos['P/L'] = todos['P/L'].str.replace('.','') todos['DY'] = todos['DY'].str.replace('%','') todos['Liq.2m.'] = todos['Liq.2m.'].str.replace('.','') todos['Pat.Liq'] = todos['Pat.Liq'].str.replace('.','') todos = todos.replace(',','.', regex=True) todos = todos.apply(pd.to_numeric,errors='ignore').round(2) todos.rename(columns={'cotacao': 'Cotação'}, inplace=True) comparar = todos.loc[todos.index.isin([nome_do_ativo1[:5],nome_do_ativo2[:5],nome_do_ativo3[:5],nome_do_ativo4[:5]])] st.dataframe(comparar) # st.dataframe(comparar.style.format({"Cotação": "{:.2f}", "P/L": "{:.2f}", "P/VP": "{:.2f}", "P/Ativo": "{:.2f}" # , "P/EBIT": "{:.2f}", "P/Ativ.Circ.Liq.": "{:.2f}", "EBITDA": "{:.2f}", "Liq.Corr.": "{:.2f}", "Liq.2m.": "{:.2f}" # , "Pat.Liq": "{:.2f}", "Div.Brut/Pat.": "{:.2f}" # })) # ------------------------------ INÍCIO Comparação DY --------------- col1, col2 = st.columns([0.5,0.5]) with col1: layout = go.Layout(title="DY",xaxis=dict(title="Ativo"), yaxis=dict(title="DY %")) fig = go.Figure(layout = layout) fig.add_trace(go.Bar(x=comparar.sort_values('DY',ascending=True).index, y=comparar.sort_values('DY',ascending=True)['DY'] )) fig.update_layout( height=500, showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') st.plotly_chart(fig,use_container_width=True) # ------------------------------ INÍCIO Comparação P/L --------------- with col2: layout = go.Layout(title="P/L",xaxis=dict(title="Ativo"), yaxis=dict(title="P/L")) fig = go.Figure(layout = layout) fig.add_trace(go.Bar(x=comparar.sort_values('P/L',ascending=True).index, y=comparar.sort_values('P/L',ascending=True)['P/L'] )) fig.update_layout( height=500, showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') st.plotly_chart(fig,use_container_width=True) # ------------------------------ INÍCIO Comparação P/V--------------- with col1: layout = go.Layout(title="P/VP",xaxis=dict(title="Ativo"), yaxis=dict(title="P/VP")) fig = go.Figure(layout = layout) fig.add_trace(go.Bar(x=comparar.sort_values('P/VP',ascending=True).index, y=comparar.sort_values('P/VP',ascending=True)['P/VP'] )) fig.update_layout( height=500, showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') st.plotly_chart(fig,use_container_width=True) # ------------------------------ INÍCIO Comparação P/L * P/VP--------------- with col2: layout = go.Layout(title="P/L X P/VP",xaxis=dict(title="Ativo"), yaxis=dict(title="P/L X P/VP")) fig = go.Figure(layout = layout) fig.add_trace(go.Bar(x=comparar.index, y=comparar['P/L'] * comparar['P/VP'] )) fig.update_layout( height=500, showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') st.plotly_chart(fig,use_container_width=True) # ------------------------------ GRÁFICOS DE retorno acumulado---------------------------- periodo_inicio = int(st.number_input(label='periodo retorno acumulado',value=360)) ret = time.reset_index() layout = go.Layout(title="Retorno acumulado",xaxis=dict(title="Data"), yaxis=dict(title="Retorno")) fig = go.Figure(layout = layout) for i in range(len(ret['symbol'].unique())): fig.add_trace(go.Scatter(x=ret.loc[ret['symbol']==ret['symbol'].unique()[i]][-periodo_inicio:]['date'], y=ret.loc[ret['symbol']==ret['symbol'].unique()[i]][-periodo_inicio:]['close'].pct_change().cumsum(),mode='lines',name=ret.reset_index()['symbol'].unique()[i])) fig.update_layout( height=500, showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') st.plotly_chart(fig,use_container_width=True) # ------------------------------ GRÁFICOS DE MÉDIAS MÓVEIS 50---------------------------- rolling_50 = time['close'].rolling(window=50) rolling_mean_50 = rolling_50.mean() rolling_mean_50 = pd.DataFrame(rolling_mean_50.reset_index()) # mm50 = time.reset_index() layout = go.Layout(title="MÉDIAS MÓVEIS 50",xaxis=dict(title="Data"), yaxis=dict(title="Preço R$")) fig = go.Figure(layout = layout) for i in range(len(rolling_mean_50['symbol'].unique())): fig.add_trace(go.Scatter(x=rolling_mean_50.loc[rolling_mean_50['symbol']==rolling_mean_50['symbol'].unique()[i]]['date'], y=rolling_mean_50.loc[rolling_mean_50['symbol']==rolling_mean_50['symbol'].unique()[i]]['close'],mode='lines',name=time.reset_index()['symbol'].unique()[i])) fig.update_layout( height=500, showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') st.plotly_chart(fig,use_container_width=True) # ------------------------------ GRÁFICOS DE MÉDIAS MÓVEIS 20---------------------------- rolling_50 = time['close'].rolling(window=20) rolling_mean_50 = rolling_50.mean() rolling_mean_50 = pd.DataFrame(rolling_mean_50.reset_index()) # mm50 = time.reset_index() layout = go.Layout(title="MÉDIAS MÓVEIS 20",xaxis=dict(title="Data"), yaxis=dict(title="Preço R$")) fig = go.Figure(layout = layout) for i in range(len(rolling_mean_50['symbol'].unique())): fig.add_trace(go.Scatter(x=rolling_mean_50.loc[rolling_mean_50['symbol']==rolling_mean_50['symbol'].unique()[i]]['date'], y=rolling_mean_50.loc[rolling_mean_50['symbol']==rolling_mean_50['symbol'].unique()[i]]['close'],mode='lines',name=time.reset_index()['symbol'].unique()[i])) fig.update_layout( height=500, showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') st.plotly_chart(fig,use_container_width=True) # ------------------------------ GRÁFICOS DE volatilidade--------------------------- col1, col2 = st.columns([0.5,0.5]) with col1: TRADING_DAYS = 360 returns = np.log(time['close']/time['close'].shift(1)) returns.fillna(0, inplace=True) volatility = returns.rolling(window=TRADING_DAYS).std()*np.sqrt(TRADING_DAYS) vol = pd.DataFrame(volatility).reset_index() vol = vol.dropna() layout = go.Layout(title=f"Volatilidade",xaxis=dict(title="Data"), yaxis=dict(title="Volatilidade")) fig = go.Figure(layout = layout) for i in range(len(vol['symbol'].unique())): fig.add_trace(go.Scatter(x=vol.loc[vol['symbol']==vol['symbol'].unique()[i]]['date'], y=vol.loc[vol['symbol']==vol['symbol'].unique()[i]]['close'],name=vol['symbol'].unique()[i] )) fig.update_layout( height=500, showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') st.plotly_chart(fig,use_container_width=True) # ------------------------------ GRÁFICOS DE sharpe_ratio--------------------------- with col2: sharpe_ratio = returns.mean()/volatility sharpe = pd.DataFrame(sharpe_ratio).reset_index() sharpe = sharpe.dropna() layout = go.Layout(title=f"SHARP (Risco / Volatilidade)",xaxis=dict(title="Data"), yaxis=dict(title="Sharp")) fig = go.Figure(layout = layout) for i in range(len(sharpe['symbol'].unique())): fig.add_trace(go.Scatter(x=sharpe.loc[sharpe['symbol']==sharpe['symbol'].unique()[i]]['date'], y=sharpe.loc[sharpe['symbol']==sharpe['symbol'].unique()[i]]['close'],name=sharpe['symbol'].unique()[i] )) fig.update_layout( height=500, showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') st.plotly_chart(fig,use_container_width=True) # ------------------------------ GRÁFICOS DE correlação-------------------------- try: time = time.reset_index() time = time[['symbol','date','close']] df_1 = time.loc[time['symbol'] == time['symbol'].unique()[0]] df_1 = df_1.set_index('date') df_1.columns = df_1.columns.values + '-' + df_1.symbol.unique() df_1.drop(df_1.columns[0],axis=1,inplace=True) df_2 = time.loc[time['symbol'] == time['symbol'].unique()[1]] df_2 = df_2.set_index('date') df_2.columns = df_2.columns.values + '-' + df_2.symbol.unique() df_2.drop(df_2.columns[0],axis=1,inplace=True) df_3 = time.loc[time['symbol'] == time['symbol'].unique()[2]] df_3 = df_3.set_index('date') df_3.columns = df_3.columns.values + '-' + df_3.symbol.unique() df_3.drop(df_3.columns[0],axis=1,inplace=True) df_4 = time.loc[time['symbol'] == time['symbol'].unique()[3]] df_4 = df_4.set_index('date') df_4.columns = df_4.columns.values + '-' + df_4.symbol.unique() df_4.drop(df_4.columns[0],axis=1,inplace=True) merged = pd.merge(pd.merge(pd.merge(df_1,df_2,left_on=df_1.index,right_on=df_2.index,how='left'),df_3,left_on='key_0',right_on=df_3.index,how='left'),df_4,left_on='key_0',right_on=df_4.index,how='left').rename({'key_0':'date'},axis=1).set_index('date') retscomp = merged.pct_change() #plt.figure(figsize=(10,8)) #sns.heatmap(retscomp.corr(),annot=True) #st.set_option('deprecation.showPyplotGlobalUse', False) #st.pyplot() import plotly.express as px df = px.data.medals_wide(indexed=True) fig = px.imshow(retscomp.corr(),color_continuous_scale='YlOrRd',labels=dict(x="Correlação")) #fig.update_layout(autosize=False,width=1200,height=800, paper_bgcolor='rgba(0,0,0,0)', plot_bgcolor='rgba(0,0,0,0)') fig.update_layout( height=500, showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') fig.update_xaxes(side="top") st.plotly_chart(fig,use_container_width=True) except: exit # ------------------------------ GRÁFICOS DE mapa de risco-------------------------- map = returns.reset_index() layout = go.Layout(title=f"Mapa de Risco x Retorno",xaxis=dict(title="Retorno esperado"), yaxis=dict(title="Risco")) fig = go.Figure(layout = layout) for i in range(len(map['symbol'].unique())): fig.add_trace(go.Scatter(x=[map.loc[map['symbol']==map['symbol'].unique()[i]]['close'].mean() * 100], y=[map.loc[map['symbol']==map['symbol'].unique()[i]]['close'].std() * 100],name=map['symbol'].unique()[i],marker=dict(size=30))) #fig.add_trace(go.Scatter(x=[map['close'].mean()], y=[map['close'].std()],text=map['symbol'].unique())) fig.update_xaxes(zeroline=True, zerolinewidth=2, zerolinecolor='Red')#, range=[-0.005, 0.01]) fig.update_yaxes(zeroline=True, zerolinewidth=2, zerolinecolor='Red')#, range=[-0.01, 0.1]) fig.update_traces(textposition='top center') #fig.update_layout(autosize=False,width=800,height=600, paper_bgcolor='rgba(0,0,0,0)', plot_bgcolor='rgba(0,0,0,0)') fig.update_layout( height=500, showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') st.plotly_chart(fig,use_container_width=True)