Crawler Summary

equity-crew answer-first brief

πŸ€– Multi-agent equity research built with CrewAI. Five agents fuse fundamentals, real-time neural news search, from-scratch technical indicators, and sector peer benchmarking into a validated BUY/HOLD/SELL PDF report. <div align="center"> πŸ€– Equity Crew Multi-Agent Financial Intelligence System Built with CrewAI $1 $1 $1 $1 $1 $1 $1 *A production-grade, multi-agent AI system that performs institutional-quality stock research β€” combining fundamental analysis, real-time news intelligence, technical chart analysis, and sector peer comparison β€” fully automated.* </div> --- πŸ“Œ What This Project Does This system orchestrates **5 special Capability contract not published. No trust telemetry is available yet. Last updated 10/9/2026.

Freshness

Last checked 10/9/2026

Best For

equity-crew is best for crewai, multi-agent workflows where OpenClaw compatibility matters.

Not Ideal For

Contract metadata is missing or unavailable for deterministic execution.

Evidence Sources Checked

editorial-content, GITHUB REPOS, runtime-metrics, public facts pack

Claim this agent
Agent DossierGITHUB REPOSSafety: 66/100

equity-crew

πŸ€– Multi-agent equity research built with CrewAI. Five agents fuse fundamentals, real-time neural news search, from-scratch technical indicators, and sector peer benchmarking into a validated BUY/HOLD/SELL PDF report. <div align="center"> πŸ€– Equity Crew Multi-Agent Financial Intelligence System Built with CrewAI $1 $1 $1 $1 $1 $1 $1 *A production-grade, multi-agent AI system that performs institutional-quality stock research β€” combining fundamental analysis, real-time news intelligence, technical chart analysis, and sector peer comparison β€” fully automated.* </div> --- πŸ“Œ What This Project Does This system orchestrates **5 special

OpenClawself-declared

Public facts

4

Change events

1

Artifacts

0

Freshness

Oct 9, 2026

Verifiededitorial-contentNo verified compatibility signals

Capability contract not published. No trust telemetry is available yet. Last updated 10/9/2026.

Trust evidence available

Trust score

Unknown

Compatibility

OpenClaw

Freshness

Oct 9, 2026

Vendor

Raghavg27

Artifacts

0

Benchmarks

0

Last release

Unpublished

Executive Summary

Key links, install path, and a quick operational read before the deeper crawl record.

Verifiededitorial-content

Summary

Capability contract not published. No trust telemetry is available yet. Last updated 10/9/2026.

Setup snapshot

  1. 1

    Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.

  2. 2

    Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data.

Evidence Ledger

Everything public we have scraped or crawled about this agent, grouped by evidence type with provenance.

Verifiededitorial-content
Vendor (1)

Vendor

Raghavg27

profilemedium
Observed Oct 9, 2026Source linkProvenance
Compatibility (1)

Protocol compatibility

OpenClaw

contractmedium
Observed Oct 9, 2026Source linkProvenance
Security (1)

Handshake status

UNKNOWN

trustmedium
Observed unknownSource linkProvenance
Integration (1)

Crawlable docs

6 indexed pages on the official domain

search_documentmedium
Observed Apr 15, 2026Source linkProvenance

Release & Crawl Timeline

Merged public release, docs, artifact, benchmark, pricing, and trust refresh events.

Self-declaredagent-index

Artifacts Archive

Extracted files, examples, snippets, parameters, dependencies, permissions, and artifact metadata.

Self-declaredGITHUB REPOS

Extracted files

0

Examples

6

Snippets

0

Languages

python

Executable Examples

json

{
  "action": "BUY",
  "confidence": 0.82,
  "target_price": 1190.0,
  "current_price": 958.95,
  "reasons": [
    "Strong earnings growth and margin expansion (EBITDA margin up to 12.2%) with a robust order book and export rebound.",
    "Solid balance sheet with low leverage (DE 0.32Γ—) and sufficient cash to fund strategic initiatives."
  ],
  "risks": [
    "High valuation premium (P/E ~62Γ—) could compress if FY27 growth or margin targets are not met."
  ]
}

