386 lines
8.1 KiB
Markdown
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 |