Roberton003

🧠 Stock-Market Research Assistant

Community Roberton003
Updated

Stock-Market Research Assistant - Databricks AI Bootcamp Capstone | Pipeline Spark, RAG com pgvector, MCP Agent, Lakebase

🧠 Stock-Market Research Assistant

DatabricksPythonPostgreSQLApache SparkFastMCPpgvector

Databricks AI Bootcamp Capstone β€” Stock-Market Research Assistant

ImplementaΓ§Γ£o profissional do projeto final do treinamento DataExpert.io

πŸŽ“ ConclusΓ£o do Treinamento

Este repositΓ³rio contΓ©m a entrega final do projeto do Databricks AI Bootcamp, desenvolvido como parte do treinamento oficial da DataExpert.io.

πŸ”— Treinamento Original

πŸ“Œ Project Highlights

Feature Status Description
Pipeline Spark βœ… IngestΓ£o distribuΓ­da com Spark e Delta Lake
API Externa βœ… Massive API para preΓ§os e notΓ­cias de aΓ§Γ΅es
ConteΓΊdo NΓ£o Estruturado βœ… HTML β†’ texto β†’ chunks com trafilatura
Databricks App βœ… Main App + Dashboard separados
Agente Leitura/Escrita βœ… MCP Server com tools de pesquisa e persistΓͺncia
RAG com pgvector βœ… Embeddings e busca semΓ’ntica HNSW
Wiki Completa βœ… DocumentaΓ§Γ£o tΓ©cnica e arquitetural

πŸ›οΈ Architecture & Tech Stack

Camadas da Arquitetura

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                              Databricks Workspace                               β”‚
β”‚                                                                                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                      β”‚
β”‚  β”‚   Databricks App     β”‚         β”‚   Databricks App     β”‚                      β”‚
β”‚  β”‚     (Main App)       β”‚         β”‚    (Dashboard)       β”‚                      β”‚
β”‚  β”‚                      β”‚         β”‚                      β”‚                      β”‚
β”‚  β”‚  - Massive API       β”‚         β”‚  - Read-only Flask   β”‚                      β”‚
β”‚  β”‚  - Lakebase (PG)     β”‚         β”‚  - Watchlist/Quotes  β”‚                      β”‚
β”‚  β”‚  - Sync endpoint     β”‚         β”‚  - News viewer       β”‚                      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                      β”‚
β”‚             β”‚                                                                   β”‚
β”‚             β–Ό                                                                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚
β”‚  β”‚                        Lakebase (Postgres)                            β”‚      β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚      β”‚
β”‚  β”‚  β”‚  watchlists      β”‚  β”‚ ticker_news_     β”‚  β”‚ ticker_news_         β”‚ β”‚      β”‚
β”‚  β”‚  β”‚  (ticker lists)  β”‚  β”‚ documents        β”‚  β”‚ embeddings           β”‚ β”‚      β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ (news articles)  β”‚  β”‚ (title+description)  β”‚ β”‚      β”‚
β”‚  β”‚                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚      β”‚
β”‚  β”‚                                                              β”‚          β”‚      β”‚
β”‚  β”‚                                                              β–Ό          β”‚      β”‚
β”‚  β”‚                                                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚      β”‚
β”‚  β”‚                                                    β”‚ pgvector HNSW  β”‚ β”‚      β”‚
β”‚  β”‚                                                    β”‚ index (cosine) β”‚ β”‚      β”‚
β”‚  β”‚                                                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚      β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                          β”‚      β”‚
β”‚  β”‚  β”‚  research_notes  β”‚  β”‚ analysis_        β”‚                          β”‚      β”‚
β”‚  β”‚  β”‚  (agent writes)  β”‚  β”‚ reports          β”‚                          β”‚      β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                          β”‚      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚
β”‚             β”‚                                                                   β”‚
β”‚             β–Ό                                                                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚
β”‚  β”‚                      MCP Server App                                  β”‚      β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚      β”‚
β”‚  β”‚  β”‚  Massive Broker (stock data)                                  β”‚   β”‚      β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚      β”‚
β”‚  β”‚                                                                       β”‚      β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚      β”‚
β”‚  β”‚  β”‚  FastMCP Server (tools exposed to Agent Bricks)               β”‚   β”‚      β”‚
β”‚  β”‚  β”‚  - get_quote(symbol)                                          β”‚   β”‚      β”‚
β”‚  β”‚  β”‚  - search_news(symbol, query, limit)                          β”‚   β”‚      β”‚
β”‚  β”‚  β”‚  - search_research_context(query, symbol)                     β”‚   β”‚      β”‚
β”‚  β”‚  β”‚  - get_watchlist()                                            β”‚   β”‚      β”‚
β”‚  β”‚  β”‚  - add_to_watchlist(symbol)                                   β”‚   β”‚      β”‚
β”‚  β”‚  β”‚  - remove_from_watchlist(symbol)                              β”‚   β”‚      β”‚
β”‚  β”‚  β”‚  - save_research_note(symbol, title, content)                 β”‚   β”‚      β”‚
β”‚  β”‚  β”‚  - save_analysis_report(symbol, report, sources)              β”‚   β”‚      β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Stack TecnolΓ³gica