text

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         CLI  (main.py)                              β”‚
β”‚  python main.py --stock SUZLON.BO  |  --validate  |  --log-level    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚         Startup Validation         β”‚
          β”‚  βœ“ Env vars  βœ“ Symbol format       β”‚
          β”‚  βœ“ API connectivity (--validate)    β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
          ╔═════════════════▼══════════════════════╗
          β•‘     PHASE 1 β€” Parallel (4 crews)       β•‘
          β•šβ•β•β•β•β•β•β•β•€β•β•β•β•β•β•β•β•€β•β•β•β•β•β•β•β•β•β•β•€β•β•β•β•β•β•β•β•β•β•€β•β•β•β•
                  β”‚       β”‚          β”‚         β”‚
     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β” β”Œβ”€β”€β–Όβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β–Όβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
     β”‚ Financial Crewβ”‚ β”‚  News   β”‚ β”‚Tech    β”‚ β”‚  Peer Crew     β”‚
     β”‚               β”‚ β”‚  Crew   β”‚ β”‚Crew    β”‚ β”‚                β”‚
     β”‚ data_explorer β”‚ β”‚news_exp.β”‚ β”‚tech_   β”‚ β”‚ sector_analyst β”‚
     β”‚               β”‚ β”‚         β”‚ β”‚analyst β”‚ β”‚                β”‚
     β”‚ 8 yfinance    β”‚ β”‚ EXA     β”‚ β”‚RSI,MACDβ”‚ β”‚ get_company_   β”‚
     β”‚ tools         β”‚ β”‚ search  β”‚ β”‚BB,SMA  β”‚ β”‚ info +         β”‚
     β”‚               β”‚ β”‚         β”‚ β”‚Volume  β”‚ β”‚ get_valuation_ β”‚
     β”‚               β”‚ β”‚         β”‚ β”‚        β”‚ β”‚ metrics        β”‚
     β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚             β”‚           β”‚               β”‚
          ╔══▼═════════════▼═══════════▼═══════════════▼══╗
          β•‘     PHASE 2 β€” Sequential (1 crew)             β•‘
          β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•€β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
                                β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚  analyst  (Task 5)      β”‚
                    β”‚  Combines all 4        β”‚
                    β”‚  Phase 1 outputs       β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                β”‚
        

python

# Retry with exponential backoff β€” no external dependency
def _with_retry(fn, label, max_retries=3, base_delay=1.5):
    for attempt in range(1, max_retries + 1):
        try:
            return fn()
        except Exception as exc:
            delay = base_delay * (2 ** (attempt - 1))  # 1.5s β†’ 3s β†’ 6s
            if attempt < max_retries:
                time.sleep(delay)
            else:
                raise

python

# Standard Wilder smoothing via rolling mean
delta = prices.diff()
gain  = delta.clip(lower=0).rolling(14).mean()
loss  = (-delta.clip(upper=0)).rolling(14).mean()
rsi   = 100 - (100 / (1 + gain / loss))
# Signal: > 70 β†’ overbought, < 30 β†’ oversold

python

ema12     = prices.ewm(span=12, adjust=False).mean()
ema26     = prices.ewm(span=26, adjust=False).mean()
macd_line = ema12 - ema26
signal    = macd_line.ewm(span=9, adjust=False).mean()
histogram = macd_line - signal
# Signal: MACD above signal β†’ bullish crossover

python

sma   = prices.rolling(20).mean()
std   = prices.rolling(20).std()
upper = sma + 2 * std
lower = sma - 2 * std
# Price above upper β†’ overbought; below lower β†’ oversold

Docs & README

Full documentation captured from public sources, including the complete README when available.

Self-declaredGITHUB REPOS

Docs source

GITHUB REPOS

Editorial quality

ready

πŸ€– Multi-agent equity research built with CrewAI. Five agents fuse fundamentals, real-time neural news search, from-scratch technical indicators, and sector peer benchmarking into a validated BUY/HOLD/SELL PDF report. <div align="center"> πŸ€– Equity Crew Multi-Agent Financial Intelligence System Built with CrewAI $1 $1 $1 $1 $1 $1 $1 *A production-grade, multi-agent AI system that performs institutional-quality stock research β€” combining fundamental analysis, real-time news intelligence, technical chart analysis, and sector peer comparison β€” fully automated.* </div> --- πŸ“Œ What This Project Does This system orchestrates **5 special

Full README
<div align="center">

πŸ€– Equity Crew

Multi-Agent Financial Intelligence System Built with CrewAI

Python CrewAI yfinance OpenRouter EXA CI Hire Me

A production-grade, multi-agent AI system that performs institutional-quality stock research β€” combining fundamental analysis, real-time news intelligence, technical chart analysis, and sector peer comparison β€” fully automated.

PDF Report Screenshot

</div>

πŸ“Œ What This Project Does

This system orchestrates 5 specialised AI agents that work in parallel and sequentially to produce a complete equity research report for any publicly listed stock. Given a ticker symbol, it:

  1. Fetches deep financial data β€” income statements, balance sheet, cash flow, dividends, insider transactions, institutional holdings, and analyst recommendations
  2. Searches the internet for real-time news β€” using semantic neural search to surface the most relevant recent developments
  3. Calculates technical indicators from scratch β€” RSI, MACD, Bollinger Bands, SMA50/200, and volume analysis, all implemented using pure pandas (no TA library dependency)
  4. Benchmarks against sector peers β€” identifies 4-5 competitors and builds a side-by-side valuation comparison (P/E, P/B, EV/EBITDA, ROE, margins, growth) to determine if the stock is over/under-valued relative to its sector
  5. Synthesises all four data streams into a single structured analysis report
  6. Outputs a validated investment recommendation β€” BUY / HOLD / SELL with a confidence score, 12-month target price, key reasons, and risks
  7. Generates a Rich PDF Report β€” compiles the recommendation badge, key metrics, matplotlib price charts, and full analysis texts into a beautifully formatted PDF document.

