TradingAgents/docs/DEVELOPMENT_GUIDE.md

386 lines
8.1 KiB
Markdown

# TradingAgents Backtest Development Guide
## Project Structure
```
TradingAgents/
├── tradingagents/
│ └── backtest/
│ ├── __init__.py
│ ├── ta_flow_strategy.py # Strategy wrapper
│ ├── engine.py # Simulation engine
│ ├── metrics.py # Performance metrics
│ ├── output.py # Output and reporting
│ └── persistence.py # Database storage
├── cli/
│ └── commands/
│ └── backtest.py # CLI commands
├── tests/
│ ├── unit/ # Unit tests
│ ├── integration/ # Integration tests
│ └── conftest.py # Test fixtures
├── docs/
│ ├── 001-007_*.md # Implementation tickets
│ ├── API_REFERENCE.md # API documentation
│ └── BACKTEST_README.md # User guide
└── requirements.txt # Dependencies
```
## Development Setup
### Environment Setup
```bash
# Create virtual environment
conda create -n tradingagents python=3.11
conda activate tradingagents
# Install dependencies
pip install -r requirements.txt
# Install in development mode
pip install -e .
```
### Required Environment Variables
```bash
export OPENAI_API_KEY=your_openai_api_key
export FINNHUB_API_KEY=your_finnhub_api_key
```
## Running Tests
### Unit Tests
```bash
# Run all unit tests
pytest tests/unit -v
# Run specific test file
pytest tests/unit/test_ta_flow_strategy.py -v
# Run with coverage
pytest tests/unit --cov=tradingagents.backtest --cov-report=html
```
### Integration Tests
```bash
# Run integration tests
pytest tests/integration -v -m integration
# Skip slow tests
pytest -m "not slow"
```
### Test Coverage
```bash
# Generate coverage report
pytest --cov=tradingagents.backtest --cov-report=html --cov-report=term-missing
# View HTML report
open htmlcov/index.html
```
## Code Style Guide
### Python Style
- Follow PEP 8
- Use type hints for all function signatures
- Maximum line length: 100 characters
- Use docstrings for all public methods
### Example:
```python
from typing import List, Dict, Optional
def calculate_metrics(
equity_curve: List[float],
trades: List[Trade],
initial_capital: float
) -> PerformanceMetrics:
"""Calculate performance metrics from backtest results.
Args:
equity_curve: List of portfolio values over time
trades: List of executed trades
initial_capital: Starting capital amount
Returns:
PerformanceMetrics object with calculated metrics
Raises:
ValueError: If equity_curve is empty
"""
if not equity_curve:
raise ValueError("Equity curve cannot be empty")
# Implementation
return metrics
```
### Import Order
1. Standard library imports
2. Third-party imports
3. Local application imports
```python
import logging
from dataclasses import dataclass
from typing import List, Optional
import pandas as pd
import numpy as np
from rich.console import Console
from tradingagents.backtest.metrics import PerformanceMetrics
from tradingagents.default_config import DEFAULT_CONFIG
```
## Adding New Features
### 1. Create Feature Branch
```bash
git checkout -b feature/new-indicator
```
### 2. Implement Feature
Follow the existing patterns:
```python
# In metrics.py
def _calculate_new_indicator(self, data: List[float]) -> float:
"""Calculate new indicator.
Args:
data: Input data series
Returns:
Calculated indicator value
"""
# Implementation
return result
```
### 3. Add Tests
```python
# In test_metrics_calculator.py
def test_new_indicator_calculation(self):
"""Test new indicator calculation."""
calculator = MetricsCalculator()
result = calculator._calculate_new_indicator([1, 2, 3, 4, 5])
assert result == expected_value
```
### 4. Update Documentation
- Add to API_REFERENCE.md
- Update relevant ticket documentation
- Add usage example to BACKTEST_README.md
## Debugging
### Enable Debug Logging
```python
import logging
logging.basicConfig(level=logging.DEBUG)
# Or for specific module
logger = logging.getLogger('tradingagents.backtest')
logger.setLevel(logging.DEBUG)
```
### Common Issues
#### Issue: "No price data available"
**Solution:** Check internet connection and ticker symbol validity
#### Issue: LLM timeout
**Solution:** Increase timeout or use faster model
```python
config = {
"quick_think_llm": "gpt-4o-mini", # Faster model
"max_debate_rounds": 1, # Reduce rounds
}
```
#### Issue: Memory error with large backtests
**Solution:** Process in chunks or reduce date range
## Performance Optimization
### 1. Use Offline Mode
Always set `online_tools = False` for backtesting to use cached data.
### 2. Optimize LLM Usage
```python
config = {
"quick_think_llm": "gpt-4o-mini", # Use faster model
"max_debate_rounds": 1, # Reduce debate rounds
}
```
### 3. Batch Processing
Process multiple backtests efficiently:
```python
tickers = ["AAPL", "GOOGL", "MSFT"]
results = []
for ticker in tickers:
result = engine.run(ticker=ticker, ...)
results.append(result)
# Save periodically to avoid memory issues
if len(results) % 10 == 0:
save_results(results)
results.clear()
```
## Database Schema
### backtests table
```sql
CREATE TABLE backtests (
id INTEGER PRIMARY KEY,
ticker VARCHAR(10),
start_date DATE,
end_date DATE,
initial_capital DECIMAL(10,2),
final_capital DECIMAL(10,2),
total_return DECIMAL(10,4),
sharpe_ratio DECIMAL(10,4),
-- ... other metrics
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
### trades table
```sql
CREATE TABLE trades (
id INTEGER PRIMARY KEY,
backtest_id INTEGER,
trade_date DATE,
action VARCHAR(10),
price DECIMAL(10,4),
shares DECIMAL(10,4),
fee DECIMAL(10,4),
FOREIGN KEY (backtest_id) REFERENCES backtests(id)
);
```
## Contributing
### Pull Request Process
1. Create feature branch from `main`
2. Write tests for new functionality
3. Ensure all tests pass
4. Update documentation
5. Submit PR with clear description
### Commit Messages
Follow conventional commits:
```
feat: add new performance metric
fix: correct slippage calculation
docs: update API reference
test: add integration tests for persistence
refactor: simplify metrics calculation
```
## Release Process
1. Update version in `setup.py`
2. Update CHANGELOG.md
3. Run full test suite
4. Create release tag
5. Build and publish package
```bash
# Build package
python setup.py sdist bdist_wheel
# Upload to PyPI (if applicable)
twine upload dist/*
```
## Monitoring and Maintenance
### Log Files
Logs are stored in:
- `logs/backtest_*.log` - Backtest execution logs
- `results_dir/*/message_tool.log` - Agent communication logs
### Database Maintenance
```python
# Backup database
from tradingagents.backtest.persistence import DataMigration
DataMigration.backup_database("results.sqlite", "backup/results_backup.sqlite")
# Export to CSV
repository = BacktestRepository()
DataMigration.export_to_csv(repository, backtest_id=1, output_dir="exports/")
```
### Performance Monitoring
Monitor key metrics:
- Execution time per backtest
- Memory usage
- Database size
- API call counts
## Future Enhancements
### Planned Features
1. **Multi-asset Portfolio Backtesting**
- Support multiple positions
- Portfolio rebalancing
- Correlation analysis
2. **Advanced Risk Metrics**
- VaR (Value at Risk)
- CVaR (Conditional VaR)
- Sortino ratio
3. **Real-time Integration**
- Live trading connection
- Paper trading mode
- Alert system
4. **Performance Optimization**
- Parallel processing
- GPU acceleration for metrics
- Distributed backtesting
### Extension Points
The framework is designed to be extensible:
1. **Custom Strategies**: Implement the `decide()` method
2. **Custom Metrics**: Extend `MetricsCalculator`
3. **Custom Output Formats**: Extend `ReportManager`
4. **Custom Data Sources**: Implement data fetcher interface