14 KiB
TradingAgents Architecture Documentation
Multi-Agent Trading Framework
TradingAgents implements a sophisticated multi-agent system that mirrors real-world trading firms with specialized roles and structured workflows.
Core Architecture Components
1. Agent Teams (Sequential Workflow)
Analyst Team → Research Team → Trading Team → Risk Management Team
Analyst Team (tradingagents/agents/analysts/)
- Market Analyst: Technical analysis using Yahoo Finance and StockStats
- Fundamentals Analyst: Financial statements and company fundamentals via SimFin/Finnhub
- News Analyst: News sentiment analysis and world affairs impact
- Social Media Analyst: Reddit and social platform sentiment analysis
Research Team (tradingagents/agents/researchers/)
- Bull Researcher: Advocates for investment opportunities and growth potential
- Bear Researcher: Highlights risks and argues against investments
- Research Manager: Synthesizes debates and creates investment recommendations
Trading Team (tradingagents/agents/trader/)
- Trader: Converts investment plans into specific trading decisions
Risk Management Team (tradingagents/agents/risk_mgmt/)
- Aggressive/Conservative/Neutral Debators: Different risk perspectives
- Risk Manager: Final decision maker balancing risk and reward
2. Domain-Driven Architecture (tradingagents/domains/)
Domain-Driven Design (DDD) Architecture (Current): The system has been restructured using Domain-Driven Design principles with three main bounded contexts:
Domain Boundaries & Bounded Contexts:
- Financial Data Domain (
tradingagents/domains/marketdata/): Market prices, technical indicators, fundamentals, insider data - News Domain (
tradingagents/domains/news/): News articles, sentiment analysis, content aggregation - Social Media Domain (
tradingagents/domains/socialmedia/): Social media posts, engagement metrics, sentiment analysis
DDD Tactical Patterns per Domain:
- Domain Services: Business logic encapsulated in domain-specific services (
MarketDataService,NewsService,SocialMediaService) - Value Objects: Immutable data structures (
SentimentScore,TechnicalIndicatorData,PostMetadata) - Entities: Objects with identity and lifecycle (
NewsArticle,PostData) - Repository Pattern: Domain-specific data access with smart caching, deduplication, and gap detection
- Context Objects: Structured domain data containers (
MarketDataContext,NewsContext,SocialContext)
Domain Infrastructure per Bounded Context:
marketdata/
├── clients/ # YFinanceClient, FinnhubClient (domain-specific)
├── repos/ # MarketDataRepository, FundamentalRepository
├── services/ # MarketDataService, FundamentalDataService, InsiderDataService
└── models/ # Domain Value Objects and Entities
news/
├── clients/ # GoogleNewsClient (domain-specific)
├── repositories/ # NewsRepository with article deduplication
├── services/ # NewsService with sentiment analysis
└── models/ # NewsArticle, SentimentScore
socialmedia/
├── clients/ # RedditClient (domain-specific)
├── repositories/ # SocialMediaRepository with engagement tracking
├── services/ # SocialMediaService with sentiment analysis
└── models/ # PostData, EngagementMetrics
Agent Integration Strategy - Anti-Corruption Layer (ACL):
- AgentToolkit as ACL: Mediates between agents (string-based, procedural) and domains (object-oriented, rich models)
- Data Translation: Converts rich Pydantic domain models to structured JSON strings for LLM consumption
- Parameter Adaptation: Handles interface mismatches (single date → date ranges, etc.)
- Backward Compatibility: Preserves existing agent tool interface while providing domain service benefits
3. Graph Orchestration (tradingagents/graph/)
LangGraph-based workflow management:
- TradingAgentsGraph: Main orchestrator class
- State Management:
AgentState,InvestDebateState,RiskDebateStatetrack workflow progress - Conditional Logic: Dynamic routing based on tool usage and debate completion
- Memory System: ChromaDB-based vector memory for learning from past decisions
4. Configuration System
- TradingAgentsConfig: Centralized configuration with environment variable support
- Multi-LLM Support: OpenAI, Anthropic, Google, Ollama, OpenRouter
- Data Modes: Online (live APIs) vs offline (cached data)
Architecture Design Patterns and Principles
Core Design Principles
- Separation of Concerns: Each domain has clear boundaries and responsibilities
- Single Responsibility Principle: Each class and module has one reason to change
- Dependency Inversion: High-level modules depend on abstractions, not concrete implementations
- Open/Closed Principle: Modules are open for extension but closed for modification
- Interface Segregation: Clients only depend on methods they actually use
Key Architectural Patterns
-
Domain-Driven Design (DDD):
- Bounded contexts ensure clear separation between domains
- Ubiquitous language ensures consistent terminology across code and business
- Entities, Value Objects, and Aggregates provide rich domain models
- Repositories abstract data persistence concerns
-
Anti-Corruption Layer (ACL):
- AgentToolkit protects domain models from agent implementation details
- Translation layer ensures clean integration between procedural agents and object-oriented domains
- Backward compatibility maintained while improving architecture
-
Repository Pattern:
- Smart caching reduces API calls and improves performance
- Data deduplication ensures consistency
- Gap detection identifies missing data ranges
- Local storage provides offline capability
-
Service Layer Pattern:
- Business logic encapsulated in domain services
- Thin client implementations for API integrations
- Rich context objects provide structured data for agents
Data Flow Architecture
-
Request Processing:
- Agents request data through AgentToolkit
- Toolkit translates requests to domain service calls
- Services retrieve data from repositories or clients
- Results are formatted as structured context objects
-
Data Updates:
- Services can update repositories with fresh data
- Clients fetch data from external APIs
- Data is cached with metadata for quality assessment
-
Memory Integration:
- ChromaDB stores vector embeddings of past decisions
- Similar situations are retrieved for context-aware decision making
- Learning from historical performance improves future decisions
Key Design Patterns
- Debate-Driven Decision Making: Critical decisions emerge from structured agent debates
- Memory-Augmented Learning: Agents learn from past similar situations using vector similarity
- Repository-First Data Strategy: Services always read from repositories with separate update operations
- Structured JSON Contexts: Replace error-prone string parsing with rich Pydantic models
- Factory Pattern: Agent creation via factory functions for flexible configuration
- Signal Processing: Final trading decisions processed into clean BUY/SELL/HOLD signals
- Quality-Aware Data: All contexts include quality metadata to help agents make better decisions
Working with Agents
Current Approach (AgentToolkit as Anti-Corruption Layer):
- Use
AgentToolkitfromtradingagents.agents.libs.agent_toolkit - Toolkit injects all domain services via dependency injection
- Provides LangChain
@tooldecorated methods for agent consumption - Returns rich Pydantic domain models directly to agents
- Handles parameter validation, date calculations, and error handling
Agent Integration Pattern:
from tradingagents.agents.libs.agent_toolkit import AgentToolkit
# AgentToolkit acts as Anti-Corruption Layer
toolkit = AgentToolkit(
news_service=news_service,
marketdata_service=marketdata_service,
fundamentaldata_service=fundamentaldata_service,
socialmedia_service=socialmedia_service,
insiderdata_service=insiderdata_service
)
# Agents use toolkit tools that return rich domain contexts
@tool
def analyze_stock(symbol: str, date: str):
# Get structured contexts from domain services via toolkit
market_data = toolkit.get_market_data(symbol, start_date, end_date)
social_data = toolkit.get_socialmedia_stock_info(symbol, date)
news_data = toolkit.get_news(symbol, start_date, end_date)
# Work with rich Pydantic models
price = market_data.latest_price
sentiment = social_data.sentiment_summary.score
article_count = news_data.article_count
Working with Data Sources
Current Domain Service Approach:
- Repository-First: Services always read data from repositories (local storage)
- Separate Update Operations: Use dedicated update methods to fetch fresh data from APIs and store in repositories
- Clear Separation: Reading data vs updating data are separate concerns
- Structured Contexts: Services return rich Pydantic models with metadata
- Quality Awareness: All contexts include data quality and source information
Service Usage Pattern:
# Services use dependency injection
service = MarketDataService(
yfin_client=YFinanceClient(),
repo=MarketDataRepository("cache_dir")
)
# Always read from repository
context = service.get_market_data_context("AAPL", "2024-01-01", "2024-01-31")
# Separate update operation to refresh repository data
service.update_market_data("AAPL", "2024-01-01", "2024-01-31")
Performance Optimization Guidelines
The TradingAgents framework is designed for efficiency in financial analysis workflows. Here are key optimization strategies:
1. Caching and Data Management
Repository Pattern Caching:
- All domain services use repository-first data access pattern
- Data is cached locally to minimize API calls
- Smart caching with automatic invalidation based on data freshness
- Deduplication and gap detection in stored data
Best Practices:
# Efficient data access pattern
service = MarketDataService.build(config)
# Always read from repository first (cached data)
context = service.get_market_data_context("AAPL", "2024-01-01", "2024-01-31")
# Only update when fresh data is needed
service.update_market_data("AAPL", "2024-01-01", "2024-01-31")
2. LLM Cost and Performance Optimization
Model Selection Strategy:
- Use
quick_think_llmfor simple data retrieval and formatting tasks - Reserve
deep_think_llmfor complex analysis and decision-making - Configure appropriate models based on your cost/performance requirements
API Call Minimization:
- Batch similar requests when possible
- Cache LLM responses for identical queries
- Use structured outputs to reduce need for follow-up clarifications
3. Memory Management
Vector Memory Optimization:
- ChromaDB-based memory system automatically manages vector storage
- Configure memory retention policies to balance performance and storage
- Use memory efficiently by storing only key decision points and learnings
4. Parallel Processing
Graph Execution Optimization:
- LangGraph workflows can execute independent nodes in parallel
- Configure appropriate concurrency limits to avoid API rate limiting
- Monitor and optimize critical paths in the workflow graph
Configuration for Performance:
# Optimize for cost-sensitive environments
config = TradingAgentsConfig(
deep_think_llm="gpt-4.1-mini", # Lower cost model
quick_think_llm="gpt-4.1-mini", # Lower cost model
max_debate_rounds=1, # Reduce debate rounds
online_tools=False, # Use cached data when possible
default_lookback_days=30 # Limit data range
)
Data Directory Structure
The TradingAgents framework expects a specific directory structure for data storage:
project_dir/
├── results/ # Analysis results (configurable via results_dir)
├── dataflows/
│ └── data_cache/ # Cached data (automatically managed)
├── tradingagents/ # Core framework code
└── cli/ # Command-line interface
For custom data directories, ensure the path exists and is writable. The framework will automatically create necessary subdirectories for caching.
File Structure Context
cli/: Interactive command-line interfacetradingagents/agents/: All agent implementationslibs/agent_toolkit.py: AgentToolkit Anti-Corruption Layer with LangChain @tool decoratorslibs/context_helpers.py: Helper functions for parsing structured JSON datalibs/agent_utils.py: Legacy Toolkit (being phased out)
tradingagents/domains/: Domain-Driven Design bounded contextsmarketdata/: Financial data domain (prices, indicators, fundamentals, insider data)news/: News domain (articles, sentiment analysis)socialmedia/: Social media domain (posts, engagement, sentiment)
tradingagents/dataflows/: Legacy data source integrations (being phased out)tradingagents/graph/: LangGraph workflow orchestrationtradingagents/config.py: Configuration managementmain.py: Direct Python usage exampledocs/agent-development.md: Detailed agent documentation
Trading Strategy Implementation
The strategy is implemented through a graph-based workflow using LangGraph:
- Sequential Processing: Analyst teams process data in sequence
- Debate-Driven Decision Making: Researchers engage in structured debates
- Risk Assessment: Risk managers evaluate potential downside scenarios
- Signal Generation: Final trading decisions are processed into clean signals