Sample output (SUZLON.BO, run on 30 Apr 2026):

{
  "action": "BUY",
  "confidence": 0.82,
  "target_price": 1190.0,
  "current_price": 958.95,
  "reasons": [
    "Strong earnings growth and margin expansion (EBITDA margin up to 12.2%) with a robust order book and export rebound.",
    "Solid balance sheet with low leverage (DE 0.32Γ—) and sufficient cash to fund strategic initiatives."
  ],
  "risks": [
    "High valuation premium (P/E ~62Γ—) could compress if FY27 growth or margin targets are not met."
  ]
}

πŸ—οΈ System Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         CLI  (main.py)                              β”‚
β”‚  python main.py --stock SUZLON.BO  |  --validate  |  --log-level    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚         Startup Validation         β”‚
          β”‚  βœ“ Env vars  βœ“ Symbol format       β”‚
          β”‚  βœ“ API connectivity (--validate)    β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
          ╔═════════════════▼══════════════════════╗
          β•‘     PHASE 1 β€” Parallel (4 crews)       β•‘
          β•šβ•β•β•β•β•β•β•β•€β•β•β•β•β•β•β•β•€β•β•β•β•β•β•β•β•β•β•β•€β•β•β•β•β•β•β•β•β•β•€β•β•β•β•
                  β”‚       β”‚          β”‚         β”‚
     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β” β”Œβ”€β”€β–Όβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β–Όβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
     β”‚ Financial Crewβ”‚ β”‚  News   β”‚ β”‚Tech    β”‚ β”‚  Peer Crew     β”‚
     β”‚               β”‚ β”‚  Crew   β”‚ β”‚Crew    β”‚ β”‚                β”‚
     β”‚ data_explorer β”‚ β”‚news_exp.β”‚ β”‚tech_   β”‚ β”‚ sector_analyst β”‚
     β”‚               β”‚ β”‚         β”‚ β”‚analyst β”‚ β”‚                β”‚
     β”‚ 8 yfinance    β”‚ β”‚ EXA     β”‚ β”‚RSI,MACDβ”‚ β”‚ get_company_   β”‚
     β”‚ tools         β”‚ β”‚ search  β”‚ β”‚BB,SMA  β”‚ β”‚ info +         β”‚
     β”‚               β”‚ β”‚         β”‚ β”‚Volume  β”‚ β”‚ get_valuation_ β”‚
     β”‚               β”‚ β”‚         β”‚ β”‚        β”‚ β”‚ metrics        β”‚
     β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚             β”‚           β”‚               β”‚
          ╔══▼═════════════▼═══════════▼═══════════════▼══╗
          β•‘     PHASE 2 β€” Sequential (1 crew)             β•‘
          β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•€β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
                                β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚  analyst  (Task 5)      β”‚
                    β”‚  Combines all 4        β”‚
                    β”‚  Phase 1 outputs       β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚ fin_expert (Task 6)     β”‚
                    β”‚ BUY/HOLD/SELL rec       β”‚
                    β”‚ + Pydantic schema       β”‚
                    β”‚ + guardrail check       β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                β”‚
               β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
               β”‚           Output Files           β”‚
               β”‚  peer_comparison.md              β”‚
               β”‚  technical_analysis.md           β”‚
               β”‚  financial_analysis.md           β”‚
               β”‚  investment_recommendation.md    β”‚
               β”‚  [SYMBOL]_Report_YYYYMMDD.pdf    β”‚
               β”‚  logs/analyser_YYYYMMDD.log      β”‚
               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

🧠 Agent Design

The system uses 6 specialised agents, each with a distinct role, tailored backstory, tool access, and rate/execution limits:

| Agent | Role | Tools | Key Design Decision | |---|---|---|---| | data_explorer | Fundamental Data Researcher | 8 yfinance tools | Larger max_execution_time (540s) β€” collecting 8 data sources in sequence takes time | | news_info_explorer | News & Sentiment Researcher | EXA neural search | Semantic search surfaces contextually relevant news even when the ticker isn't explicitly mentioned | | technical_analyst | Technical Chart Analyst | get_technical_indicators | Isolated agent keeps chart signals separate from fundamentals β€” prevents anchoring bias in the synthesis | | sector_analyst | Sector & Peer Comparison Analyst | get_company_info + get_valuation_metrics | Uses LLM's market knowledge to identify peers dynamically β€” no hardcoded peer maps, adapts to any stock globally | | analyst | Senior Financial Analyst | None (synthesis only) | Intentionally no tools β€” forced to reason from structured Phase 1 context, not re-fetch data | | fin_expert | Investment Advisor | get_current_stock_price | Fetches live price last so the target price ratio reflects market conditions at recommendation time |


πŸ› οΈ Tool Design

Fundamental Data Tools (8 tools via yfinance)

All tools follow the same pattern: input validation β†’ _with_retry() β†’ structured JSON output β†’ descriptive error message on failure.

