Construindo um Dashboard de Análise de Ações do Zero: Guia Passo a Passo

Se você está buscando uma maneira eficaz de analisar o desempenho de diversas empresas no mercado de ações, você veio ao lugar certo. Neste tutorial, vamos aprender a construir um dashboard completo que permite comparar o desempenho e o risco-retorno de várias empresas de forma visual e intuitiva.

Vídeo no Youtube

Configurações Iniciais

Para começar, vamos configurar o ambiente de desenvolvimento e preparar nosso repositório. Certifique-se de ter todas as bibliotecas necessárias instaladas, como pandas, numpy, plotly, entre outras.

import streamlit as st
import pandas as pd
import numpy as np
import yfinance as yf
import plotly.express as px
from datetime import datetime
from streamlit_extras.metric_cards import style_metric_cards
from streamlit_extras.grid import grid

Criando o Menu Lateral

Nosso dashboard terá um menu lateral que permitirá selecionar as empresas que desejamos analisar. Vamos definir as opções disponíveis e preparar a interface para exibir essas escolhas.

def build_sidebar():
    st.image("images/logo-250-100-transparente.png")
    ticker_list = pd.read_csv("tickers_ibra.csv", index_col=0)
    tickers = st.multiselect(label="Selecione as Empresas", options=ticker_list, placeholder='Códigos')
    tickers = [t+".SA" for t in tickers]
    start_date = st.date_input("De", format="DD/MM/YYYY", value=datetime(2023,1,2))
    end_date = st.date_input("Até", format="DD/MM/YYYY", value="today")

    if tickers:
        prices = yf.download(tickers, start=start_date, end=end_date)["Adj Close"]
        if len(tickers) == 1:
            prices = prices.to_frame()
            prices.columns = [tickers[0].rstrip(".SA")]
                    
        prices.columns = prices.columns.str.rstrip(".SA")
        prices['IBOV'] = yf.download("^BVSP", start=start_date, end=end_date)["Adj Close"]
        return tickers, prices
    return None, None

Criando o Corpo do Dashboard

A parte principal do nosso dashboard será composta por gráficos que mostram o desempenho e o risco-retorno das empresas selecionadas. Vamos criar visualizações interativas que permitem uma análise detalhada dos dados.

def build_main(tickers, prices):
    weights = np.ones(len(tickers))/len(tickers)
    prices['portfolio'] = prices.drop("IBOV", axis=1) @ weights
    norm_prices = 100 * prices / prices.iloc[0]
    returns = prices.pct_change()[1:]
    vols = returns.std()*np.sqrt(252)
    rets = (norm_prices.iloc[-1] - 100) / 100

    mygrid = grid(5 ,5 ,5 ,5 ,5 , 5, vertical_align="top")
    for t in prices.columns:
        c = mygrid.container(border=True)
        c.subheader(t, divider="red")
        colA, colB, colC = c.columns(3)
        if t == "portfolio":
            colA.image("images/pie-chart-dollar-svgrepo-com.svg")
        elif t == "IBOV":
            colA.image("images/pie-chart-svgrepo-com.svg")
        else:
            colA.image(f'https://raw.githubusercontent.com/thefintz/icones-b3/main/icones/{t}.png', width=85)
        colB.metric(label="retorno", value=f"{rets[t]:.0%}")
        colC.metric(label="volatilidade", value=f"{vols[t]:.0%}")
        style_metric_cards(background_color='rgba(255,255,255,0)')

    col1, col2 = st.columns(2, gap='large')
    with col1:
        st.subheader("Desempenho Relativo")
        st.line_chart(norm_prices, height=600)

    with col2:
        st.subheader("Risco-Retorno")
        fig = px.scatter(
            x=vols,
            y=rets,
            text=vols.index,
            color=rets/vols,
            color_continuous_scale=px.colors.sequential.Bluered_r
        )
        fig.update_traces(
            textfont_color='white', 
            marker=dict(size=45),
            textfont_size=10,                  
        )
        fig.layout.yaxis.title = 'Retorno Total'
        fig.layout.xaxis.title = 'Volatilidade (anualizada)'
        fig.layout.height = 600
        fig.layout.xaxis.tickformat = ".0%"
        fig.layout.yaxis.tickformat = ".0%"        
        fig.layout.coloraxis.colorbar.title = 'Sharpe'
        st.plotly_chart(fig, use_container_width=True)

Configurando a Página

Finalmente, vamos configurar a página e chamar as funções build_sidebar() e build_main()

st.set_page_config(layout="wide")

with st.sidebar:
    tickers, prices = build_sidebar()

st.title('Python para Investidores')
if tickers:
    build_main(tickers, prices)

Salvando as Alterações no GitHub

Após concluir a construção do dashboard, vamos salvar nossas alterações no GitHub para facilitar o compartilhamento e a colaboração com outros usuários.

Fazendo o Deploy do Dashboard no Streamlit.io

Por fim, vamos implantar nosso dashboard na nuvem usando o Streamlit.io. Isso nos permitirá acessar e compartilhar nossa análise de ações de qualquer lugar, a qualquer momento.

Com este tutorial, você estará pronto para construir seu próprio dashboard de análise de ações do zero, permitindo uma análise eficiente e visualmente atraente do mercado financeiro. Aproveite e comece a explorar as possibilidades que essa ferramenta oferece para tomar decisões informadas e estratégicas nos seus investimentos.

Código-fonte completo

Github