Camada Tecnologia VersΓ£o Uso
Data Warehouse Databricks Lakebase Postgres Banco transacional integrado
Processing Apache Spark 3.5+ Pipelines distribuΓ­dos
Embeddings sentence-transformers all-MiniLM-L6-v2 Similaridade semΓ’ntica
Vector Search pgvector 0.5+ Índice HNSW cosine
APIs Massive.com v2 PreΓ§os e notΓ­cias de aΓ§Γ΅es
Agent Framework FastMCP 1.0+ Ferramentas para agente
Frontend Flask 2.0+ API e Dashboard

πŸ—ΊοΈ Architecture Diagram

Pipeline de Dados

flowchart LR
    subgraph "IngestΓ£o"
        A[Watchlist Lakebase] -->|tickers| B[Massive API]
        B -->|notΓ­cias| C[ticker_news_documents]
    end

    subgraph "Processamento"
        C -->|HTML| D[trafilatura]
        D -->|texto| E[Chunking]
        E -->|chunks| F[Embeddings Spark]
    end

    subgraph "Armazenamento"
        F -->|embeddings| G[ticker_news_embeddings]
        E -->|chunks| H[ticker_news_chunk_embeddings]
        G & H -->|HNSW| I[pgvector Index]
    end

    subgraph "Consulta RAG"
        J[User Query] -->|embedding| I
        I -->|top-k| K[Context Retrieval]
        K -->|prompt| L[LLM Response]
    end

Fluxo de Consulta RAG

flowchart LR
    A[Query do UsuΓ‘rio] --> B[Embedding da Query]
    B --> C[Busca Vetorial pgvector]
    C --> D[Top-k Chunks]
    D --> E[Contexto Formatado]
    E --> F[Prompt com CitaΓ§Γ΅es]
    F --> G[Resposta Fundamentada]

πŸ“Š Resultados

MΓ©trica Resultado ObservaΓ§Γ£o
Dimensionalidade Embeddings 384 all-MiniLM-L6-v2
MΓ©trica Similaridade Cosine Otimizada com pgvector
Index Vector HNSW Busca O(log n) aproximada
LatΓͺncia Query RAG < 500ms Com Γ­ndice HNSW
Throughput Embeddings Batch ~100 Parallel Spark

πŸš€ Quick Start & Setup

