12 KiB
Multi-Agent System Architecture
TradingAgents implements a multi-agent architecture that mirrors real-world trading firms, where specialized teams collaborate to make informed investment decisions.
System Overview
The framework decomposes complex trading analysis into specialized agent roles, each with specific responsibilities and expertise. Agents collaborate through structured workflows orchestrated by LangGraph.
┌─────────────────────────────────────────────────────────────────────┐
│ DATA LAYER │
├─────────────────────────────────────────────────────────────────────┤
│ yfinance │ Alpha Vantage │ FRED (NEW) │ Alpaca │ Multi-Timeframe │
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ ANALYSIS LAYER │
├─────────────────────────────────────────────────────────────────────┤
│ Market │ Momentum │ Macro │ Correlation │ News │ Fundamentals │
│ Analyst │ Analyst │ Analyst │ Analyst │ │ │
│ │ (NEW) │ (NEW) │ (NEW) │ │ │
├─────────────────────────────────────────────────────────────────────┤
│ Bull ←── Debate ──→ Bear → Research Manager │
├─────────────────────────────────────────────────────────────────────┤
│ Trader → Signal + Confidence Score │
├─────────────────────────────────────────────────────────────────────┤
│ Risk Debate → Position Sizing Manager (NEW) │
└─────────────────────────────────────────────────────────────────────┘
Agent Roles
Analyst Team
The analyst team conducts specialized analysis, each agent focusing on a specific domain:
Market Analyst (Technical)
- Responsibility: Technical analysis using price patterns and indicators
- Tools: MACD, RSI, Bollinger Bands, moving averages
- Output: Technical trends, support/resistance levels, momentum signals
- Location:
tradingagents/agents/analysts/market_analyst.py
Fundamentals Analyst
- Responsibility: Company financial health and valuation analysis
- Tools: Balance sheet, income statement, cash flow, financial ratios
- Output: Intrinsic value estimates, financial health assessment
- Location:
tradingagents/agents/analysts/fundamentals_analyst.py
Sentiment Analyst
- Responsibility: Social media and public sentiment analysis
- Tools: Reddit data (PRAW), sentiment scoring algorithms
- Output: Public sentiment scores, trending topics, investor mood
- Location:
tradingagents/agents/analysts/sentiment_analyst.py
News Analyst
- Responsibility: Global news and macroeconomic event analysis
- Tools: News APIs, event impact models
- Output: Event impact assessments, market-moving news identification
- Location:
tradingagents/agents/analysts/news_analyst.py
Researcher Team
Researchers engage in structured debates to evaluate analyst insights:
Bull Researcher
- Responsibility: Identify bullish opportunities and positive catalysts
- Approach: Seeks upside potential, growth drivers, favorable trends
- Output: Bull case arguments with supporting evidence
Bear Researcher
- Responsibility: Identify risks and potential downsides
- Approach: Seeks red flags, overvaluation signals, adverse conditions
- Output: Bear case arguments with risk assessments
Research Manager
- Responsibility: Moderate debates, synthesize perspectives
- Process: Coordinates debate rounds, ensures balanced analysis
- Output: Balanced research report with bull/bear synthesis
Trader Agent
The trader makes final trading decisions based on comprehensive analysis:
- Input: Analyst reports, researcher debates, market conditions
- Process: Weighs evidence, assesses conviction levels
- Output: Trading signal (BUY/SELL/HOLD) with confidence score
- Location:
tradingagents/agents/trader.py
Risk Management Team
Risk agents evaluate portfolio impact and validate strategies:
Risk Analysts
- Responsibility: Assess volatility, liquidity, correlation risks
- Tools: Risk metrics, scenario analysis, stress testing
- Output: Risk assessments with mitigation recommendations
Portfolio Manager
- Responsibility: Final approval/rejection of trading proposals
- Process: Reviews risk reports, validates against portfolio constraints
- Output: Approved orders or rejection with reasoning
- Location:
tradingagents/agents/portfolio_manager.py
Agent Workflow
1. Data Collection
All analysts access data through the unified data vendor interface:
from tradingagents.agents.utils.agent_utils import (
get_stock_data,
get_indicators,
get_fundamentals,
get_news
)
2. Parallel Analysis
Analysts work in parallel, each producing specialized reports:
Market Analyst → Technical Report
Fundamentals → Financial Report
Sentiment → Sentiment Report
News Analyst → Event Report
3. Research Debate
Researchers debate analyst findings over multiple rounds:
Round 1: Bull presents arguments → Bear counters
Round 2: Bear presents risks → Bull defends
...
Final: Research Manager synthesizes
Configuration: config["max_debate_rounds"] (default: 1)
4. Trading Decision
Trader evaluates research synthesis:
decision = {
"action": "BUY" | "SELL" | "HOLD",
"confidence_score": 0.0 to 1.0,
"reasoning": "...",
"position_size": float
}
5. Risk Validation
Risk team reviews the trading proposal:
Risk Analysts → Risk Assessment
Portfolio Manager → Approve or Reject
Configuration: config["max_risk_discuss_rounds"] (default: 1)
State Management
TradingAgents uses LangGraph for state management across the agent workflow.
AgentState
The main state object carries information through the graph:
@dataclass
class AgentState:
ticker: str
date: str
analyst_reports: Dict[str, str]
research_synthesis: str
trading_decision: Dict[str, Any]
risk_assessment: str
final_decision: Dict[str, Any]
Location: tradingagents/agents/utils/agent_states.py
InvestDebateState
Manages researcher debate rounds:
@dataclass
class InvestDebateState:
bull_arguments: List[str]
bear_arguments: List[str]
debate_round: int
synthesis: str
RiskDebateState
Manages risk team discussions:
@dataclass
class RiskDebateState:
risk_assessments: List[str]
discussion_round: int
final_recommendation: str
Memory System
Agents maintain context through a vector-based memory system:
FinancialSituationMemory
- Purpose: Store and retrieve historical analysis context
- Backend: ChromaDB vector store
- Features:
- Semantic search for relevant past analyses
- Recency, relevancy, and importance scoring (FinMem pattern)
- Persistent storage across runs
- Location:
tradingagents/agents/utils/memory.py
Tool Integration
Agents access data through a unified tool interface:
Data Tools
Available to all analyst agents:
get_stock_data(ticker, start_date, end_date)- Historical pricesget_indicators(ticker, indicators_list)- Technical indicatorsget_fundamentals(ticker)- Financial metricsget_balance_sheet(ticker)- Balance sheet dataget_cashflow(ticker)- Cash flow statementsget_income_statement(ticker)- Income statementsget_news(ticker, date)- Company-specific newsget_global_news(date)- Market-wide news
Location: tradingagents/agents/utils/agent_utils.py
Tool Nodes
LangGraph ToolNodes wrap data access functions:
from langgraph.prebuilt import ToolNode
analyst_tools = ToolNode([
get_stock_data,
get_indicators,
get_fundamentals
])
Conditional Routing
The graph uses conditional logic to route between agents:
Debate Continuation
def should_continue_debate(state: InvestDebateState) -> str:
if state.debate_round >= config["max_debate_rounds"]:
return "finalize"
return "continue_debate"
Risk Approval
def check_risk_approval(state: AgentState) -> str:
if state.risk_assessment["approved"]:
return "execute"
return "reject"
Location: tradingagents/graph/conditional_logic.py
Extensibility
The multi-agent architecture is designed for extensibility:
Adding New Analysts
- Create analyst class inheriting from base analyst
- Implement
analyze()method - Register in analyst list
- Agent automatically joins parallel analysis
Adding Custom Workflows
- Define new state classes
- Create agent nodes
- Add conditional routing logic
- Integrate into main graph
Performance Considerations
Parallel Execution
Analysts run in parallel to minimize latency:
# Analysts execute simultaneously
analyst_nodes = {
"market": market_analyst,
"fundamentals": fundamentals_analyst,
"sentiment": sentiment_analyst,
"news": news_analyst
}
Debate Rounds
More debate rounds increase analysis depth but also API costs:
- 1 round: Fast, lower cost, adequate for most cases
- 2-3 rounds: Deeper analysis, higher confidence
- 4+ rounds: Diminishing returns, significantly higher cost
Memory Optimization
Vector store queries are batched and cached:
memory = FinancialSituationMemory(
persist_directory="./memory_cache"
)
Best Practices
- Select Relevant Analysts: Only enable analysts needed for your strategy
- Tune Debate Rounds: Start with 1 round, increase only if needed
- Monitor API Usage: Track LLM API calls and costs
- Use Memory Wisely: Leverage past analyses for similar contexts
- Test Incrementally: Validate each agent's output before full integration