AI-powered autonomous quantitative analyst
Author: Nolan Cacheux Β· LinkedIn
An autonomous AI agent that performs professional-grade equity research by aggregating and analyzing multiple data sources in real-time. Built with LangGraph for orchestration, hybrid RAG for document analysis, and deployed on Azure Container Apps.
User: "Analyze NVIDIA's position. Compare P/E with AMD, check 10-K for China risks."
The agent autonomously:
- Fetches real-time market data (price, P/E, market cap)
- Downloads and searches SEC 10-K filings using hybrid RAG
- Analyzes earnings call transcripts
- Aggregates social sentiment from Reddit
- Compares metrics with industry peers
- Generates a professional research report
ποΈ High-Level System Design (click to expand)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β USER INTERFACES β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββ ββββββββββββββββ β
β β Telegram β β REST API β β
β β Bot β β (FastAPI) β β
β ββββββββ¬ββββββββ ββββββββ¬ββββββββ β
β β β β
β βββββββββββββββ¬ββββββββββββββββ β
β βΌ β
β βββββββββββββββββββββββββββ β
β β LangGraph Engine β β
β β (Research Pipeline) β β
β βββββββββββββββ¬ββββββββββββ β
β β β
ββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββ
β βΌ AGENT LAYER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Market β β Document β β News β β Earnings β β
β β Data β β Reader β β Sentiment β β Call β β
β β Agent β β Agent β β Agent β β Agent β β
β ββββββββ¬βββββββ ββββββββ¬βββββββ ββββββββ¬βββββββ ββββββββ¬βββββββ β
β β β β β β
β ββββββββ΄βββββββ ββββββββ΄βββββββ ββββββββ΄βββββββ ββββββββ΄βββββββ β
β β Reddit β β Peer β β Risk β β Synthesizer β β
β β Sentiment β β Comparison β β Scoring β β Agent β β
β β Agent β β Agent β β Agent β β β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββ
β βΌ DATA LAYER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Yahoo β β SEC β β Reddit β β DuckDuckGo β β
β β Finance β β EDGAR β β API β β Search β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β RAG Pipeline (Hybrid Search) β β
β β βββββββββββ βββββββββββ βββββββββββ βββββββββββ β β
β β β Chunker β -> β BM25 β -> β Dense β -> βReranker β β β
β β β β β Sparse β βEmbeddingβ β (RRF) β β β
β β βββββββββββ βββββββββββ βββββββββββ βββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Qdrant β β In-Memory β β Groq β β
β β Vector DB β β Cache β β LLM API β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π LangGraph Research Pipeline (click to expand)
βββββββββββββββ
β START β
ββββββββ¬βββββββ
β
βΌ
βββββββββββββββββββββββββ
β Parse Query β
β (Extract tickers, β
β identify intent) β
βββββββββββββ¬ββββββββββββ
β
βΌ
βββββββββββββββββββββββββ
β Market Data Agent β
β (Fetch quotes, β
β financials) β
βββββββββββββ¬ββββββββββββ
β
ββββββββββββββ΄βββββββββββββ
βΌ βΌ
βββββββββββββββββββββββ βββββββββββββββββββββββ
β Document Analysis? β β Skip Documents β
β YES β β NO β
ββββββββββββ¬βββββββββββ ββββββββββββ¬βββββββββββ
β β
βΌ β
βββββββββββββββββββββββ β
β Document Reader β β
β (SEC 10-K RAG) β β
ββββββββββββ¬βββββββββββ β
β β
ββββββββββββββ¬βββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββ
β Parallel Analysis β
βββββββββββββββββββββββββββββββββ€
β βββββββββββ βββββββββββ β
β β News β β Reddit β β
β βSentimentβ βSentimentβ β
β βββββββββββ βββββββββββ β
β βββββββββββ βββββββββββ β
β βEarnings β β Peer β β
β β Calls β βCompare β β
β βββββββββββ βββββββββββ β
βββββββββββββββββ¬ββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββ
β Synthesizer Agent β
β (Generate report, β
β executive summary) β
βββββββββββββ¬ββββββββββββ
β
βΌ
βββββββββββββββ
β END β
βββββββββββββββ
βοΈ Azure Deployment Architecture (click to expand)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β AZURE CLOUD β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Container Apps Environment β β
β β (equity-research-env) β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β β
β β β βββββββββββββββ βββββββββββββββ βββββββββββββββ β β β
β β β β API App β β Bot App β β Qdrant β β β β
β β β β (FastAPI) β β (Telegram) β β (Vector DB) β β β β
β β β β Port 8000 β β Polling β β Port 6333 β β β β
β β β ββββββββ¬βββββββ ββββββββ¬βββββββ βββββββββββββββ β β β
β β β β β β β β
β β β β Internal β β β β
β β β ββββ Network βββ€ β β β
β β β β β β β β
β β βββββββββββΌβββββββββββββββββΌβββββββββββββββββββββββββββββββ β β
β β β β β β
β ββββββββββββββΌβββββββββββββββββΌβββββββββββββββββββββββββββββββββββ β
β β β β
β ββββββββββββββΌβββββββββββββββββΌβββββββββββββββββββββββββββββββββββ β
β β β β β β
β β βββββββββββΌββββββββββ ββββΌββββββββββββββββ β β
β β β Container Registryβ β Key Vault β β β
β β β (equityresearchacrβ β (Secrets) β β β
β β βββββββββββββββββββββ ββββββββββββββββββββ β β
β β β β
β β βββββββββββββββββββββ ββββββββββββββββββββ β β
β β β Log Analytics β β Storage Account β β β
β β β (Monitoring) β β (Terraform) β β β
β β βββββββββββββββββββββ ββββββββββββββββββββ β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββ
β β β
βΌ βΌ βΌ
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β Telegram API β β Groq API β β External Data β
β β β (LLM/Free) β β (Yahoo, SEC) β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
π CI/CD Pipeline (click to expand)
ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ
β Push βββββ>β Lint βββββ>β Tests βββββ>β Security β
β to main β β (Ruff) β β (pytest) β β (Bandit) β
ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ ββββββββ¬ββββββββ
β
βΌ
ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ
β Deploy β<βββββ Push to β<βββββ Build β<βββββ Terraform β
β to Azure β β ACR β β Images β β Validate β
ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ
| Category | Feature | Description |
|---|---|---|
| Analysis | Multi-source Research | Aggregates Yahoo Finance, SEC filings, news, social sentiment |
| Analysis | Hybrid RAG | BM25 sparse + dense embeddings with RRF fusion |
| Analysis | DCF Valuation | Discounted cash flow fair value calculation |
| Analysis | Risk Scoring | 10-K risk factor analysis (1-10 scale) |
| Data | Real-time Quotes | Live prices, P/E, market cap, volume |
| Data | SEC 10-K/10-Q | Automatic download and indexing |
| Data | Earnings Calls | Transcript analysis and summarization |
| Social | Reddit Sentiment | WSB, r/stocks, r/investing aggregation |
| Tools | Peer Comparison | Side-by-side competitor metrics |
| Tools | Watchlist | Personal stock tracking with alerts |
| Tools | Price Alerts | Notifications on price/P/E thresholds |
- Python 3.11+
- uv package manager
- Docker & Docker Compose
# Clone repository
git clone https://github.com/nolancacheux/Rag-Equity-Research-Agent.git
cd Rag-Equity-Research-Agent
# Install dependencies with uv
uv venv && source .venv/bin/activate
uv pip install -e ".[dev]"
# Configure environment
cp .env.example .env
# Edit .env: Add GROQ_API_KEY (free at console.groq.com)# Start infrastructure
docker-compose up -d qdrant
# Start API server
uvicorn src.api.main:app --reload --port 8000
# Start Telegram bot (separate terminal)
python -m src.telegram.bot# Run tests with coverage
uv run pytest --cov=src --cov-report=html
# Lint and format
uv run ruff check --fix src/
uv run ruff format src/
# Type checking
uv run mypy src/π‘ Core Endpoints
| Method | Endpoint | Description |
|---|---|---|
GET |
/health |
Health check |
GET |
/quote/{ticker} |
Real-time stock quote |
GET |
/compare/{tickers} |
Compare multiple stocks |
POST |
/analyze |
Full research analysis |
π§ Analysis Tools
| Method | Endpoint | Description |
|---|---|---|
GET |
/dcf/{ticker} |
DCF fair value calculation |
GET |
/risk/{ticker} |
10-K risk score (1-10) |
GET |
/peers/{ticker} |
Peer comparison |
GET |
/reddit/{ticker} |
Reddit sentiment |
GET |
/earnings/{ticker} |
Earnings call summary |
π Watchlist
| Method | Endpoint | Description |
|---|---|---|
GET |
/watchlist/{user_id} |
Get user's watchlist |
POST |
/watchlist/{user_id}/add |
Add stock to watchlist |
POST |
/watchlist/{user_id}/alert |
Create price alert |
| Command | Description |
|---|---|
/start |
Welcome message and menu |
/q NVDA |
Quick stock quote |
/analyze <query> |
Full research analysis |
/compare NVDA,AMD |
Compare stocks |
/dcf NVDA |
DCF valuation |
/risk NVDA |
Risk score |
/peers NVDA |
Peer comparison |
/watchlist |
View/manage watchlist |
/alert NVDA above 150 |
Set price alert |
βοΈ Environment Variables
| Variable | Required | Description |
|---|---|---|
GROQ_API_KEY |
Yes | Groq API key (free tier) |
TELEGRAM_BOT_TOKEN |
Yes | Telegram bot token |
QDRANT_URL |
No | Qdrant URL (default: localhost:6333) |
AZURE_OPENAI_* |
No | Azure OpenAI credentials (optional) |
LANGCHAIN_API_KEY |
No | LangSmith tracing (optional) |
Note: Deployment is triggered manually via GitHub Actions (workflow_dispatch).
Go to Actions β Build and Deploy β Run workflow after configuring secrets.
π GitHub Secrets Required
AZURE_CREDENTIALS # Service principal JSON
AZURE_CLIENT_ID # SP client ID
AZURE_CLIENT_SECRET # SP secret
AZURE_SUBSCRIPTION_ID # Subscription ID
AZURE_TENANT_ID # Tenant ID
ACR_LOGIN_SERVER # equityresearchacr.azurecr.io
ACR_USERNAME # ACR admin username
ACR_PASSWORD # ACR admin password
TELEGRAM_BOT_TOKEN # Bot token
GROQ_API_KEY # Groq API key
π Deploy with Terraform
cd terraform
terraform init
terraform plan
terraform applyπ° Estimated Costs
| Resource | Monthly Cost |
|---|---|
| Container Apps (Consumption) | $0-10 |
| Container Registry (Basic) | $5 |
| Log Analytics | $0-5 |
| Total | ~$5-20 |
| Layer | Technologies |
|---|---|
| LLM | Groq (Llama 3.3 70B), Azure OpenAI |
| Orchestration | LangGraph, LangChain |
| RAG | Qdrant, BM25, Hybrid Search, Reranking |
| Data Sources | Yahoo Finance, SEC EDGAR, Reddit, DuckDuckGo |
| Backend | FastAPI, Pydantic |
| Bot | python-telegram-bot |
| Infrastructure | Docker, Azure Container Apps, Terraform |
| CI/CD | GitHub Actions |
| Quality | uv, Ruff, pytest, Bandit |
π Directory Layout
Rag-Equity-Research-Agent/
βββ src/
β βββ agents/ # LangGraph agents
β β βββ graph.py # Main orchestration
β β βββ market_data.py
β β βββ document_reader.py
β β βββ news_sentiment.py
β β βββ reddit_agent.py
β β βββ earnings_agent.py
β β βββ peer_agent.py
β β βββ risk_agent.py
β β βββ synthesizer.py
β βββ services/ # Business logic
β β βββ dcf_valuation.py
β β βββ risk_scoring.py
β β βββ watchlist.py
β βββ tools/ # Data fetchers
β β βββ yfinance_tool.py
β β βββ sec_edgar_tool.py
β β βββ search_tool.py
β β βββ reddit_sentiment_tool.py
β βββ rag/ # RAG pipeline
β β βββ chunking.py
β β βββ hybrid_search.py
β β βββ vector_store.py
β β βββ reranker.py
β βββ api/ # FastAPI app
β β βββ main.py
β βββ telegram/ # Telegram bot
β βββ bot.py
β βββ handlers.py
β βββ keyboards.py
βββ terraform/ # Infrastructure as Code
βββ tests/ # Test suite (205 tests)
βββ pyproject.toml # Project config
βββ Dockerfile.api # API container
βββ Dockerfile.bot # Bot container
βββ docker-compose.yml # Local development
- No hardcoded secrets - All credentials via environment variables
- Rate limiting - API endpoints protected with SlowAPI
- Input validation - Pydantic models for all inputs
- Security scanning - Bandit in CI pipeline
- Dependency auditing - Regular updates via Dependabot
MIT License - see LICENSE
- Fork the repository
- Create a feature branch (
git checkout -b feat/amazing-feature) - Commit changes (
git commit -m 'feat: add amazing feature') - Push to branch (
git push origin feat/amazing-feature) - Open a Pull Request
Made with β€οΈ by Nolan Cacheux

