O Dashboard Financeiro Inteligente é um projeto desenvolvido por Lucas Valoz Castellucci com a finalidade de unir Ciência de Dados e Engenharia de Software para oferecer um Dashboard interativo dos principais ativos financeiros da B3, com possibilidade de análise quantitativa, via análise de médias móveis exponenciais, variação percentual, avaliação de risco e retorno por investimento, e qualitativa, via integração com o Grande Modelo de Língua (LLM): Google Gemini.
O Dashboard Financeiro Inteligente foi concebido sob os preceitos que unem, em sua arquitetura de software, a separação estrita de responsabilidades (Separation of Concerns), isolando a camada de apresentação (SPA React), a camada de roteamento HTTP (FastAPI) e os motores de processamento analítico (Polars e Scikit-Learn).
A filosofia central do projeto baseia-se em Resiliência e Desempenho:
-
Processamento Assíncrono (Async I/O): Toda a comunicação de rede (ingestão do Yahoo Finance, consultas ao PostgreSQL, chamadas à API do Gemini) é estritamente não-bloqueante, garantindo que o Event Loop do servidor nunca congele durante requisições pesadas.
-
Vetorização de Dados: O processamento de séries temporais abandona iteradores e a biblioteca Pandas em favor do Polars, utilizando execução multithreaded em Rust para agregações e cálculos complexos em milissegundos.
-
Degradação Suave (Graceful Degradation) e Exponential Backoff: Microsserviços dependentes de cotas externas (como APIs de LLMs) implementam lógicas de recuo exponencial e fallback (como web scraping nativo) para garantir que o sistema central continue operando mesmo sob falhas ou Rate Limits de provedores terceiros.
- Linguagem: Python 3.12
- Framework Web: FastAPI (ASGI)
- Motor de Dados: Polars (Manipulação de DataFrames de alta performance com multithread)
- Machine Learning: Scikit-Learn (K-Means Clustering, Silhouette Score)
- ORM e Banco de Dados: SQLAlchemy 2.0 (Assíncrono com Asyncpg) integrado ao PostgreSQL.
- Integração de IA: Google GenAI SDK (Gemini 3.5 Flash) com injeção de contexto via RSS web scraping.
- Agendador de Tarefas: APScheduler (Cron jobs assíncronos).
- Requisições HTTP: httpx (Cliente assíncrono).
- Linguagem: TypeScript (com muito auxílio do Gemini para compensar a falta de conhecimento de frontend do autor)
- Framework: React 19 executado sobre o bundler Vite.
- Estilização: Tailwind CSS v4.
- Gerenciamento de Estado de Servidor: TanStack React Query v5 (Cache dinâmico e revalidação de dados).
- Visualização de Dados: * Recharts (Séries Temporais).
- Nivo (Scatterplot e Boxplot com injeção de SVGs matemáticos customizados).
- Renderização de Texto: React-Markdown com suporte a tipografia matemática via KaTeX (
rehype-katex,remark-math).
- PostgreSQL 17 (containerizado em Alpine Linux)
- Containerização: Docker e Docker Compose.
- Servidor Web / Proxy Reverso: Nginx.
Responsável por toda a lógica de negócios, acesso a dados e roteamento.
dashboard.py: Router principal do sistema. Expõe os endpoints consumidos pelo frontend. Orquestra a injeção de dependências e delega o processamento pesado aos serviços competentes, garantindo que a camada HTTP permaneça limpa e focada em I/O. Herda dependências do FastAPI demain.py
-
database.py: Instanciação da Engine assíncrona do SQLAlchemy e configuração da fábrica de sessões (AsyncSessionLocal). Acessos ao banco de dados devem importar esse objeto e usá-lo com:async with -
logger.py: Configuração unificada do log do sistema, padronizando a saída (stdout) para facilidade de auditoria e monitoramento em containers. -
repository.py: Padrão de repositório (Repository Pattern) que abstrai as queries SQL brutas, permitindo operações CRUD no banco de dados de forma desacoplada da Lógica de negócios. Possui o métodofetch_as_polars, que padroniza a forma de manipular e disponibilizar os dados da query para o endpoint.
market.py: Modelos declarativos do SQLAlchemy. Define o esquema rigoroso das tabelas do banco de dados relacional (PostgreSQL), mapeando tipos SQL para tipos Python.
market.py: Contratos de validação do Pydantic. Assegura que todos os dados que entram (requisições) e saem (respostas JSON) da API estejam rigorosamente tipados, prevenindo erros em tempo de execução.
A camada mais densa do sistema, contendo as regras de negócio e a matemática.
-
analytics.py: Motor de agregações. Converte registros do banco paraPolars DataFrame, trata dados ausentes (drop_nulls) e calcula métricas como log-retorno, volatilidade estatística e Média Móvel Exponencial (EMA). -
db_upsert.py: Lógica de persistência. Gerencia o comandoINSERT ON CONFLICT DO UPDATE(Upsert), garantindo que a ingestão de preços intradiários não crie duplicatas de chave primária (timestamp + ticker). -
fetch_yahoo.py: Cliente de extração de dados brutos. Conecta-se à API V8 (Chart) do Yahoo Finance utilizando chamadas HTTP assíncronas e estruturando os retornos JSON em listas de dicionários padronizadas, considerando as idiossincrasias do Call de Fechamento da B3. -
llm.py: Conexão com o Grande Modelo de Língua (LLM) que vai gerar a análise qualitativa. Contém a classeAnalistaQualitativo. Emprega engenharia de prompts estritos. Implementa captura de notícias em tempo real via RSS (evitando bloqueios do Google Grounding) e gerencia Rate Limits através de algoritmos de Exponential Backoff. -
macro_eco.py: Serviço de comunicação com APIs governamentais (como o Banco Central do Brasil) para extração da meta da Taxa Selic e do IPCA acumulado (12 meses). -
ml.py: Algoritmos de Machine Learning não-supervisionado. Aplica Padronização (StandardScaler) aos dados de risco-retorno e executa o algoritmo K-Means dinamicamente. Calcula o Silhouette Score para aferir a qualidade da separação topológica dos clusters. Adicionalmente constrói a Matriz de Correlação de Pearson da carteira. -
scheduler.py: Motor de rotinas autônomas. Configura a arquitetura Cron do APScheduler para disparar ofetch_yahoo.pya cada 15 minutos, respeitando o fuso horário da B3 e aplicando o padrão Semaphore (limitação de concorrência) para evitar bloqueio de IP.
-
main.py: O ponto de entrada da aplicação (Entrypoint). Inicializa o FastAPI, gerencia os eventos de ciclo de vida (startup/shutdown) acionando o scheduler e oProcessPoolExecutorpara taferas computacionalmente intensas -
Dockerfile: Declaração de imagem baseada em Python slim, gerenciando a instalação segura do ecossistema e definindo o servidor Uvicorn. -
requirements.in/requirements.txt: Rastreabilidade determinística de dependências Python com uv pip, para garantir versões de dependências e das dependências das dependências.
A aplicação Single Page Application reativa.
-
DashboardMacro.tsx: Tela inicial. Consolida os KPIs macroeconômicos e realiza o cálculo matemático contínuo da Equação de Fisher em memória RAM para obtenção do Juro Real ($Juro Real = \left( \frac{1 + i}{1 + \pi} \right) - 1$ ). Inclui a barra de pesquisa rápida por regex/filtro e o gráfico paramétrico da Média Móvel Exponencial (Recharts). Também renderiza a resposta da IA (LLM) utilizando motores de conversão Markdown/LaTeX. -
DashboardML.tsx: Painel de inteligência quantitativa. Expõe hiperparâmetros ajustáveis para o K-Means. Utiliza o Nivo para a plotagem do espaço bidimensional Risco vs. Retorno, implementando uma camada customizada SVG (EllipseLayer) que calcula centroides e matriz de dispersão na interface gráfica. Inclui análises distribucionais baseadas em Boxplots estatísticos interativos.
-
client.ts: Instância isolada do Axios para roteamento seguro de API. -
App.tsx: Gerenciador de contexto e estado global da aplicação. Hospeda o controle temporal base (Data de Início/Fim) e o fluxo de transição entre abas da SPA, passando estados via Props nativas do React. -
index.html: Template injetável do Vite, com meta-tags otimizadas. -
package.json: Manifesto determinístico de ecossistema Node.js para garantir reprodutibilidade irrestrita em múltiplos sistemas operacionais.
-
nginx.conf: Configuração do servidor Proxy Reverso. Otimiza a entrega estática dos artefatos JavaScript/CSS compilados pelo Vite e encaminha requisições da rota/apiinternamente para a porta 8000 do container FastAPI no backend, solucionando impasses de CORS nativamente via rede local Docker. -
docker-compose.yml: Topologia da infraestrutura. Levanta simultaneamente o banco PostgreSQL persistente (com volumes mapeados), o ambiente Python com Uvicorn e o nó Nginx servindo a compilação do React.
Todas as rotas partem do prefixo /api no Nginx, redirecionado ao roteador interno /dashboard-ativos/.
-
GET /kpis-macro: Retorna métricas macroeconômicas instantâneas (Selic, IPCA). Resposta em taxa percentual bruta. -
GET /resumo: Recebe os parâmetrosdt_inicioedt_fim. Retorna uma matriz de variação de preços logarítmicos e absolutos para todo o pool de ativos. -
GET /series: Endpoint analítico. Recebedt_inicio,dt_fim,ativos(String tipada) ejanela(Int). Retorna a série temporal purificada com o fechamento ajustado e o cálculo do vetor de EMA respectivo à janela solicitada. -
GET /machine-learning: Recebe período temporal en_clusters(K do K-Means). Retorna matrizes de espalhamento bidimensional, métricas de Silhouette e Matriz de Correlação cruzada. -
GET /analise-qualitativa: Recebe cenário quantitativo consolidado, ativo alvo e matriz macro. Retorna umaStringprocessada por Modelos Fundacionais (LLMs) com web scraping interno anexado.
O fluxo de dados da aplicação obedece a um rito temporal voltado para a bolsa brasileira (B3).
O módulo scheduler.py contém rotinas agendadas (CRON) configuradas para execução exclusiva entre 10h e 17h, ignorando finais de semana. A arquitetura de extração intradiária assíncrona captura micro-tendências em velas (candles) de 5 minutos.
A arquitetura garante imunidade matemática ao Call de Fechamento das 16h55 às 17h00 da B3, ignorando o leilão em formação para evitar anomalias de volatilidade espúria no cálculo dos desvios padrões do espaço latente da aplicação (Scikit-Learn). O banco de dados relacional é garantido contra duplicidade através das Constraints no nível de repositório.
O sistema utiliza os modelos fundacionais de alta latência do Google (Série Flash) acoplados sob a perspectiva de um Engenheiro Quantitativo. Para contornar as limitações de cota rígida (limites de RPM/TPM - Erro 429 RESOURCE_EXHAUSTED), implementamos os seguintes protocolos:
-
Bypass de Grounding via Web Scraping: Desacoplamos a ferramenta nativa de buscas da Google (que eleva drasticamente o consumo do modelo) em favor de um raspador de RSS limpo via Python nativo. Os textos brutos de mercado alimentam diretamente o prompt do LLM no contêiner.
-
Resiliência e Timeout: Implementação mandatória de tentativa/erro (try-catch com loop paramétrico), garantindo o Exponential Backoff (espera gradual de 2s, 4s, 8s) se o gargalo da camada de API externa rejeitar a conexão.
-
Graceful Degradation: Em cenário de total inviabilidade da API remota, a função entrega estritamente um texto de aviso estruturado ao frontend, mantendo os painéis estatísticos, pipelines de dados e gráficos operando com rigor analítico absoluto e sem impacto na experiência de navegação (ausência de White Screens of Death).