PrΓ©-requisitos

  • Acesso ao Databricks Workspace
  • Massive API Key (grΓ‘tis em https://www.massive.com)
  • Lakebase URL configurado no workspace

ConfiguraΓ§Γ£o

# 1. Criar secret scopes
python setup_secrets.py

# 2. Executar SQLs no Lakebase
psql $LAKEBASE_URL -f sql/01_setup_news_table.sql
psql $LAKEBASE_URL -f sql/02_setup_embeddings_table.sql
psql $LAKEBASE_URL -f sql/03_setup_chunk_embeddings_table.sql
psql $LAKEBASE_URL -f sql/04_cast_arrays_to_vectors.sql
psql $LAKEBASE_URL -f sql/05_setup_research_tables.sql

# 3. Executar notebook de ingestΓ£o
# (via Databricks UI: importar notebooks/ingest_ticker_news_embeddings.py)

# 4. Testar RAG
python3 test_rag.py --ticker AAPL --limit 5

# 5. Deploy dos Apps
databricks bundle deploy -t dev

Endpoints da API

MΓ©todo Endpoint DescriΓ§Γ£o
GET /watchlist Lista tickers
GET /price/<symbol> PreΓ§o atual
GET /news/<symbol> NotΓ­cias recentes
POST /news/sync Sincronizar notΓ­cias
POST /search/context Busca semΓ’ntica (RAG)

Tools do MCP Server

Leitura:

  • get_quote(symbol) - PreΓ§o atual
  • search_news(symbol, query, limit) - Busca notΓ­cias
  • search_research_context(query, symbol) - Busca contexto
  • get_watchlist() - Lista tickers
  • add_to_watchlist(symbol) - Adicionar ticker
  • remove_from_watchlist(symbol) - Remover ticker

Escrita (Agente):

  • save_research_note(symbol, title, content) - Salvar nota
  • save_analysis_report(symbol, report, sources) - Salvar relatΓ³rio

🌳 Estrutura do Projeto

databricks-capstone-delivery/
β”œβ”€β”€ app.py                      # Main Flask API (Day 1/2)
β”œβ”€β”€ lakebase.py                 # Lakebase connection helper
β”œβ”€β”€ massive_client.py           # Massive API client
β”œβ”€β”€ setup_secrets.py            # Secret scope setup
β”œβ”€β”€ requirements.txt            # Python dependencies
β”œβ”€β”€ pyproject.toml              # Project metadata
β”œβ”€β”€ test_rag.py                 # Script de validaΓ§Γ£o RAG
β”‚
β”œβ”€β”€ dashboard/
β”‚   β”œβ”€β”€ app.py                  # Dashboard Flask
β”‚   └── templates/index.html    # Dashboard UI
β”‚
β”œβ”€β”€ mcp_server/
β”‚   β”œβ”€β”€ alpaca_mcp_server.py    # FastMCP server (com writing tools)
β”‚   β”œβ”€β”€ lakebase.py             # Lakebase helper (novas funΓ§Γ΅es)
β”‚   └── massive_broker.py       # Massive broker
β”‚
β”œβ”€β”€ notebooks/
β”‚   └── ingest_ticker_news_embeddings.py  # Spark pipeline
β”‚
β”œβ”€β”€ sql/
β”‚   β”œβ”€β”€ 01_setup_news_table.sql
β”‚   β”œβ”€β”€ 02_setup_embeddings_table.sql
β”‚   β”œβ”€β”€ 03_setup_chunk_embeddings_table.sql
β”‚   β”œβ”€β”€ 04_cast_arrays_to_vectors.sql
β”‚   └── 05_setup_research_tables.sql
β”‚
└── resources/
    β”œβ”€β”€ dashboard.yml
    β”œβ”€β”€ ingest_ticker_news_embeddings_job.yml
    └── mcp_server.yml

🧠 Methodology & Quality Gates

Este projeto incorpora um sistema heurΓ­stico robusto para garantir qualidade e evitar erros comuns de engenharia de dados:

Data Contract Gate

Valida tabelas Silver/Gold antes da execuΓ§Γ£o:

VerificaΓ§Γ£o Implementada Estado
Schema esperado (colunas, tipos, nullability) βœ… Documentado em SQLs
Regras de qualidade (cardinalidade, unicidade) βœ… Tabelas com constraints
SLA de volume e latΓͺncia βœ… Documentado no schema
Contrato versionado βœ… sql/*.sql com versionamento

Idempotency Gate

Garante reexecuΓ§Γ£o segura do pipeline:

VerificaΓ§Γ£o Implementada Estado
UPSERT ou FULL REFRESH definido βœ… Tabelas com ON CONFLICT
Nenhum append cego sem verificaΓ§Γ£o βœ… Chaves primΓ‘rias definidas
Custo de reprocessamento estimado βœ… Log de contagem de linhas

HeurΓ­sticas Aplicadas

HeurΓ­stica DescriΓ§Γ£o AplicaΓ§Γ£o
Check antes de escrita ValidaΓ§Γ£o de entrada antes de persistΓͺncia lakebase.py + alpaca_broker.py
Rastreabilidade de evidΓͺncia Toda conclusΓ£o indica SOURCE/INFERENCE/IMPLEMENTED/VALIDATED PRD_E_PLANO_EXECUCAO.md
Gates antes de deploy Dois checklists obrigatΓ³rios antes de considerar pronto Este README
Falsos positivos vs falsos negativos AvaliaΓ§Γ£o balanceada de RAG Teste RAG com test_rag.py

πŸ“š Documentation Resources

  • PRD_E_PLANO_EXECUCAO.md - Requisitos e plano completo
  • TECHNICAL.md - DocumentaΓ§Γ£o tΓ©cnica para tech leads
  • CHANGELOG.md - HistΓ³rico de versΓ΅es
  • CONTRIBUTING.md - Guia de contribuiΓ§Γ£o

πŸ“„ License

Este projeto foi desenvolvido como parte do treinamento do Databricks AI Bootcamp.

Copyright (c) 2026 Roberto

Todos os direitos reservados.

Este cΓ³digo pode ser utilizado como portfolio para demonstrar competΓͺncias tΓ©cnicas em Engenharia de Dados, RAG e Agentes de IA.

⚠️ Notas Importantes

  • Este nΓ£o Γ© um sistema de trading em produΓ§Γ£o. NΓ£o deve ser usado para decisΓ΅es financeiras reais.
  • A API do Massive tem limites de rate. O pipeline respeita esses limites.
  • Secrets nunca devem ser commitados. O setup_secrets.py garante isso.

Este projeto foi desenvolvido para demonstrar as habilidades tΓ©cnicas adquiridas durante o Databricks AI Bootcamp.

Author: Roberto LinkedIn: https://www.linkedin.com/in/roberton003/ GitHub: https://github.com/Roberton003

MCP Server Β· Populars

MCP Server Β· New

    DROOdotFOO

    Raxol

    Write one app, render it to a terminal, a browser, or as agent tools. The terminal for your Gundam.

    Community DROOdotFOO
    morluto

    REA: Reverse Engineer Anything

    Reverse engineer anything with agents, from app behavior down to native binaries.

    Community morluto
    nedlir

    MCPwner

    Model Context Protocol server for autonomous vulnerability discovery

    Community nedlir
    codegraph-ai

    CodeGraph

    CodeGraph builds a semantic graph of your codebase β€” functions, classes, imports, call chains β€” and exposes it through 42 MCP tools, 38 languages, a VS Code extension, and a persistent memory layer. AI agents get structured code understanding instead of grepping through files.

    Community codegraph-ai
    getArbor-dev

    Arbor

    Graph-native code intelligence that replaces embedding-based RAG with deterministic program understanding.

    Community getArbor-dev