# Retry with exponential backoff β€” no external dependency
def _with_retry(fn, label, max_retries=3, base_delay=1.5):
    for attempt in range(1, max_retries + 1):
        try:
            return fn()
        except Exception as exc:
            delay = base_delay * (2 ** (attempt - 1))  # 1.5s β†’ 3s β†’ 6s
            if attempt < max_retries:
                time.sleep(delay)
            else:
                raise

| Tool | Data Source | Key Data Points | |---|---|---| | get_company_info | ticker.info | P/E, EPS, market cap, 52-week range, margins, EBITDA | | get_income_statements | ticker.financials | Revenue, gross profit, operating income, net income (4 years) | | get_balance_sheet | ticker.balance_sheet | Total assets, liabilities, equity, cash, debt | | get_cash_flow | ticker.cashflow | Operating CF, investing CF, free cash flow | | get_dividend_history | ticker.dividends | Last 10 dividend payments | | get_analyst_recommendations | ticker.recommendations | Most recent buy/hold/sell consensus | | get_insider_transactions | ticker.insider_transactions | Recent insider buying/selling activity | | get_institutional_holdings | ticker.institutional_holders | Top institutional shareholders and stake sizes | | get_valuation_metrics | ticker.info | Compact snapshot: P/E, P/B, EV/EBITDA, ROE, margins, D/E, dividend yield β€” designed for peer comparison |

Technical Analysis Tool (implemented from scratch with pandas)

Rather than adding a TA library dependency, all indicators are implemented using vectorised pandas operations:

RSI (14-day Relative Strength Index)

# Standard Wilder smoothing via rolling mean
delta = prices.diff()
gain  = delta.clip(lower=0).rolling(14).mean()
loss  = (-delta.clip(upper=0)).rolling(14).mean()
rsi   = 100 - (100 / (1 + gain / loss))
# Signal: > 70 β†’ overbought, < 30 β†’ oversold

MACD (12/26/9)

ema12     = prices.ewm(span=12, adjust=False).mean()
ema26     = prices.ewm(span=26, adjust=False).mean()
macd_line = ema12 - ema26
signal    = macd_line.ewm(span=9, adjust=False).mean()
histogram = macd_line - signal
# Signal: MACD above signal β†’ bullish crossover

Bollinger Bands (20-day, Β±2Οƒ)

sma   = prices.rolling(20).mean()
std   = prices.rolling(20).std()
upper = sma + 2 * std
lower = sma - 2 * std
# Price above upper β†’ overbought; below lower β†’ oversold

Moving Averages + Golden/Death Cross

sma50  = prices.rolling(50).mean()
sma200 = prices.rolling(200).mean()
# Golden Cross: SMA50 crosses above SMA200 β†’ long-term bullish signal
# Death Cross:  SMA50 crosses below SMA200 β†’ long-term bearish signal

Volume Analysis

avg_vol_20 = volume.rolling(20).mean()
vol_ratio  = current_volume / avg_vol_20
# > 1.0 β†’ above average volume (confirms price moves)

βš™οΈ Engineering Highlights

Parallel Execution with ThreadPoolExecutor

Phase 1 runs 4 independent crews concurrently, cutting wall-clock time significantly:

with ThreadPoolExecutor(max_workers=4) as executor:
    financial_future = executor.submit(run_crew_task, financial_crew, inputs, "Financial")
    news_future      = executor.submit(run_crew_task, news_crew,      inputs, "News")
    technical_future = executor.submit(run_crew_task, technical_crew, inputs, "Technical")
    peer_future      = executor.submit(run_crew_task, peer_crew,      inputs, "Peers")

    financial_result = financial_future.result()
    news_result      = news_future.result()
    technical_result = technical_future.result()
    peer_result      = peer_future.result()

At the end of every run, the system reports estimated time saved:

Phase 1 (parallel):   142.3s
Phase 2 (sequential):  89.1s
Total:                231.4s   (vs ~373.7s sequential β€” 38% faster)

Structured Output with Pydantic + Guardrails

The final recommendation is enforced as a strict Pydantic schema with a custom guardrail function:

class InvestmentRecommendation(BaseModel):
    action:        Literal["BUY", "HOLD", "SELL"]
    confidence:    float    # must be 0.0–1.0
    target_price:  float
    current_price: float
    reasons:       list[str]  # minimum 2 required
    risks:         list[str]  # minimum 1 required

def validate_recommendation(result: TaskOutput) -> Tuple[bool, Any]:
    # guardrail β€” CrewAI will retry the task if this returns False
    if not (0.0 <= rec.confidence <= 1.0): return (False, "...")
    if len(rec.reasons) < 2:               return (False, "...")
    if len(rec.risks) < 1:                 return (False, "...")
    return (True, rec)

If the LLM output fails validation, CrewAI automatically retries the task with the error message as feedback β€” ensuring output quality without manual intervention.

Production-Grade Error Handling

The system catches all known failure modes and converts them into actionable, user-friendly messages:

❌  Authentication error: the LLM API rejected your credentials.
    ➜  Check that OPENROUTER_API_KEY in your .env file is correct.
    ➜  Run  python main.py --validate  to test your API keys.
    ➜  Visit https://openrouter.ai/keys to verify or rotate your key.

Handled explicitly: 401 auth failures, 429 rate limits, agent timeouts, keyboard interrupts, and generic exceptions (full traceback written to the log file only).

Structured Logging (Console + File)

# Console: clean, timestamped INFO messages
23:15:00 [INFO    ] βœ…  OpenRouter API: connected and authenticated.

# File (logs/analyser_YYYYMMDD.log): full DEBUG context
2026-04-30 23:15:00 [DEBUG   ] stocks_analyser.tools:get_company_info:98 β€” Company info fetched for SUZLON.BO: Suzlon Energy Ltd

Two handlers on one logger β€” operators see clean output, debug logs preserve full context for troubleshooting.


πŸ“ Project Structure

equity-crew/
β”‚
β”œβ”€β”€ main.py           # CLI entry point β€” orchestrates crews, parallel execution, error handling
β”œβ”€β”€ app.py            # Streamlit web UI β€” live progress, results, PDF download
β”œβ”€β”€ agents.py         # 6 CrewAI agent definitions with roles, backstories, tools, and limits
β”œβ”€β”€ tasks.py          # 6 task definitions with descriptions, expected outputs, and guardrails
β”œβ”€β”€ tools.py          # 11 tools: 8 fundamental + 1 valuation metrics + 1 technical + 1 EXA search
β”œβ”€β”€ logger.py         # Centralised logging β€” console (INFO) + rotating file (DEBUG)
β”œβ”€β”€ validators.py     # Startup checks: env vars, symbol format, live API connectivity
β”œβ”€β”€ report_generator.py # PDF report compilation via Jinja2 + WeasyPrint
β”‚
β”œβ”€β”€ tests/
β”‚   β”œβ”€β”€ conftest.py         # Shared fixtures and dummy credentials
β”‚   β”œβ”€β”€ test_validators.py  # Symbol format, env-var, and resolution tests
β”‚   β”œβ”€β”€ test_tools.py       # RSI/MACD/Bollinger maths, retry logic, mocked yfinance
β”‚   └── test_tasks.py       # Pydantic schema and guardrail tests
β”‚
β”œβ”€β”€ .github/
β”‚   └── workflows/
β”‚       └── ci.yml          # GitHub Actions β€” runs tests on Python 3.11 & 3.12
β”‚
β”œβ”€β”€ .streamlit/
β”‚   └── config.toml         # Dark theme for Streamlit UI
β”‚
β”œβ”€β”€ config/
β”‚   β”œβ”€β”€ agents.yaml   # Agent configuration templates
β”‚   └── tasks.yaml    # Task configuration templates
β”‚
β”œβ”€β”€ task_outputs/     # Generated reports (gitignored)
β”‚   β”œβ”€β”€ peer_comparison.md
β”‚   β”œβ”€β”€ technical_analysis.md
β”‚   β”œβ”€β”€ financial_analysis.md
β”‚   β”œβ”€β”€ investment_recommendation.md
β”‚   └── *_Report_*.pdf
β”‚
β”œβ”€β”€ logs/             # Daily debug log files (gitignored)
β”‚   └── analyser_YYYYMMDD.log
β”‚
β”œβ”€β”€ pytest.ini        # Test configuration β€” pythonpath and testpaths
β”œβ”€β”€ packages.txt      # Streamlit Cloud system dependencies (WeasyPrint/Pango)
β”œβ”€β”€ requirements.txt
β”œβ”€β”€ .env              # API keys (gitignored)
└── .gitignore

πŸš€ Setup & Usage

Prerequisites

  • Python 3.10+
  • An OpenRouter API key (free tier available β€” used for LLM access)
  • An EXA API key (used for real-time news search)

Installation

# 1. Clone the repository
git clone https://github.com/raghavg27/equity-crew.git
cd equity-crew

# 2. Create and activate a virtual environment
python -m venv venv
source venv/bin/activate        # Windows: venv\Scripts\activate

# 3. Install dependencies
pip install -r requirements.txt

# 4. Set up environment variables
cp .env.example .env
# Edit .env and add your API keys:
# OPENROUTER_API_KEY=sk-or-v1-...
# EXA_API_KEY=...

### 🐳 Docker & Cloud Deployment

For containerized setup or deploying to Streamlit Cloud, see the [Deployment Guide](DEPLOYMENT.md).

### 🀝 Contributing

Interested in adding new agents or financial tools? Check out our [Contributing Guide](CONTRIBUTING.md).

Running the Analyser

# Validate API keys and connectivity before your first run
python main.py --validate

# Analyse any stock β€” NSE, BSE, NYSE, NASDAQ
python main.py --stock RELIANCE.NS    # NSE (India)
python main.py --stock SUZLON.BO      # BSE (India)
python main.py --stock AAPL           # NYSE/NASDAQ (US)
python main.py --stock ^NSEI          # Nifty 50 Index

# Enable verbose debug output
python main.py --stock TCS.NS --log-level DEBUG

Output

Four markdown reports and a rich PDF are generated in task_outputs/:

| File | Contents | |---|---| | [SYMBOL]_Report_[DATE].pdf | Compiled final PDF report with badges, charts, and analysis. | | peer_comparison.md | Side-by-side peer valuation table, premium/discount verdict, key takeaways | | technical_analysis.md | RSI, MACD, Bollinger Bands, MAs, volume analysis, technical outlook | | financial_analysis.md | Full fundamental + news + technical + peer synthesis | | investment_recommendation.md | Structured JSON: action, confidence, target, reasons, risks |

A debug log is written to logs/analyser_YYYYMMDD.log after every run.


πŸ”§ Tech Stack

| Layer | Technology | Purpose | |---|---|---| | Agent Framework | CrewAI | Multi-agent orchestration, task chaining, context passing | | LLM Gateway | OpenRouter | Unified API for multiple LLM providers | | LLM | GPT-class model (via OpenRouter) | Agent reasoning, synthesis, and recommendation | | Market Data | yfinance | Financial statements, price history, insider data | | News Search | EXA | Neural semantic search for real-time news | | HTTP | curl_cffi | Chrome-impersonating session to bypass bot detection on yfinance | | Output Validation | Pydantic v2 | Strict schema enforcement on LLM output | | Concurrency | concurrent.futures.ThreadPoolExecutor | Parallel Phase 1 crew execution | | Logging | Python logging | Dual-handler: console (INFO) + file (DEBUG) | | Env Management | python-dotenv | Secure API key loading |


πŸ”„ How Parallel Execution Works

The pipeline is split into two phases specifically to maximise parallelism while respecting task dependencies:

                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚      Sequential Baseline      β”‚
                    β”‚  T1──T2──T3──T4──T5           β”‚
                    β”‚  ←─────── ~373s ────────→    β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚  This System (Parallel Phase 1)β”‚
                    β”‚  T1 ─┐                        β”‚
                    β”‚  T2 ─┼── (concurrent) ──T4──T5β”‚
                    β”‚  T3 β”€β”˜                        β”‚
                    β”‚  ←── ~231s ──→                β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Tasks 1, 2, and 3 have no dependency on each other β€” they can start simultaneously. Tasks 4 and 5 depend on the combined output of Tasks 1–3, so they run sequentially after Phase 1 completes.


πŸ’‘ Design Decisions & Engineering Rationale

Why CrewAI? CrewAI provides a clean abstraction for multi-agent pipelines β€” role-based agents, task context passing, structured output, and built-in retry logic. It handles the complexity of chaining LLM calls with tool use so the code focuses on the domain logic.

Why OpenRouter instead of OpenAI directly? OpenRouter provides a unified gateway to multiple LLMs (GPT, Claude, Gemini, Llama, etc.) under one API. This makes it trivial to swap models by changing a single config string β€” useful for cost/quality tradeoffs.

Why identify peers dynamically via LLM rather than a hardcoded map? A static peer mapping would cover only stocks we've pre-configured and would quickly go stale as companies enter/exit sectors. The LLM has broad market knowledge and can identify the most relevant competitors for any stock globally β€” from Nifty50 to NASDAQ β€” without maintenance overhead. The get_valuation_metrics tool then fetches live data for whichever peers the agent selects.

Why the guardrail pattern? LLMs can hallucinate or produce malformed structured output. The Pydantic schema + guardrail function creates a closed feedback loop β€” if the output is invalid, CrewAI feeds the validation error back to the agent as a correction prompt and retries automatically.

Why separate console and file log handlers? Operators running interactively want a clean, scannable INFO stream. Debugging a failure at 2am requires full context (module, function, line). Two handlers on one logger satisfies both needs without changing code.


πŸ§ͺ Testing & CI

The project ships with a full unit test suite and GitHub Actions CI that runs on every push.

# Run the test suite locally
pytest

# Verbose output
pytest -v

59 tests across 3 modules β€” all run without real API credentials (yfinance and LLM calls are mocked):

| Module | What it tests | |---|---| | tests/test_validators.py | Symbol regex rules, env-var presence checks, yfinance symbol resolution (mocked) | | tests/test_tools.py | RSI / MACD / Bollinger maths, exponential-backoff retry logic, get_company_info with mocked yfinance | | tests/test_tasks.py | InvestmentRecommendation Pydantic schema, all validate_recommendation guardrail branches |

Key testing patterns demonstrated:

  • Pure-function math tests β€” RSI/MACD/Bollinger computed on synthetic pandas Series with known properties (strictly increasing prices β†’ RSI = 100; histogram always equals MACD βˆ’ signal)
  • Mock-based isolation β€” unittest.mock.patch used to replace yfinance, time.sleep, and dotenv so tests are fast, deterministic, and free
  • Guardrail boundary tests β€” confidence at 0.0, 1.0, βˆ’0.1, 1.5; 0/1/2 reasons; empty risks list
  • Parametrised symbol validation β€” @pytest.mark.parametrize covering US, NSE, BSE, index, and hyphenated tickers in a single test

