Expand description
Walk-forward parameter optimisation for backtesting strategies.
Walk-forward testing prevents overfitting by splitting historical data into rolling in-sample (training) and out-of-sample (test) windows. For each window, the best parameters are discovered on the in-sample slice via grid search, then validated on the subsequent out-of-sample slice.
§How it works
|--- in-sample (IS) ---|--- out-of-sample (OOS) ---|
|-- step --|--- IS ---|--- OOS ---|
|-- step --|--- IS ---|--- OOS ---|Aggregate metrics from all OOS windows provide an unbiased estimate of real-world strategy performance.
§Example
ⓘ
use finance_query::backtesting::{
BacktestConfig, SmaCrossover,
optimizer::{GridSearch, OptimizeMetric, ParamRange},
walk_forward::WalkForwardConfig,
};
let grid = GridSearch::new()
.param("fast", ParamRange::int_range(5, 30, 5))
.param("slow", ParamRange::int_range(20, 100, 10))
.optimize_for(OptimizeMetric::SharpeRatio);
let wf = WalkForwardConfig::new(grid, BacktestConfig::default())
.in_sample_bars(252)
.out_of_sample_bars(63);
let report = wf
.run("AAPL", candles, |params| SmaCrossover::new(
params["fast"].as_int() as usize,
params["slow"].as_int() as usize,
))
.unwrap();
println!("OOS consistency: {:.1}%", report.consistency_ratio * 100.0);Structs§
- Walk
Forward Config - Configuration for a walk-forward parameter optimisation test.
- Walk
Forward Report - Aggregate walk-forward report across all windows.
- Window
Result - Backtest results for a single walk-forward window pair.