- Added a new CLI tool `scripts/strategy_sweep.py` for executing parameter sweeps. - Updated `get_signal()` and `_calc_signals()` methods to accept `signal_threshold`, `adx_threshold`, and `volume_multiplier` parameters for improved signal processing. - Fixed a bug in `WalkForwardBacktester` that prevented proper propagation of signal parameters, ensuring accurate backtesting results. - Updated documentation to reflect changes in parameter sweeps and results. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
4.5 KiB
4.5 KiB
Strategy Parameter Sweep Plan
Date: 2026-03-06 Status: Completed
Goal
Find profitable parameter combinations for the base technical indicator strategy (ML OFF) using walk-forward backtesting, targeting PF >= 1.0 as foundation for ML redesign.
Background
Walk-forward backtest revealed the current XRP strategy is unprofitable (PF 0.71, -641 PnL). The strategy parameter sweep systematically tests 324 combinations of 5 parameters to find profitable regimes.
Parameters Swept
| Parameter | Values | Description |
|---|---|---|
atr_sl_mult |
1.0, 1.5, 2.0 | Stop-loss ATR multiplier |
atr_tp_mult |
2.0, 3.0, 4.0 | Take-profit ATR multiplier |
signal_threshold |
3, 4, 5 | Min weighted indicator score for entry |
adx_threshold |
0, 20, 25, 30 | ADX filter (0=disabled, N=require ADX>=N) |
volume_multiplier |
1.5, 2.0, 2.5 | Volume surge detection multiplier |
Total combinations: 3 x 3 x 3 x 4 x 3 = 324
Implementation
Files Modified
src/indicators.py—get_signal()acceptssignal_threshold,adx_threshold,volume_multiplierparamssrc/dataset_builder.py—_calc_signals()accepts same params for vectorized computationsrc/backtester.py—BacktestConfigincludes strategy params;WalkForwardBacktesterpropagates them to test folds
Files Created
scripts/strategy_sweep.py— CLI tool for parameter grid sweep
Bug Fix
WalkForwardBacktesterwas not passingsignal_threshold,adx_threshold,volume_multiplier, oruse_mlto foldBacktestConfig. All signal params were silently using defaults, making ADX/volume/threshold sweeps have zero effect.
Results (XRPUSDT, Walk-Forward 3/1)
Top 10 Combinations
| Rank | SL×ATR | TP×ATR | Signal | ADX | Vol | Trades | WinRate | PF | MDD | PnL | Sharpe |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1.5 | 4.0 | 3 | 30 | 2.5 | 19 | 52.6% | 2.39 | 7.0% | +469 | 61.0 |
| 2 | 1.5 | 2.0 | 3 | 30 | 2.5 | 19 | 68.4% | 2.23 | 6.5% | +282 | 61.2 |
| 3 | 1.0 | 2.0 | 3 | 30 | 2.5 | 19 | 57.9% | 1.98 | 5.0% | +213 | 50.8 |
| 4 | 1.0 | 4.0 | 3 | 30 | 2.5 | 19 | 36.8% | 1.80 | 7.7% | +248 | 37.1 |
| 5 | 1.5 | 3.0 | 3 | 30 | 2.5 | 19 | 52.6% | 1.76 | 10.1% | +258 | 40.9 |
| 6 | 1.5 | 4.0 | 3 | 25 | 2.5 | 28 | 42.9% | 1.75 | 13.1% | +381 | 36.8 |
| 7 | 2.0 | 4.0 | 3 | 30 | 1.5 | 39 | 48.7% | 1.67 | 16.9% | +572 | 35.3 |
| 8 | 1.0 | 2.0 | 3 | 25 | 2.5 | 28 | 50.0% | 1.64 | 5.8% | +205 | 35.7 |
| 9 | 1.5 | 2.0 | 3 | 25 | 2.5 | 28 | 57.1% | 1.62 | 10.3% | +229 | 35.7 |
| 10 | 2.0 | 2.0 | 3 | 25 | 2.5 | 27 | 66.7% | 1.57 | 12.0% | +217 | 33.3 |
Current Production (Rank 93/324)
| SL×ATR | TP×ATR | Signal | ADX | Vol | Trades | WinRate | PF | MDD | PnL |
|---|---|---|---|---|---|---|---|---|---|
| 1.5 | 3.0 | 3 | 0 | 1.5 | 118 | 30.5% | 0.71 | 65.9% | -641 |
Key Findings
- ADX filter is the single most impactful parameter. All top 10 results use ADX >= 25, with ADX=30 dominating the top 5. This filters out sideways/ranging markets where signals are noise.
- Volume multiplier 2.5 dominates. Higher volume thresholds ensure entries only on strong conviction (genuine breakouts vs. noise).
- Signal threshold 3 is optimal. Higher thresholds (4, 5) produced too few trades or zero trades in most ADX-filtered regimes.
- SL/TP ratios matter less than entry filters. The top results span all SL/TP combos, but all share ADX=25-30 + Vol=2.5.
- Trade count drops significantly with filters. Top combos have 19-39 trades vs. 118 for current. Fewer but higher quality entries.
- 41 combinations achieved PF >= 1.0 out of 324 total (12.7%).
Recommended Next Steps
- Update production defaults: ADX=25, volume_multiplier=2.0 as a conservative choice (more trades than ADX=30)
- Validate on TRXUSDT and DOGEUSDT to confirm ADX filter is not XRP-specific
- Retrain ML models with updated strategy params — the ML filter should now have a profitable base to improve upon
- Fine-tune sweep around the profitable zone: ADX [25-35], Vol [2.0-3.0]