CI runs on Python 3.11 and 3.12 via GitHub Actions on every push and pull request to main.


🌐 Web Interface

In addition to the CLI, a Streamlit web app is included for interactive use:

streamlit run app.py

Features: live per-agent progress updates, colour-coded BUY/HOLD/SELL banner, tabbed reports (Financial Β· Technical Β· Peers Β· Price Chart), and a one-click PDF download.


πŸ“ˆ Potential Extensions

  • Watchlist mode β€” --watchlist RELIANCE.NS,TCS.NS,INFY.NS for batch analysis
  • Result caching β€” Skip re-fetching data fetched within the last N hours
  • Historical tracking β€” SQLite log of past recommendations vs actual price outcomes
  • Alerting β€” Email/Telegram notification when a high-confidence BUY is detected
  • PDF report generation β€” Formatted research report via Jinja2 + WeasyPrint

πŸ‘¨β€πŸ’» Why Hire Me for Your AI Engineering Team?

If you are a recruiter or an engineering manager looking for a Senior AI Engineer or GenAI Developer, this project demonstrates my ability to build production-ready AI systems, not just Jupyter notebook prototypes.

Here is what this project proves I can bring to your team:

  • Advanced Multi-Agent Orchestration: Deep understanding of delegating complex tasks to specialised autonomous agents using frameworks like CrewAI.
  • Production-Grade Reliability: Implemented exponential backoff for APIs, strict Pydantic schemas for LLM output guardrails, and dual-handler structured logging.
  • System Architecture & Performance: Custom parallel execution pipeline using ThreadPoolExecutor, drastically cutting down wall-clock time by ~40% while respecting task dependencies.
  • Integration of Real-World APIs: Seamlessly integrated financial data (yfinance), neural search (EXA), and multi-LLM gateways (OpenRouter).
  • End-to-End Delivery: From CLI architecture to rich automated PDF generation, the system is designed as a complete, user-facing product.

Feel free to reach out to me for roles involving LLMs, autonomous agents, and AI backend infrastructure!


πŸ“„ License

MIT License β€” see LICENSE for details.


<div align="center"> Built with ❀️ using CrewAI, yfinance, and OpenRouter </div>

Contract & API

Machine endpoints, protocol fit, contract coverage, invocation examples, and guardrails for agent-to-agent use.

MissingGITHUB REPOS

Contract coverage

Status

missing

Auth

None

Streaming

No

Data region

Unspecified

Protocol support

OpenClaw: self-declared

Requires: none

Forbidden: none

Guardrails

Operational confidence: low

No positive guardrails captured.
Invocation examples
curl -s "https://www.xpersona.co/api/v1/agents/crewai-raghavg27-equity-crew/snapshot"
curl -s "https://www.xpersona.co/api/v1/agents/crewai-raghavg27-equity-crew/contract"
curl -s "https://www.xpersona.co/api/v1/agents/crewai-raghavg27-equity-crew/trust"

Reliability & Benchmarks

Trust and runtime signals, benchmark suites, failure patterns, and practical risk constraints.

Missingruntime-metrics

Trust signals

Handshake

UNKNOWN

Confidence

unknown

Attempts 30d

unknown

Fallback rate

unknown

Runtime metrics

Observed P50

unknown

Observed P95

unknown

Rate limit

unknown

Estimated cost

unknown

Do not use if

Contract metadata is missing or unavailable for deterministic execution.
No benchmark suites or observed failure patterns are available.

Media & Demo

Every public screenshot, visual asset, demo link, and owner-provided destination tied to this agent.

Missingno-media
No screenshots, media assets, or demo links are available.

Related Agents

Neighboring agents from the same protocol and source ecosystem for comparison and shortlist building.

Self-declaredprotocol-neighbors
Github ReposUpdated 6mo agoRank 70

activepieces

AI Agents & MCPs & AI Workflow Automation β€’ (~400 MCP servers for AI agents) β€’ AI Automation / AI Agent with MCPs β€’ AI Workflows & AI Agents β€’ MCPs for AI Agents

OPENCLAW
Github ReposUpdated 6mo agoRank 70

cherry-studio

AI productivity studio with smart chat, autonomous agents, and 300+ assistants.

MCPOPENCLAW
Github ReposUpdated 6mo agoRank 70

AionUi

Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!

MCPOPENCLAW
Github ReposUpdated 7mo agoRank 70

CopilotKit

The Frontend for Agents & Generative UI. React + Angular

OPENCLAW
Machine Appendix

Contract JSON

{
  "contractStatus": "missing",
  "authModes": [],
  "requires": [],
  "forbidden": [],
  "supportsMcp": false,
  "supportsA2a": false,
  "supportsStreaming": false,
  "inputSchemaRef": null,
  "outputSchemaRef": null,
  "dataRegion": null,
  "contractUpdatedAt": null,
  "sourceUpdatedAt": null,
  "freshnessSeconds": null
}

