Skip to content

ohmji/equity-research-agent

Repository files navigation

🧠 Equity Research Agent

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.

🚀 Features

  • 📊 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

🧱 Architecture

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.

🧪 How to Run

  1. Create a new Python project using uv (optional but recommended)
uv venv
uv pip install -r requirements.txt
  1. Install dependencies (if not using uv)
pip install -r requirements.txt
  1. 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.

📂 Project Structure

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

📡 WebSocket Support

Progress updates are sent via WebSocket (websocket_manager) with:

  • Job ID (job_id)
  • Current node name
  • Execution progress
  • Result or error data

🙏 Acknowledgements

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.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors