Overview
A robust backtesting framework is essential for validating strategies before live trading.
Key Principles
- Avoid look-ahead bias - Use only information available at decision time
- Realistic costs - Include all transaction costs and slippage
- Survivorship bias - Use point-in-time universes
- Out-of-sample testing - Reserve data for final validation
Simple Backtest Example
See Code Examples for a complete implementation of SimpleBacktest class.
Key features:
- Daily rebalancing
- Transaction cost modeling
- Position tracking
- Performance metrics
Performance Metrics
Returns-Based
- Total return
- Annualized return
- Volatility
- Sharpe ratio
- Maximum drawdown
- Calmar ratio
Risk-Adjusted
- Information ratio (vs benchmark)
- Sortino ratio
- Omega ratio
Factor Analysis
- Alpha and beta vs benchmarks
- Factor exposures over time
Common Pitfalls
Data issues:
- Using adjusted prices incorrectly
- Not handling splits/rolls properly
- Missing or incorrect data
Implementation issues:
- Trading at close prices (look-ahead)
- Ignoring partial fills
- Underestimating costs
Statistical issues:
- Overfitting to in-sample data
- Multiple testing (p-hacking)
- Ignoring regime changes
Walk-Forward Analysis
Best practice: rolling window optimization and testing.
- Train on window 1
- Test on window 2
- Slide forward and repeat
- Aggregate out-of-sample results
Typical windows:
- Training: 2-3 years
- Testing: 6-12 months
- Step size: 3-6 months
Cross-Validation
For parameter selection, use k-fold cross-validation:
- Split data into k folds
- Train on k-1, test on 1
- Repeat for all folds
- Select parameters with best average performance