Invocation Guide

{
  "preferredApi": {
    "snapshotUrl": "https://www.xpersona.co/api/v1/agents/crewai-raghavg27-equity-crew/snapshot",
    "contractUrl": "https://www.xpersona.co/api/v1/agents/crewai-raghavg27-equity-crew/contract",
    "trustUrl": "https://www.xpersona.co/api/v1/agents/crewai-raghavg27-equity-crew/trust"
  },
  "curlExamples": [
    "curl -s \"https://www.xpersona.co/api/v1/agents/crewai-raghavg27-equity-crew/snapshot\"",
    "curl -s \"https://www.xpersona.co/api/v1/agents/crewai-raghavg27-equity-crew/contract\"",
    "curl -s \"https://www.xpersona.co/api/v1/agents/crewai-raghavg27-equity-crew/trust\""
  ],
  "jsonRequestTemplate": {
    "query": "summarize this repo",
    "constraints": {
      "maxLatencyMs": 2000,
      "protocolPreference": [
        "OPENCLEW"
      ]
    }
  },
  "jsonResponseTemplate": {
    "ok": true,
    "result": {
      "summary": "...",
      "confidence": 0.9
    },
    "meta": {
      "source": "GITHUB_REPOS",
      "generatedAt": "2026-10-09T08:59:52.917Z"
    }
  },
  "retryPolicy": {
    "maxAttempts": 3,
    "backoffMs": [
      500,
      1500,
      3500
    ],
    "retryableConditions": [
      "HTTP_429",
      "HTTP_503",
      "NETWORK_TIMEOUT"
    ]
  }
}

Trust JSON

{
  "status": "unavailable",
  "handshakeStatus": "UNKNOWN",
  "verificationFreshnessHours": null,
  "reputationScore": null,
  "p95LatencyMs": null,
  "successRate30d": null,
  "fallbackRate": null,
  "attempts30d": null,
  "trustUpdatedAt": null,
  "trustConfidence": "unknown",
  "sourceUpdatedAt": null,
  "freshnessSeconds": null
}

Capability Matrix

{
  "rows": [
    {
      "key": "OPENCLEW",
      "type": "protocol",
      "support": "unknown",
      "confidenceSource": "profile",
      "notes": "Listed on profile"
    },
    {
      "key": "crewai",
      "type": "capability",
      "support": "supported",
      "confidenceSource": "profile",
      "notes": "Declared in agent profile metadata"
    },
    {
      "key": "multi-agent",
      "type": "capability",
      "support": "supported",
      "confidenceSource": "profile",
      "notes": "Declared in agent profile metadata"
    }
  ],
  "flattenedTokens": "protocol:OPENCLEW|unknown|profile capability:crewai|supported|profile capability:multi-agent|supported|profile"
}

Facts JSON

[
  {
    "factKey": "vendor",
    "category": "vendor",
    "label": "Vendor",
    "value": "Raghavg27",
    "href": "https://github.com/raghavg27/equity-crew",
    "sourceUrl": "https://github.com/raghavg27/equity-crew",
    "sourceType": "profile",
    "confidence": "medium",
    "observedAt": "2026-10-09T05:28:37.722Z",
    "isPublic": true
  },
  {
    "factKey": "protocols",
    "category": "compatibility",
    "label": "Protocol compatibility",
    "value": "OpenClaw",
    "href": "https://www.xpersona.co/api/v1/agents/crewai-raghavg27-equity-crew/contract",
    "sourceUrl": "https://www.xpersona.co/api/v1/agents/crewai-raghavg27-equity-crew/contract",
    "sourceType": "contract",
    "confidence": "medium",
    "observedAt": "2026-10-09T05:28:37.722Z",
    "isPublic": true
  },
  {
    "factKey": "docs_crawl",
    "category": "integration",
    "label": "Crawlable docs",
    "value": "6 indexed pages on the official domain",
    "href": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
    "sourceUrl": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
    "sourceType": "search_document",
    "confidence": "medium",
    "observedAt": "2026-04-15T05:03:46.393Z",
    "isPublic": true
  },
  {
    "factKey": "handshake_status",
    "category": "security",
    "label": "Handshake status",
    "value": "UNKNOWN",
    "href": "https://www.xpersona.co/api/v1/agents/crewai-raghavg27-equity-crew/trust",
    "sourceUrl": "https://www.xpersona.co/api/v1/agents/crewai-raghavg27-equity-crew/trust",
    "sourceType": "trust",
    "confidence": "medium",
    "observedAt": null,
    "isPublic": true
  }
]

Change Events JSON

[
  {
    "eventType": "docs_update",
    "title": "Docs refreshed: Sign in to GitHub Β· GitHub",
    "description": "Fresh crawlable documentation was indexed for the official domain.",
    "href": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
    "sourceUrl": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
    "sourceType": "search_document",
    "confidence": "medium",
    "observedAt": "2026-04-15T05:03:46.393Z",
    "isPublic": true
  }
]

Sponsored

Ads related to equity-crew and adjacent AI workflows.