A LangGraph-based multi-agent system for automated equity research. The system simulates the workflow of a professional equity research analyst, providing enriched, curated, and briefed insights through a structured multi-agent architecture.
- π Financial analysis
- ποΈ News scanning
- π§ Sentiment analysis for news and report sections
- π Industry insights
- π’ Company profiling
- π Data collection and enrichment
- π Auto-generated investment briefings
- βοΈ Final report editing
- π Real-time WebSocket progress updates
- π Valuation analysis powered by Yahoo Finance
- π¬ Real-time subquery generation for deeper insights
- π Symbol lookup using Tavily and yfinance
This project is built using LangGraph's StateGraph with the following node pipeline:
grounding
βββ financial_analyst
βββ news_scanner
βββ industry_analyst
βββ company_analyst
βββ fundamental_analyst
βββ valuation_analyst
β
collector β curator β enricher β briefing β editor
Each node represents a specialized agent:
GroundingNode: Sets research context.FinancialAnalyst,NewsScanner,IndustryAnalyzer,CompanyAnalyzer: Conduct domain-specific analysis.FundamentalAnalyst,ValuationAnalyst: Perform financial metrics evaluation and market-based valuation with Yahoo Finance API.Collector: Aggregates data.Curator: Filters and prioritizes findings.Enricher: Enhances findings with additional insights.Briefing: Creates structured reports.Editor: Finalizes output for human consumption.
- Create a new Python project using uv (optional but recommended)
uv venv
uv pip install -r requirements.txt- Install dependencies (if not using uv)
pip install -r requirements.txt- Run the Agent
from backend.graph import Graph
graph = Graph(company="Tesla")
# graph.run(thread={}) is an async generator
async for state in graph.run(thread={}):
print(state)Note: Make sure to configure WebSocket manager and other integrations as needed.
backend/
βββ graph.py # Main workflow definition
βββ classes/
β βββ state.py # InputState dataclass
βββ nodes/ # Modular node logic
βββ collector.py
βββ curator.py
βββ enricher.py
βββ briefing.py
βββ editor.py
βββ researchers.py
Progress updates are sent via WebSocket (websocket_manager) with:
- Job ID (
job_id) - Current node name
- Execution progress
- Result or error data
This project was inspired by and adapted from company-research-agent by Guy Hartstein. We thank the original author for the excellent foundation and contributions to the open-source research tooling ecosystem.
Licensed and modified under the Apache License 2.0.