333 lines
11 KiB
Markdown
333 lines
11 KiB
Markdown
|
|
# Strategy Backtest Runner
|
|||
|
|
|
|||
|
|
A comprehensive and efficient backtest runner for executing predefined trading strategies with advanced visualization and analysis capabilities.
|
|||
|
|
|
|||
|
|
## Overview
|
|||
|
|
|
|||
|
|
The Strategy Backtest Runner (`strategy_run.py`) executes specific trading strategies with predefined parameters defined in a JSON configuration file. Unlike the parameter optimization script, this runner focuses on testing and comparing specific strategy configurations with detailed market analysis and visualization.
|
|||
|
|
|
|||
|
|
## Features
|
|||
|
|
|
|||
|
|
- **JSON Configuration**: Define strategies and parameters in easy-to-edit JSON files
|
|||
|
|
- **Multiple Strategy Support**: Run multiple strategies in sequence with a single command
|
|||
|
|
- **All Strategy Types**: Support for MetaTrend, BBRS, and Random strategies
|
|||
|
|
- **Organized Results**: Automatic folder structure creation for each run
|
|||
|
|
- **Advanced Visualization**: Detailed plots showing portfolio performance and market context
|
|||
|
|
- **Full Market Data Integration**: Continuous price charts with buy/sell signals overlay
|
|||
|
|
- **Signal Export**: Complete buy/sell signal data exported to CSV files
|
|||
|
|
- **Real-time File Saving**: Individual strategy results saved immediately upon completion
|
|||
|
|
- **Comprehensive Analysis**: Multiple plot types for thorough performance analysis
|
|||
|
|
- **Detailed Results**: Comprehensive result reporting with CSV and JSON export
|
|||
|
|
- **Result Analysis**: Automatic summary generation and performance comparison
|
|||
|
|
- **Error Handling**: Robust error handling with detailed logging
|
|||
|
|
- **Flexible Configuration**: Support for different data files, date ranges, and trader parameters
|
|||
|
|
|
|||
|
|
## Usage
|
|||
|
|
|
|||
|
|
### Basic Usage
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Run strategies from a configuration file
|
|||
|
|
python test/backtest/strategy_run.py --config configs/strategy/example_strategies.json
|
|||
|
|
|
|||
|
|
# Save results to a custom directory
|
|||
|
|
python test/backtest/strategy_run.py --config configs/strategy/my_strategies.json --results-dir my_results
|
|||
|
|
|
|||
|
|
# Enable verbose logging
|
|||
|
|
python test/backtest/strategy_run.py --config configs/strategy/example_strategies.json --verbose
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Enhanced Analysis Features
|
|||
|
|
|
|||
|
|
Each run automatically generates:
|
|||
|
|
- **Organized folder structure** with timestamp for easy management
|
|||
|
|
- **Real-time file saving** - results saved immediately after each strategy completes
|
|||
|
|
- **Full market data visualization** - continuous price charts show complete market context
|
|||
|
|
- **Signal tracking** - all buy/sell decisions exported with precise timing and pricing
|
|||
|
|
- **Multi-layered analysis** - from individual trade details to portfolio-wide comparisons
|
|||
|
|
- **Professional plots** - high-resolution (300 DPI) charts suitable for reports and presentations
|
|||
|
|
|
|||
|
|
### Create Example Configuration
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Create an example configuration file
|
|||
|
|
python test/backtest/strategy_run.py --create-example configs/example_strategies.json
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Configuration File Format
|
|||
|
|
|
|||
|
|
The configuration file uses JSON format with two main sections:
|
|||
|
|
|
|||
|
|
### Backtest Settings
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"backtest_settings": {
|
|||
|
|
"data_file": "btcusd_1-min_data.csv",
|
|||
|
|
"data_dir": "data",
|
|||
|
|
"start_date": "2023-01-01",
|
|||
|
|
"end_date": "2023-01-31",
|
|||
|
|
"initial_usd": 10000
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Strategy Definitions
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"strategies": [
|
|||
|
|
{
|
|||
|
|
"name": "MetaTrend_Conservative",
|
|||
|
|
"type": "metatrend",
|
|||
|
|
"params": {
|
|||
|
|
"supertrend_periods": [12, 10, 11],
|
|||
|
|
"supertrend_multipliers": [3.0, 1.0, 2.0],
|
|||
|
|
"min_trend_agreement": 0.8,
|
|||
|
|
"timeframe": "15min"
|
|||
|
|
},
|
|||
|
|
"trader_params": {
|
|||
|
|
"stop_loss_pct": 0.02,
|
|||
|
|
"portfolio_percent_per_trade": 0.5
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Strategy Types
|
|||
|
|
|
|||
|
|
### MetaTrend Strategy
|
|||
|
|
|
|||
|
|
Parameters:
|
|||
|
|
- `supertrend_periods`: List of periods for multiple supertrend indicators
|
|||
|
|
- `supertrend_multipliers`: List of multipliers for supertrend indicators
|
|||
|
|
- `min_trend_agreement`: Minimum agreement threshold between indicators (0.0-1.0)
|
|||
|
|
- `timeframe`: Data aggregation timeframe ("1min", "5min", "15min", "30min", "1h")
|
|||
|
|
|
|||
|
|
### BBRS Strategy
|
|||
|
|
|
|||
|
|
Parameters:
|
|||
|
|
- `bb_length`: Bollinger Bands period
|
|||
|
|
- `bb_std`: Bollinger Bands standard deviation multiplier
|
|||
|
|
- `rsi_length`: RSI period
|
|||
|
|
- `rsi_overbought`: RSI overbought threshold
|
|||
|
|
- `rsi_oversold`: RSI oversold threshold
|
|||
|
|
- `timeframe`: Data aggregation timeframe
|
|||
|
|
|
|||
|
|
### Random Strategy
|
|||
|
|
|
|||
|
|
Parameters:
|
|||
|
|
- `signal_probability`: Probability of generating a signal (0.0-1.0)
|
|||
|
|
- `timeframe`: Data aggregation timeframe
|
|||
|
|
|
|||
|
|
## Trader Parameters
|
|||
|
|
|
|||
|
|
All strategies support these trader parameters:
|
|||
|
|
- `stop_loss_pct`: Stop loss percentage (e.g., 0.02 for 2%)
|
|||
|
|
- `portfolio_percent_per_trade`: Percentage of portfolio to use per trade (0.0-1.0)
|
|||
|
|
|
|||
|
|
## Results Organization
|
|||
|
|
|
|||
|
|
Each run creates an organized folder structure for easy navigation and analysis:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
results/
|
|||
|
|
└── [config_name]_[timestamp]/
|
|||
|
|
├── strategy_1_[strategy_name].json # Individual strategy data
|
|||
|
|
├── strategy_1_[strategy_name]_plot.png # 4-panel performance plot
|
|||
|
|
├── strategy_1_[strategy_name]_detailed_plot.png # 3-panel market analysis
|
|||
|
|
├── strategy_1_[strategy_name]_trades.csv # Trade details
|
|||
|
|
├── strategy_1_[strategy_name]_signals.csv # All buy/sell signals
|
|||
|
|
├── strategy_2_[strategy_name].* # Second strategy files
|
|||
|
|
├── ... # Additional strategies
|
|||
|
|
├── summary.csv # Strategy comparison table
|
|||
|
|
├── summary_plot.png # Multi-strategy comparison
|
|||
|
|
└── summary_*.json # Comprehensive results
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Visualization Types
|
|||
|
|
|
|||
|
|
The runner generates three types of plots for comprehensive analysis:
|
|||
|
|
|
|||
|
|
### 1. Individual Strategy Plot (4-Panel)
|
|||
|
|
- **Equity Curve**: Portfolio value over time
|
|||
|
|
- **Trade P&L**: Individual trade profits/losses
|
|||
|
|
- **Drawdown**: Portfolio drawdown visualization
|
|||
|
|
- **Statistics**: Strategy performance summary
|
|||
|
|
|
|||
|
|
### 2. Detailed Market Analysis Plot (3-Panel)
|
|||
|
|
- **Portfolio Signals**: Portfolio value with buy/sell signal markers
|
|||
|
|
- **Market Price**: Full continuous market price with entry/exit points
|
|||
|
|
- **Combined View**: Dual-axis plot showing market vs portfolio performance
|
|||
|
|
|
|||
|
|
### 3. Summary Comparison Plot (4-Panel)
|
|||
|
|
- **Returns Comparison**: Total returns across all strategies
|
|||
|
|
- **Trade Counts**: Number of trades per strategy
|
|||
|
|
- **Risk vs Return**: Win rate vs maximum drawdown scatter plot
|
|||
|
|
- **Statistics Table**: Comprehensive performance metrics
|
|||
|
|
|
|||
|
|
## Output Files
|
|||
|
|
|
|||
|
|
The runner generates comprehensive output files organized in dedicated folders:
|
|||
|
|
|
|||
|
|
### Individual Strategy Files (per strategy)
|
|||
|
|
- `strategy_N_[name].json`: Complete strategy data and metadata
|
|||
|
|
- `strategy_N_[name]_plot.png`: 4-panel performance analysis plot
|
|||
|
|
- `strategy_N_[name]_detailed_plot.png`: 3-panel market context plot
|
|||
|
|
- `strategy_N_[name]_trades.csv`: Detailed trade information
|
|||
|
|
- `strategy_N_[name]_signals.csv`: All buy/sell signals with timestamps
|
|||
|
|
|
|||
|
|
### Summary Files (per run)
|
|||
|
|
- `summary.csv`: Strategy comparison table
|
|||
|
|
- `summary_plot.png`: Multi-strategy comparison visualization
|
|||
|
|
- `summary_*.json`: Comprehensive results and metadata
|
|||
|
|
|
|||
|
|
### Signal Data Format
|
|||
|
|
Each signal CSV contains:
|
|||
|
|
- `signal_id`: Unique signal identifier
|
|||
|
|
- `signal_type`: BUY or SELL
|
|||
|
|
- `time`: Signal timestamp
|
|||
|
|
- `price`: Execution price
|
|||
|
|
- `trade_id`: Associated trade number
|
|||
|
|
- `quantity`: Trade quantity
|
|||
|
|
- `value`: Trade value (quantity × price)
|
|||
|
|
- `strategy`: Strategy name
|
|||
|
|
|
|||
|
|
## Example Configurations
|
|||
|
|
|
|||
|
|
### Simple MetaTrend Test
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"backtest_settings": {
|
|||
|
|
"data_file": "btcusd_1-min_data.csv",
|
|||
|
|
"start_date": "2023-01-01",
|
|||
|
|
"end_date": "2023-01-07",
|
|||
|
|
"initial_usd": 10000
|
|||
|
|
},
|
|||
|
|
"strategies": [
|
|||
|
|
{
|
|||
|
|
"name": "MetaTrend_Test",
|
|||
|
|
"type": "metatrend",
|
|||
|
|
"params": {
|
|||
|
|
"supertrend_periods": [12, 10],
|
|||
|
|
"supertrend_multipliers": [3.0, 1.0],
|
|||
|
|
"min_trend_agreement": 0.5,
|
|||
|
|
"timeframe": "15min"
|
|||
|
|
},
|
|||
|
|
"trader_params": {
|
|||
|
|
"stop_loss_pct": 0.02,
|
|||
|
|
"portfolio_percent_per_trade": 0.5
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Multiple Strategy Comparison
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"backtest_settings": {
|
|||
|
|
"data_file": "btcusd_1-min_data.csv",
|
|||
|
|
"start_date": "2023-01-01",
|
|||
|
|
"end_date": "2023-01-31",
|
|||
|
|
"initial_usd": 10000
|
|||
|
|
},
|
|||
|
|
"strategies": [
|
|||
|
|
{
|
|||
|
|
"name": "Conservative_MetaTrend",
|
|||
|
|
"type": "metatrend",
|
|||
|
|
"params": {
|
|||
|
|
"supertrend_periods": [12, 10, 11],
|
|||
|
|
"supertrend_multipliers": [3.0, 1.0, 2.0],
|
|||
|
|
"min_trend_agreement": 0.8,
|
|||
|
|
"timeframe": "15min"
|
|||
|
|
},
|
|||
|
|
"trader_params": {
|
|||
|
|
"stop_loss_pct": 0.02,
|
|||
|
|
"portfolio_percent_per_trade": 0.5
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"name": "Aggressive_MetaTrend",
|
|||
|
|
"type": "metatrend",
|
|||
|
|
"params": {
|
|||
|
|
"supertrend_periods": [10, 8],
|
|||
|
|
"supertrend_multipliers": [2.0, 1.0],
|
|||
|
|
"min_trend_agreement": 0.5,
|
|||
|
|
"timeframe": "5min"
|
|||
|
|
},
|
|||
|
|
"trader_params": {
|
|||
|
|
"stop_loss_pct": 0.03,
|
|||
|
|
"portfolio_percent_per_trade": 0.8
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"name": "BBRS_Baseline",
|
|||
|
|
"type": "bbrs",
|
|||
|
|
"params": {
|
|||
|
|
"bb_length": 20,
|
|||
|
|
"bb_std": 2.0,
|
|||
|
|
"rsi_length": 14,
|
|||
|
|
"rsi_overbought": 70,
|
|||
|
|
"rsi_oversold": 30,
|
|||
|
|
"timeframe": "15min"
|
|||
|
|
},
|
|||
|
|
"trader_params": {
|
|||
|
|
"stop_loss_pct": 0.025,
|
|||
|
|
"portfolio_percent_per_trade": 0.6
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Command Line Options
|
|||
|
|
|
|||
|
|
- `--config`: Path to JSON configuration file (required)
|
|||
|
|
- `--results-dir`: Directory for saving results (default: "results")
|
|||
|
|
- `--create-example`: Create example config file at specified path
|
|||
|
|
- `--verbose`: Enable verbose logging for debugging
|
|||
|
|
|
|||
|
|
## Error Handling
|
|||
|
|
|
|||
|
|
The runner includes comprehensive error handling:
|
|||
|
|
|
|||
|
|
- **Configuration Validation**: Validates JSON structure and required fields
|
|||
|
|
- **Data File Verification**: Checks if data files exist before running
|
|||
|
|
- **Strategy Creation**: Handles unknown strategy types gracefully
|
|||
|
|
- **Backtest Execution**: Captures and logs individual strategy failures
|
|||
|
|
- **Result Saving**: Ensures results are saved even if some strategies fail
|
|||
|
|
|
|||
|
|
## Integration
|
|||
|
|
|
|||
|
|
This runner integrates seamlessly with the existing IncrementalTrader framework:
|
|||
|
|
|
|||
|
|
- Uses the same `IncBacktester` and strategy classes
|
|||
|
|
- Compatible with all existing data formats
|
|||
|
|
- Leverages the same result saving utilities
|
|||
|
|
- Maintains consistency with optimization scripts
|
|||
|
|
|
|||
|
|
## Performance
|
|||
|
|
|
|||
|
|
- **Sequential Execution**: Strategies run one after another for clear logging
|
|||
|
|
- **Real-time Results**: Individual strategy files saved immediately upon completion
|
|||
|
|
- **Efficient Data Loading**: Market data loaded once per run for all visualizations
|
|||
|
|
- **Progress Tracking**: Clear progress indication for long-running backtests
|
|||
|
|
- **Detailed Timing**: Individual strategy execution times are tracked
|
|||
|
|
- **High-Quality Output**: Professional 300 DPI plots suitable for presentations
|
|||
|
|
|
|||
|
|
## Best Practices
|
|||
|
|
|
|||
|
|
1. **Start Small**: Test with short date ranges first
|
|||
|
|
2. **Validate Data**: Ensure data files exist and cover the specified date range
|
|||
|
|
3. **Monitor Resources**: Watch memory usage for very long backtests
|
|||
|
|
4. **Save Configs**: Keep configuration files organized for reproducibility
|
|||
|
|
5. **Use Descriptive Names**: Give strategies clear, descriptive names
|
|||
|
|
6. **Test Incrementally**: Add strategies one by one when debugging
|
|||
|
|
7. **Leverage Visualizations**: Use detailed plots to understand market context and strategy behavior
|
|||
|
|
8. **Analyze Signals**: Review signal CSV files to understand strategy decision patterns
|
|||
|
|
9. **Compare Runs**: Use organized folder structure to compare different parameter sets
|
|||
|
|
10. **Monitor Execution**: Watch real-time progress as individual strategies complete
|