Files
GoldRegime_X/logfiles_cmd.txt
T
Luke Mosoti 7b21e40345 Refactor XGBoost training and prediction logic; update signal thresholds
- Removed redundant `gmm_vol_cluster` feature from XGBoost training to improve efficiency.
- Adjusted feature selection for bucket models in `train_xgb_ensemble`.
- Updated probability thresholds for trading signals to enhance decision-making.
- Standardized exit confirmation bars for different timeframes in the signal engine.
2026-05-18 11:45:43 +03:00

3698 lines
631 KiB
Plaintext

PS C:\GoldRegime_X> python main.py --mode optimize --tf M15 --broker headway_cent --balance 15 --trials 70 --stage xgb
[2026-05-18 10:08:07,610 INFO] main: Optimizing [M15] broker=headway_cent balance=$15 trials=70 wfo_mode=standard stage=xgb
[I 2026-05-18 10:08:08,918] A new study created in RDB with name: gold_regime_x_small_headway_cent_M15_stage1
Starting Stage-1 XGB study 'gold_regime_x_small_headway_cent_M15_stage1' — target 70 trials.
Mode: single hold-out (no CPCV) — ~5x faster per trial than Stage-2.
0%| | 0/70 [00:00<?, ?it/s][2026-05-18 10:09:30,855 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:09:30,856 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:09:30,856 INFO] src.engine_hmm: Bull 0.9557 0.0109 0.0006 0.0328
[2026-05-18 10:09:30,856 INFO] src.engine_hmm: Bear 0.0321 0.9664 0.0003 0.0011
[2026-05-18 10:09:30,856 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0237
[2026-05-18 10:09:30,856 INFO] src.engine_hmm: Chop_High 0.0242 0.0016 0.0260 0.9482
[2026-05-18 10:09:30,856 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:09:30,856 INFO] src.engine_hmm: Bull: return=0.053093, vol=0.383243, rsi_slope=0.000966
[2026-05-18 10:09:30,858 INFO] src.engine_hmm: Bear: return=-0.154323, vol=1.886947, rsi_slope=0.009066
[2026-05-18 10:09:30,858 INFO] src.engine_hmm: Chop_Low: return=-0.019348, vol=-0.670449, rsi_slope=0.000186
[2026-05-18 10:09:30,858 INFO] src.engine_hmm: Chop_High: return=0.028119, vol=-0.246414, rsi_slope=-0.004004
[2026-05-18 10:09:30,859 INFO] src.engine_hmm: Total regime transitions: 9508
[2026-05-18 10:09:30,860 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:09:30,860 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:09:30,861 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:09:30,861 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:09:30,861 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:09:30,861 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:09:30,862 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:09:30,862 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:09:30,862 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:09:30,862 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:09:31,027 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:09:31,043 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:09:31,166 INFO] src.engine_xgb: XGB Train Acc: 0.4958 | Test Acc: 0.4757
[2026-05-18 10:09:31,166 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.18125868), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.121668674), 'atr_normalized': np.float32(0.11979276), 'prev_log_return': np.float32(0.122063786), 'usdchf_log_return': np.float32(0.11456487), 'xagusd_log_return': np.float32(0.10200521), 'xtiusd_log_return': np.float32(0.119207785), 'synth_vix_zscore': np.float32(0.119438246)}
[2026-05-18 10:09:31,167 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:09:31,264 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4829
[2026-05-18 10:09:31,265 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.119686715), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.18164131), 'atr_normalized': np.float32(0.12666038), 'prev_log_return': np.float32(0.12105007), 'usdchf_log_return': np.float32(0.117550686), 'xagusd_log_return': np.float32(0.11017453), 'xtiusd_log_return': np.float32(0.10063765), 'synth_vix_zscore': np.float32(0.12259875)}
[2026-05-18 10:09:31,265 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:09:31,426 INFO] src.engine_xgb: XGB Train Acc: 0.5052 | Test Acc: 0.5103
[2026-05-18 10:09:31,426 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08595445), 'gmm_vol_cluster': np.float32(0.13443919), 'rsi_slope': np.float32(0.11269794), 'atr_normalized': np.float32(0.11225159), 'prev_log_return': np.float32(0.118802875), 'usdchf_log_return': np.float32(0.10855967), 'xagusd_log_return': np.float32(0.10881137), 'xtiusd_log_return': np.float32(0.11146752), 'synth_vix_zscore': np.float32(0.10701537)}
[2026-05-18 10:09:31,427 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:09:31,428 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:09:31,840 INFO] src.backtester: Backtest [M15]: Sharpe=-12.554 | MaxDD=1.694 | WR=0.335 | Return=-81.6% | Trades=2178
[2026-05-18 10:09:31,840 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:09:32,170 INFO] src.engine_xgb: XGB Train Acc: 0.5083 | Test Acc: 0.5430
[2026-05-18 10:09:32,170 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14121565), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1265689), 'atr_normalized': np.float32(0.12215621), 'prev_log_return': np.float32(0.1340688), 'usdchf_log_return': np.float32(0.11842039), 'xagusd_log_return': np.float32(0.11946803), 'xtiusd_log_return': np.float32(0.122550964), 'synth_vix_zscore': np.float32(0.11555108)}
[2026-05-18 10:09:32,171 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:09:32,341 INFO] src.engine_xgb: XGB Train Acc: 0.5129 | Test Acc: 0.5423
[2026-05-18 10:09:32,341 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10366461), 'gmm_vol_cluster': np.float32(0.18141653), 'rsi_slope': np.float32(0.12014099), 'atr_normalized': np.float32(0.09705702), 'prev_log_return': np.float32(0.11670031), 'usdchf_log_return': np.float32(0.0963334), 'xagusd_log_return': np.float32(0.09842761), 'xtiusd_log_return': np.float32(0.08914461), 'synth_vix_zscore': np.float32(0.097114906)}
[2026-05-18 10:09:32,342 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:09:32,514 INFO] src.engine_xgb: XGB Train Acc: 0.5066 | Test Acc: 0.4994
[2026-05-18 10:09:32,515 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08402207), 'gmm_vol_cluster': np.float32(0.08947584), 'rsi_slope': np.float32(0.1265503), 'atr_normalized': np.float32(0.10825438), 'prev_log_return': np.float32(0.13522437), 'usdchf_log_return': np.float32(0.10561838), 'xagusd_log_return': np.float32(0.12168081), 'xtiusd_log_return': np.float32(0.099601865), 'synth_vix_zscore': np.float32(0.12957203)}
[2026-05-18 10:09:32,515 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:09:32,516 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:09:32,930 INFO] src.backtester: Backtest [M15]: Sharpe=-15.160 | MaxDD=2.159 | WR=0.328 | Return=-88.4% | Trades=2652
[2026-05-18 10:09:32,931 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:09:33,277 INFO] src.engine_xgb: XGB Train Acc: 0.5045 | Test Acc: 0.5131
[2026-05-18 10:09:33,277 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13632424), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13276528), 'atr_normalized': np.float32(0.1192087), 'prev_log_return': np.float32(0.12837411), 'usdchf_log_return': np.float32(0.12760639), 'xagusd_log_return': np.float32(0.121960014), 'xtiusd_log_return': np.float32(0.10929306), 'synth_vix_zscore': np.float32(0.124468215)}
[2026-05-18 10:09:33,278 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:09:33,475 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4869
[2026-05-18 10:09:33,476 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.122872174), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14369017), 'atr_normalized': np.float32(0.130355), 'prev_log_return': np.float32(0.13546956), 'usdchf_log_return': np.float32(0.10266593), 'xagusd_log_return': np.float32(0.13293988), 'xtiusd_log_return': np.float32(0.11774614), 'synth_vix_zscore': np.float32(0.114261106)}
[2026-05-18 10:09:33,476 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:09:33,689 INFO] src.engine_xgb: XGB Train Acc: 0.5053 | Test Acc: 0.4984
[2026-05-18 10:09:33,690 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.109308615), 'gmm_vol_cluster': np.float32(0.08106229), 'rsi_slope': np.float32(0.12518634), 'atr_normalized': np.float32(0.109997734), 'prev_log_return': np.float32(0.12409739), 'usdchf_log_return': np.float32(0.11075982), 'xagusd_log_return': np.float32(0.10978014), 'xtiusd_log_return': np.float32(0.10589541), 'synth_vix_zscore': np.float32(0.123912245)}
[2026-05-18 10:09:33,691 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:09:33,692 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:09:34,097 INFO] src.backtester: Backtest [M15]: Sharpe=-14.754 | MaxDD=2.117 | WR=0.333 | Return=-87.8% | Trades=2547
[2026-05-18 10:09:34,097 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:09:34,412 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5433
[2026-05-18 10:09:34,413 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13334695), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13650408), 'atr_normalized': np.float32(0.12068435), 'prev_log_return': np.float32(0.12564367), 'usdchf_log_return': np.float32(0.12350402), 'xagusd_log_return': np.float32(0.11585802), 'xtiusd_log_return': np.float32(0.12262506), 'synth_vix_zscore': np.float32(0.121833846)}
[2026-05-18 10:09:34,413 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:09:34,959 INFO] src.engine_xgb: XGB Train Acc: 0.5123 | Test Acc: 0.5348
[2026-05-18 10:09:34,960 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10448064), 'gmm_vol_cluster': np.float32(0.1307196), 'rsi_slope': np.float32(0.12066166), 'atr_normalized': np.float32(0.10319768), 'prev_log_return': np.float32(0.1150047), 'usdchf_log_return': np.float32(0.1080353), 'xagusd_log_return': np.float32(0.10653879), 'xtiusd_log_return': np.float32(0.10190665), 'synth_vix_zscore': np.float32(0.10945497)}
[2026-05-18 10:09:34,960 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:09:35,234 INFO] src.engine_xgb: XGB Train Acc: 0.5101 | Test Acc: 0.5252
[2026-05-18 10:09:35,234 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11324786), 'gmm_vol_cluster': np.float32(0.12566149), 'rsi_slope': np.float32(0.122581415), 'atr_normalized': np.float32(0.106316425), 'prev_log_return': np.float32(0.108330205), 'usdchf_log_return': np.float32(0.10032377), 'xagusd_log_return': np.float32(0.111976065), 'xtiusd_log_return': np.float32(0.093609855), 'synth_vix_zscore': np.float32(0.11795285)}
[2026-05-18 10:09:35,236 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:09:35,237 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:09:35,372 INFO] src.backtester: Backtest [M15]: Sharpe=-14.585 | MaxDD=0.438 | WR=0.359 | Return=-35.5% | Trades=526
[2026-05-18 10:09:35,372 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 0. Best value: -50: 1%|█ | 1/70 [01:26<1:39:26, 86.47s/it][2026-05-18 10:11:12,892 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:11:12,893 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:11:12,893 INFO] src.engine_hmm: Bull 0.9557 0.0109 0.0006 0.0328
[2026-05-18 10:11:12,894 INFO] src.engine_hmm: Bear 0.0319 0.9666 0.0003 0.0012
[2026-05-18 10:11:12,894 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0236
[2026-05-18 10:11:12,894 INFO] src.engine_hmm: Chop_High 0.0242 0.0016 0.0260 0.9482
[2026-05-18 10:11:12,895 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:11:12,895 INFO] src.engine_hmm: Bull: return=0.052279, vol=0.383160, rsi_slope=0.000785
[2026-05-18 10:11:12,895 INFO] src.engine_hmm: Bear: return=-0.152220, vol=1.881173, rsi_slope=0.009369
[2026-05-18 10:11:12,896 INFO] src.engine_hmm: Chop_Low: return=-0.019697, vol=-0.670155, rsi_slope=0.000278
[2026-05-18 10:11:12,896 INFO] src.engine_hmm: Chop_High: return=0.028732, vol=-0.246022, rsi_slope=-0.004070
[2026-05-18 10:11:12,899 INFO] src.engine_hmm: Total regime transitions: 9494
[2026-05-18 10:11:12,900 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:11:12,900 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:11:12,901 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:11:12,901 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:11:12,902 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:11:12,902 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:11:12,903 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:11:12,903 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:11:12,903 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:11:12,904 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:11:13,128 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:11:13,153 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:11:13,330 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:11:13,331 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.231121), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.10377295), 'atr_normalized': np.float32(0.11639866), 'prev_log_return': np.float32(0.117639035), 'usdchf_log_return': np.float32(0.10553889), 'xagusd_log_return': np.float32(0.095749706), 'xtiusd_log_return': np.float32(0.09807819), 'synth_vix_zscore': np.float32(0.1317016)}
[2026-05-18 10:11:13,331 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:11:13,440 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.5171
[2026-05-18 10:11:13,440 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12169425), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.18390803), 'atr_normalized': np.float32(0.110876575), 'prev_log_return': np.float32(0.117142305), 'usdchf_log_return': np.float32(0.11810886), 'xagusd_log_return': np.float32(0.11288217), 'xtiusd_log_return': np.float32(0.117225744), 'synth_vix_zscore': np.float32(0.118162036)}
[2026-05-18 10:11:13,441 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:11:13,629 INFO] src.engine_xgb: XGB Train Acc: 0.5195 | Test Acc: 0.4925
[2026-05-18 10:11:13,630 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.105244726), 'gmm_vol_cluster': np.float32(0.119611576), 'rsi_slope': np.float32(0.1092032), 'atr_normalized': np.float32(0.107843995), 'prev_log_return': np.float32(0.11793655), 'usdchf_log_return': np.float32(0.10593591), 'xagusd_log_return': np.float32(0.11885577), 'xtiusd_log_return': np.float32(0.10585434), 'synth_vix_zscore': np.float32(0.1095139)}
[2026-05-18 10:11:13,630 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:11:13,632 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:11:14,015 INFO] src.backtester: Backtest [M15]: Sharpe=-1.727 | MaxDD=0.188 | WR=0.383 | Return=-16.7% | Trades=410
[2026-05-18 10:11:14,016 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:11:14,331 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 10:11:14,332 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11141697), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13415518), 'atr_normalized': np.float32(0.13108745), 'prev_log_return': np.float32(0.14599894), 'usdchf_log_return': np.float32(0.12280269), 'xagusd_log_return': np.float32(0.11025396), 'xtiusd_log_return': np.float32(0.120588206), 'synth_vix_zscore': np.float32(0.12369659)}
[2026-05-18 10:11:14,332 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:11:14,639 INFO] src.engine_xgb: XGB Train Acc: 0.5248 | Test Acc: 0.4736
[2026-05-18 10:11:14,640 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.102895804), 'gmm_vol_cluster': np.float32(0.12336425), 'rsi_slope': np.float32(0.12460412), 'atr_normalized': np.float32(0.100134216), 'prev_log_return': np.float32(0.114979126), 'usdchf_log_return': np.float32(0.10298251), 'xagusd_log_return': np.float32(0.110394664), 'xtiusd_log_return': np.float32(0.11122416), 'synth_vix_zscore': np.float32(0.10942113)}
[2026-05-18 10:11:14,640 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:11:14,859 INFO] src.engine_xgb: XGB Train Acc: 0.5016 | Test Acc: 0.5008
[2026-05-18 10:11:14,859 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08193356), 'gmm_vol_cluster': np.float32(0.08243159), 'rsi_slope': np.float32(0.12948601), 'atr_normalized': np.float32(0.10451457), 'prev_log_return': np.float32(0.1375632), 'usdchf_log_return': np.float32(0.103880815), 'xagusd_log_return': np.float32(0.12283561), 'xtiusd_log_return': np.float32(0.10669582), 'synth_vix_zscore': np.float32(0.13065882)}
[2026-05-18 10:11:14,860 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:11:14,861 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:11:15,253 INFO] src.backtester: Backtest [M15]: Sharpe=-2.408 | MaxDD=0.115 | WR=0.327 | Return=-10.3% | Trades=153
[2026-05-18 10:11:15,254 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:11:15,672 INFO] src.engine_xgb: XGB Train Acc: 0.4956 | Test Acc: 0.4871
[2026-05-18 10:11:15,672 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13129929), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14073601), 'atr_normalized': np.float32(0.11365231), 'prev_log_return': np.float32(0.1397541), 'usdchf_log_return': np.float32(0.11777868), 'xagusd_log_return': np.float32(0.12579091), 'xtiusd_log_return': np.float32(0.11126493), 'synth_vix_zscore': np.float32(0.119723774)}
[2026-05-18 10:11:15,673 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:11:15,952 INFO] src.engine_xgb: XGB Train Acc: 0.5046 | Test Acc: 0.5129
[2026-05-18 10:11:15,953 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11669015), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14188187), 'atr_normalized': np.float32(0.12230615), 'prev_log_return': np.float32(0.1443893), 'usdchf_log_return': np.float32(0.11017601), 'xagusd_log_return': np.float32(0.12661663), 'xtiusd_log_return': np.float32(0.11743475), 'synth_vix_zscore': np.float32(0.12050513)}
[2026-05-18 10:11:15,953 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:11:16,196 INFO] src.engine_xgb: XGB Train Acc: 0.4958 | Test Acc: 0.5019
[2026-05-18 10:11:16,197 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11420013), 'gmm_vol_cluster': np.float32(0.09666771), 'rsi_slope': np.float32(0.11959662), 'atr_normalized': np.float32(0.10256776), 'prev_log_return': np.float32(0.119031094), 'usdchf_log_return': np.float32(0.10828993), 'xagusd_log_return': np.float32(0.108356714), 'xtiusd_log_return': np.float32(0.106330834), 'synth_vix_zscore': np.float32(0.124959156)}
[2026-05-18 10:11:16,197 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:11:16,199 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:11:16,796 INFO] src.backtester: Backtest [M15]: Sharpe=-2.013 | MaxDD=0.075 | WR=0.300 | Return=-7.0% | Trades=60
[2026-05-18 10:11:16,796 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:11:17,185 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:11:17,185 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11153527), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14147621), 'atr_normalized': np.float32(0.12156203), 'prev_log_return': np.float32(0.13691834), 'usdchf_log_return': np.float32(0.12444737), 'xagusd_log_return': np.float32(0.11335597), 'xtiusd_log_return': np.float32(0.12803966), 'synth_vix_zscore': np.float32(0.122665115)}
[2026-05-18 10:11:17,185 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:11:17,629 INFO] src.engine_xgb: XGB Train Acc: 0.5117 | Test Acc: 0.4783
[2026-05-18 10:11:17,629 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.108627215), 'gmm_vol_cluster': np.float32(0.122721754), 'rsi_slope': np.float32(0.12588084), 'atr_normalized': np.float32(0.10487977), 'prev_log_return': np.float32(0.11439266), 'usdchf_log_return': np.float32(0.10237083), 'xagusd_log_return': np.float32(0.10132879), 'xtiusd_log_return': np.float32(0.10915613), 'synth_vix_zscore': np.float32(0.110641964)}
[2026-05-18 10:11:17,630 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:11:17,980 INFO] src.engine_xgb: XGB Train Acc: 0.4900 | Test Acc: 0.4747
[2026-05-18 10:11:17,981 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12067429), 'gmm_vol_cluster': np.float32(0.09108642), 'rsi_slope': np.float32(0.13916521), 'atr_normalized': np.float32(0.111314826), 'prev_log_return': np.float32(0.11579669), 'usdchf_log_return': np.float32(0.10366454), 'xagusd_log_return': np.float32(0.09891812), 'xtiusd_log_return': np.float32(0.09674869), 'synth_vix_zscore': np.float32(0.12263114)}
[2026-05-18 10:11:17,981 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:11:17,983 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:11:18,097 INFO] src.backtester: Backtest [M15]: Sharpe=1.527 | MaxDD=0.013 | WR=0.486 | Return=2.2% | Trades=37
[2026-05-18 10:11:18,098 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 0. Best value: -50: 3%|██▏ | 2/70 [03:09<1:48:53, 96.08s/it][2026-05-18 10:13:01,761 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:13:01,762 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:13:01,762 INFO] src.engine_hmm: Bull 0.9553 0.0107 0.0007 0.0333
[2026-05-18 10:13:01,762 INFO] src.engine_hmm: Bear 0.0369 0.9625 0.0001 0.0005
[2026-05-18 10:13:01,762 INFO] src.engine_hmm: Chop_Low 0.0012 0.0009 0.9732 0.0247
[2026-05-18 10:13:01,762 INFO] src.engine_hmm: Chop_High 0.0235 0.0024 0.0265 0.9476
[2026-05-18 10:13:01,763 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:13:01,763 INFO] src.engine_hmm: Bull: return=0.057331, vol=0.382272, rsi_slope=0.003480
[2026-05-18 10:13:01,763 INFO] src.engine_hmm: Bear: return=-0.163865, vol=1.939433, rsi_slope=0.006925
[2026-05-18 10:13:01,763 INFO] src.engine_hmm: Chop_Low: return=-0.008893, vol=-0.673785, rsi_slope=-0.001181
[2026-05-18 10:13:01,763 INFO] src.engine_hmm: Chop_High: return=0.014622, vol=-0.251391, rsi_slope=-0.003866
[2026-05-18 10:13:01,765 INFO] src.engine_hmm: Total regime transitions: 9762
[2026-05-18 10:13:01,765 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:13:01,766 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:13:01,766 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:13:01,766 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:30:00: Bear -> Bull
[2026-05-18 10:13:01,766 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:13:01,766 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:13:01,767 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:13:01,767 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:13:01,767 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:13:01,767 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:13:01,980 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:13:02,002 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:13:02,161 INFO] src.engine_xgb: XGB Train Acc: 0.5301 | Test Acc: 0.5020
[2026-05-18 10:13:02,161 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.18805127), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.108602665), 'atr_normalized': np.float32(0.118061185), 'prev_log_return': np.float32(0.13241017), 'usdchf_log_return': np.float32(0.095354244), 'xagusd_log_return': np.float32(0.102840796), 'xtiusd_log_return': np.float32(0.126656), 'synth_vix_zscore': np.float32(0.12802362)}
[2026-05-18 10:13:02,162 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:13:02,250 INFO] src.engine_xgb: XGB Train Acc: 0.5361 | Test Acc: 0.5081
[2026-05-18 10:13:02,251 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.113666445), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.17033009), 'atr_normalized': np.float32(0.115707316), 'prev_log_return': np.float32(0.13215102), 'usdchf_log_return': np.float32(0.11955285), 'xagusd_log_return': np.float32(0.114617415), 'xtiusd_log_return': np.float32(0.11274965), 'synth_vix_zscore': np.float32(0.12122515)}
[2026-05-18 10:13:02,251 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:13:02,379 INFO] src.engine_xgb: XGB Train Acc: 0.5577 | Test Acc: 0.5117
[2026-05-18 10:13:02,380 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12426639), 'gmm_vol_cluster': np.float32(0.10192659), 'rsi_slope': np.float32(0.10064038), 'atr_normalized': np.float32(0.11442338), 'prev_log_return': np.float32(0.1259119), 'usdchf_log_return': np.float32(0.109476216), 'xagusd_log_return': np.float32(0.11182437), 'xtiusd_log_return': np.float32(0.110921234), 'synth_vix_zscore': np.float32(0.10060957)}
[2026-05-18 10:13:02,380 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:13:02,382 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:13:02,857 INFO] src.backtester: Backtest [M15]: Sharpe=-5.262 | MaxDD=0.544 | WR=0.366 | Return=-41.9% | Trades=784
[2026-05-18 10:13:02,858 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:13:03,147 INFO] src.engine_xgb: XGB Train Acc: 0.5242 | Test Acc: 0.5076
[2026-05-18 10:13:03,147 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12405835), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.122416556), 'atr_normalized': np.float32(0.12933634), 'prev_log_return': np.float32(0.14074849), 'usdchf_log_return': np.float32(0.12414031), 'xagusd_log_return': np.float32(0.11851826), 'xtiusd_log_return': np.float32(0.11536538), 'synth_vix_zscore': np.float32(0.12541637)}
[2026-05-18 10:13:03,148 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:13:03,277 INFO] src.engine_xgb: XGB Train Acc: 0.5305 | Test Acc: 0.5156
[2026-05-18 10:13:03,277 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12087375), 'gmm_vol_cluster': np.float32(0.14115527), 'rsi_slope': np.float32(0.11833199), 'atr_normalized': np.float32(0.10847153), 'prev_log_return': np.float32(0.11663005), 'usdchf_log_return': np.float32(0.10120245), 'xagusd_log_return': np.float32(0.101033166), 'xtiusd_log_return': np.float32(0.09680408), 'synth_vix_zscore': np.float32(0.09549771)}
[2026-05-18 10:13:03,278 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:13:03,403 INFO] src.engine_xgb: XGB Train Acc: 0.5229 | Test Acc: 0.5001
[2026-05-18 10:13:03,403 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.095811814), 'gmm_vol_cluster': np.float32(0.100229174), 'rsi_slope': np.float32(0.12834729), 'atr_normalized': np.float32(0.09841012), 'prev_log_return': np.float32(0.12678663), 'usdchf_log_return': np.float32(0.112015456), 'xagusd_log_return': np.float32(0.11455636), 'xtiusd_log_return': np.float32(0.09665538), 'synth_vix_zscore': np.float32(0.12718776)}
[2026-05-18 10:13:03,404 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:13:03,404 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:13:03,802 INFO] src.backtester: Backtest [M15]: Sharpe=-0.349 | MaxDD=0.003 | WR=0.750 | Return=-0.1% | Trades=4
[2026-05-18 10:13:03,802 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:13:04,135 INFO] src.engine_xgb: XGB Train Acc: 0.5163 | Test Acc: 0.5014
[2026-05-18 10:13:04,136 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09935562), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12747559), 'atr_normalized': np.float32(0.13039331), 'prev_log_return': np.float32(0.1300849), 'usdchf_log_return': np.float32(0.12975718), 'xagusd_log_return': np.float32(0.13322107), 'xtiusd_log_return': np.float32(0.11810447), 'synth_vix_zscore': np.float32(0.13160776)}
[2026-05-18 10:13:04,136 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:13:04,325 INFO] src.engine_xgb: XGB Train Acc: 0.5102 | Test Acc: 0.4885
[2026-05-18 10:13:04,325 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08521), 'gmm_vol_cluster': np.float32(0.1773385), 'rsi_slope': np.float32(0.12199394), 'atr_normalized': np.float32(0.09524657), 'prev_log_return': np.float32(0.114295416), 'usdchf_log_return': np.float32(0.10291732), 'xagusd_log_return': np.float32(0.10702532), 'xtiusd_log_return': np.float32(0.09979774), 'synth_vix_zscore': np.float32(0.096175246)}
[2026-05-18 10:13:04,326 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:13:04,526 INFO] src.engine_xgb: XGB Train Acc: 0.5371 | Test Acc: 0.5123
[2026-05-18 10:13:04,527 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12700304), 'gmm_vol_cluster': np.float32(0.119591966), 'rsi_slope': np.float32(0.11939194), 'atr_normalized': np.float32(0.101383), 'prev_log_return': np.float32(0.11839359), 'usdchf_log_return': np.float32(0.09799107), 'xagusd_log_return': np.float32(0.103935674), 'xtiusd_log_return': np.float32(0.09423006), 'synth_vix_zscore': np.float32(0.11807971)}
[2026-05-18 10:13:04,528 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:13:04,529 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:13:05,004 INFO] src.backtester: Backtest [M15]: Sharpe=-2.106 | MaxDD=0.072 | WR=0.337 | Return=-7.0% | Trades=89
[2026-05-18 10:13:05,004 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:13:05,406 INFO] src.engine_xgb: XGB Train Acc: 0.5197 | Test Acc: 0.5013
[2026-05-18 10:13:05,406 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12627438), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13698561), 'atr_normalized': np.float32(0.12248964), 'prev_log_return': np.float32(0.12993367), 'usdchf_log_return': np.float32(0.13027209), 'xagusd_log_return': np.float32(0.10726849), 'xtiusd_log_return': np.float32(0.11752005), 'synth_vix_zscore': np.float32(0.12925605)}
[2026-05-18 10:13:05,407 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:13:05,688 INFO] src.engine_xgb: XGB Train Acc: 0.5414 | Test Acc: 0.5234
[2026-05-18 10:13:05,688 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11594275), 'gmm_vol_cluster': np.float32(0.11046655), 'rsi_slope': np.float32(0.13316128), 'atr_normalized': np.float32(0.094792426), 'prev_log_return': np.float32(0.115312204), 'usdchf_log_return': np.float32(0.10428307), 'xagusd_log_return': np.float32(0.10727047), 'xtiusd_log_return': np.float32(0.10181824), 'synth_vix_zscore': np.float32(0.116953)}
[2026-05-18 10:13:05,689 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:13:05,956 INFO] src.engine_xgb: XGB Train Acc: 0.5328 | Test Acc: 0.5187
[2026-05-18 10:13:05,957 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.111032784), 'gmm_vol_cluster': np.float32(0.09538737), 'rsi_slope': np.float32(0.12897679), 'atr_normalized': np.float32(0.11033635), 'prev_log_return': np.float32(0.12090213), 'usdchf_log_return': np.float32(0.10912151), 'xagusd_log_return': np.float32(0.10044145), 'xtiusd_log_return': np.float32(0.10242873), 'synth_vix_zscore': np.float32(0.121372834)}
[2026-05-18 10:13:05,958 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:13:05,959 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:13:06,042 INFO] src.backtester: Backtest [M15]: Sharpe=0.551 | MaxDD=0.012 | WR=0.462 | Return=0.3% | Trades=13
[2026-05-18 10:13:06,042 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 0. Best value: -50: 4%|███▎ | 3/70 [04:57<1:53:17, 101.46s/it][2026-05-18 10:14:37,597 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:14:37,597 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:14:37,598 INFO] src.engine_hmm: Bull 0.9559 0.0106 0.0006 0.0329
[2026-05-18 10:14:37,598 INFO] src.engine_hmm: Bear 0.0342 0.9648 0.0003 0.0006
[2026-05-18 10:14:37,599 INFO] src.engine_hmm: Chop_Low 0.0013 0.0007 0.9740 0.0241
[2026-05-18 10:14:37,599 INFO] src.engine_hmm: Chop_High 0.0239 0.0018 0.0259 0.9485
[2026-05-18 10:14:37,599 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:14:37,600 INFO] src.engine_hmm: Bull: return=0.054889, vol=0.389262, rsi_slope=0.001899
[2026-05-18 10:14:37,600 INFO] src.engine_hmm: Bear: return=-0.161309, vol=1.951855, rsi_slope=0.007603
[2026-05-18 10:14:37,601 INFO] src.engine_hmm: Chop_Low: return=-0.015680, vol=-0.672061, rsi_slope=-0.000393
[2026-05-18 10:14:37,601 INFO] src.engine_hmm: Chop_High: return=0.022080, vol=-0.247470, rsi_slope=-0.003541
[2026-05-18 10:14:37,603 INFO] src.engine_hmm: Total regime transitions: 9562
[2026-05-18 10:14:37,604 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:14:37,604 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:14:37,605 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:14:37,605 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:14:37,606 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:14:37,606 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:14:37,606 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:14:37,607 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:14:37,607 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:14:37,609 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:14:37,842 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:14:37,863 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:14:38,040 INFO] src.engine_xgb: XGB Train Acc: 0.4958 | Test Acc: 0.4757
[2026-05-18 10:14:38,041 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.2148846), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.10691826), 'atr_normalized': np.float32(0.116491124), 'prev_log_return': np.float32(0.115209915), 'usdchf_log_return': np.float32(0.108315624), 'xagusd_log_return': np.float32(0.098096415), 'xtiusd_log_return': np.float32(0.11471216), 'synth_vix_zscore': np.float32(0.12537198)}
[2026-05-18 10:14:38,042 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:14:38,252 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4829
[2026-05-18 10:14:38,253 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12441913), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15619735), 'atr_normalized': np.float32(0.11793207), 'prev_log_return': np.float32(0.12706012), 'usdchf_log_return': np.float32(0.12088541), 'xagusd_log_return': np.float32(0.11797011), 'xtiusd_log_return': np.float32(0.1202581), 'synth_vix_zscore': np.float32(0.1152777)}
[2026-05-18 10:14:38,253 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:14:38,665 INFO] src.engine_xgb: XGB Train Acc: 0.5052 | Test Acc: 0.5103
[2026-05-18 10:14:38,665 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10034266), 'gmm_vol_cluster': np.float32(0.10656194), 'rsi_slope': np.float32(0.11537196), 'atr_normalized': np.float32(0.11581492), 'prev_log_return': np.float32(0.12096199), 'usdchf_log_return': np.float32(0.10955095), 'xagusd_log_return': np.float32(0.10930523), 'xtiusd_log_return': np.float32(0.11298408), 'synth_vix_zscore': np.float32(0.10910628)}
[2026-05-18 10:14:38,666 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:14:38,667 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:14:39,257 INFO] src.backtester: Backtest [M15]: Sharpe=-12.615 | MaxDD=1.708 | WR=0.331 | Return=-81.8% | Trades=2189
[2026-05-18 10:14:39,258 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:14:39,672 INFO] src.engine_xgb: XGB Train Acc: 0.5083 | Test Acc: 0.5430
[2026-05-18 10:14:39,672 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15155227), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.125092), 'atr_normalized': np.float32(0.12315203), 'prev_log_return': np.float32(0.12869889), 'usdchf_log_return': np.float32(0.11854827), 'xagusd_log_return': np.float32(0.105747476), 'xtiusd_log_return': np.float32(0.120486625), 'synth_vix_zscore': np.float32(0.12672248)}
[2026-05-18 10:14:39,673 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:14:40,026 INFO] src.engine_xgb: XGB Train Acc: 0.5129 | Test Acc: 0.5423
[2026-05-18 10:14:40,026 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.097931765), 'gmm_vol_cluster': np.float32(0.14549585), 'rsi_slope': np.float32(0.1299352), 'atr_normalized': np.float32(0.09806594), 'prev_log_return': np.float32(0.11212668), 'usdchf_log_return': np.float32(0.100264326), 'xagusd_log_return': np.float32(0.10000139), 'xtiusd_log_return': np.float32(0.10417855), 'synth_vix_zscore': np.float32(0.1120003)}
[2026-05-18 10:14:40,027 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:14:40,202 INFO] src.engine_xgb: XGB Train Acc: 0.5066 | Test Acc: 0.4994
[2026-05-18 10:14:40,203 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09621921), 'gmm_vol_cluster': np.float32(0.1009311), 'rsi_slope': np.float32(0.1393938), 'atr_normalized': np.float32(0.100518286), 'prev_log_return': np.float32(0.12578262), 'usdchf_log_return': np.float32(0.09947928), 'xagusd_log_return': np.float32(0.112548724), 'xtiusd_log_return': np.float32(0.09259541), 'synth_vix_zscore': np.float32(0.1325316)}
[2026-05-18 10:14:40,203 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:14:40,204 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:14:40,705 INFO] src.backtester: Backtest [M15]: Sharpe=-15.105 | MaxDD=2.162 | WR=0.328 | Return=-88.5% | Trades=2681
[2026-05-18 10:14:40,706 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:14:41,053 INFO] src.engine_xgb: XGB Train Acc: 0.5045 | Test Acc: 0.5131
[2026-05-18 10:14:41,054 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.108390376), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14096998), 'atr_normalized': np.float32(0.12897539), 'prev_log_return': np.float32(0.15779689), 'usdchf_log_return': np.float32(0.11457864), 'xagusd_log_return': np.float32(0.12728627), 'xtiusd_log_return': np.float32(0.10943976), 'synth_vix_zscore': np.float32(0.11256272)}
[2026-05-18 10:14:41,054 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:14:41,351 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4869
[2026-05-18 10:14:41,352 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08913567), 'gmm_vol_cluster': np.float32(0.1533533), 'rsi_slope': np.float32(0.13080612), 'atr_normalized': np.float32(0.09206091), 'prev_log_return': np.float32(0.12648904), 'usdchf_log_return': np.float32(0.09843391), 'xagusd_log_return': np.float32(0.10654053), 'xtiusd_log_return': np.float32(0.104155734), 'synth_vix_zscore': np.float32(0.09902486)}
[2026-05-18 10:14:41,352 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:14:41,670 INFO] src.engine_xgb: XGB Train Acc: 0.5053 | Test Acc: 0.4984
[2026-05-18 10:14:41,670 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13324918), 'gmm_vol_cluster': np.float32(0.094122685), 'rsi_slope': np.float32(0.12449598), 'atr_normalized': np.float32(0.095212616), 'prev_log_return': np.float32(0.12210053), 'usdchf_log_return': np.float32(0.10056082), 'xagusd_log_return': np.float32(0.10765563), 'xtiusd_log_return': np.float32(0.10248655), 'synth_vix_zscore': np.float32(0.12011602)}
[2026-05-18 10:14:41,671 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:14:41,672 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:14:42,371 INFO] src.backtester: Backtest [M15]: Sharpe=-14.639 | MaxDD=2.119 | WR=0.336 | Return=-87.8% | Trades=2572
[2026-05-18 10:14:42,371 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:14:42,773 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5433
[2026-05-18 10:14:42,773 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1101471), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14409812), 'atr_normalized': np.float32(0.124402106), 'prev_log_return': np.float32(0.148263), 'usdchf_log_return': np.float32(0.12629476), 'xagusd_log_return': np.float32(0.11666062), 'xtiusd_log_return': np.float32(0.11740352), 'synth_vix_zscore': np.float32(0.11273077)}
[2026-05-18 10:14:42,774 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:14:43,347 INFO] src.engine_xgb: XGB Train Acc: 0.5123 | Test Acc: 0.5348
[2026-05-18 10:14:43,347 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09752392), 'gmm_vol_cluster': np.float32(0.114382565), 'rsi_slope': np.float32(0.13570313), 'atr_normalized': np.float32(0.10197974), 'prev_log_return': np.float32(0.11925104), 'usdchf_log_return': np.float32(0.10882568), 'xagusd_log_return': np.float32(0.10596174), 'xtiusd_log_return': np.float32(0.10737769), 'synth_vix_zscore': np.float32(0.10899449)}
[2026-05-18 10:14:43,348 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:14:44,118 INFO] src.engine_xgb: XGB Train Acc: 0.5101 | Test Acc: 0.5252
[2026-05-18 10:14:44,118 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12368536), 'gmm_vol_cluster': np.float32(0.09058225), 'rsi_slope': np.float32(0.1385273), 'atr_normalized': np.float32(0.10578324), 'prev_log_return': np.float32(0.114924304), 'usdchf_log_return': np.float32(0.1075578), 'xagusd_log_return': np.float32(0.101492934), 'xtiusd_log_return': np.float32(0.100796714), 'synth_vix_zscore': np.float32(0.11665014)}
[2026-05-18 10:14:44,119 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:14:44,121 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:14:44,267 INFO] src.backtester: Backtest [M15]: Sharpe=-14.011 | MaxDD=0.435 | WR=0.375 | Return=-35.3% | Trades=542
[2026-05-18 10:14:44,268 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 0. Best value: -50: 6%|████▎ | 4/70 [06:35<1:50:14, 100.21s/it][2026-05-18 10:17:19,315 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:17:19,316 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:17:19,316 INFO] src.engine_hmm: Bull 0.9557 0.0109 0.0006 0.0328
[2026-05-18 10:17:19,317 INFO] src.engine_hmm: Bear 0.0318 0.9666 0.0003 0.0012
[2026-05-18 10:17:19,317 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0236
[2026-05-18 10:17:19,317 INFO] src.engine_hmm: Chop_High 0.0242 0.0016 0.0260 0.9482
[2026-05-18 10:17:19,318 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:17:19,318 INFO] src.engine_hmm: Bull: return=0.052233, vol=0.383117, rsi_slope=0.000716
[2026-05-18 10:17:19,318 INFO] src.engine_hmm: Bear: return=-0.151635, vol=1.879221, rsi_slope=0.009482
[2026-05-18 10:17:19,319 INFO] src.engine_hmm: Chop_Low: return=-0.019920, vol=-0.670069, rsi_slope=0.000313
[2026-05-18 10:17:19,319 INFO] src.engine_hmm: Chop_High: return=0.028901, vol=-0.245925, rsi_slope=-0.004094
[2026-05-18 10:17:19,321 INFO] src.engine_hmm: Total regime transitions: 9501
[2026-05-18 10:17:19,321 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:17:19,322 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:17:19,322 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:17:19,322 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:17:19,323 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:17:19,323 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:17:19,323 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:17:19,324 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:17:19,324 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:17:19,324 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:17:19,572 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:17:19,594 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:17:19,804 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:17:19,804 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.18078509), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.10905521), 'atr_normalized': np.float32(0.11220042), 'prev_log_return': np.float32(0.14159685), 'usdchf_log_return': np.float32(0.090940975), 'xagusd_log_return': np.float32(0.09438678), 'xtiusd_log_return': np.float32(0.111978166), 'synth_vix_zscore': np.float32(0.1590565)}
[2026-05-18 10:17:19,805 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:17:19,963 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.5171
[2026-05-18 10:17:19,963 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.082677335), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.3045908), 'atr_normalized': np.float32(0.0875013), 'prev_log_return': np.float32(0.12575793), 'usdchf_log_return': np.float32(0.08760869), 'xagusd_log_return': np.float32(0.11232463), 'xtiusd_log_return': np.float32(0.08849119), 'synth_vix_zscore': np.float32(0.111048125)}
[2026-05-18 10:17:19,964 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:17:20,653 INFO] src.engine_xgb: XGB Train Acc: 0.5061 | Test Acc: 0.4890
[2026-05-18 10:17:20,654 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10610498), 'gmm_vol_cluster': np.float32(0.10224313), 'rsi_slope': np.float32(0.11584602), 'atr_normalized': np.float32(0.10505244), 'prev_log_return': np.float32(0.14093092), 'usdchf_log_return': np.float32(0.106702894), 'xagusd_log_return': np.float32(0.117881134), 'xtiusd_log_return': np.float32(0.101509556), 'synth_vix_zscore': np.float32(0.10372893)}
[2026-05-18 10:17:20,654 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:17:20,656 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:17:21,065 INFO] src.backtester: Backtest [M15]: Sharpe=-2.922 | MaxDD=0.369 | WR=0.363 | Return=-30.7% | Trades=597
[2026-05-18 10:17:21,065 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:17:21,410 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 10:17:21,411 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10786378), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13351068), 'atr_normalized': np.float32(0.11405846), 'prev_log_return': np.float32(0.15786341), 'usdchf_log_return': np.float32(0.11049875), 'xagusd_log_return': np.float32(0.10840323), 'xtiusd_log_return': np.float32(0.13378555), 'synth_vix_zscore': np.float32(0.13401614)}
[2026-05-18 10:17:21,412 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:17:21,980 INFO] src.engine_xgb: XGB Train Acc: 0.4973 | Test Acc: 0.4657
[2026-05-18 10:17:21,981 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.089162774), 'gmm_vol_cluster': np.float32(0.10880256), 'rsi_slope': np.float32(0.17699839), 'atr_normalized': np.float32(0.09198878), 'prev_log_return': np.float32(0.13198316), 'usdchf_log_return': np.float32(0.09290101), 'xagusd_log_return': np.float32(0.10906839), 'xtiusd_log_return': np.float32(0.0928294), 'synth_vix_zscore': np.float32(0.10626556)}
[2026-05-18 10:17:21,981 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:17:22,320 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 10:17:22,321 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09169967), 'gmm_vol_cluster': np.float32(0.07226683), 'rsi_slope': np.float32(0.16284892), 'atr_normalized': np.float32(0.09724124), 'prev_log_return': np.float32(0.15139158), 'usdchf_log_return': np.float32(0.09253544), 'xagusd_log_return': np.float32(0.10616317), 'xtiusd_log_return': np.float32(0.08128644), 'synth_vix_zscore': np.float32(0.1445667)}
[2026-05-18 10:17:22,322 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:17:22,323 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:17:22,720 INFO] src.backtester: Backtest [M15]: Sharpe=-3.764 | MaxDD=0.253 | WR=0.285 | Return=-22.1% | Trades=274
[2026-05-18 10:17:22,720 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:17:23,151 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 10:17:23,151 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12057286), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16349062), 'atr_normalized': np.float32(0.09077645), 'prev_log_return': np.float32(0.15728179), 'usdchf_log_return': np.float32(0.11052593), 'xagusd_log_return': np.float32(0.13869193), 'xtiusd_log_return': np.float32(0.10516386), 'synth_vix_zscore': np.float32(0.11349657)}
[2026-05-18 10:17:23,152 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:17:23,717 INFO] src.engine_xgb: XGB Train Acc: 0.4953 | Test Acc: 0.5129
[2026-05-18 10:17:23,717 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08808107), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.20964555), 'atr_normalized': np.float32(0.10535492), 'prev_log_return': np.float32(0.1538686), 'usdchf_log_return': np.float32(0.10039788), 'xagusd_log_return': np.float32(0.13950527), 'xtiusd_log_return': np.float32(0.1023495), 'synth_vix_zscore': np.float32(0.10079724)}
[2026-05-18 10:17:23,718 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:17:24,522 INFO] src.engine_xgb: XGB Train Acc: 0.4960 | Test Acc: 0.5022
[2026-05-18 10:17:24,523 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.112611935), 'gmm_vol_cluster': np.float32(0.087966986), 'rsi_slope': np.float32(0.15496825), 'atr_normalized': np.float32(0.09407582), 'prev_log_return': np.float32(0.1257866), 'usdchf_log_return': np.float32(0.09928309), 'xagusd_log_return': np.float32(0.09424027), 'xtiusd_log_return': np.float32(0.09199259), 'synth_vix_zscore': np.float32(0.1390744)}
[2026-05-18 10:17:24,524 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:17:24,525 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:17:24,987 INFO] src.backtester: Backtest [M15]: Sharpe=-4.621 | MaxDD=0.472 | WR=0.309 | Return=-37.5% | Trades=576
[2026-05-18 10:17:24,988 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:17:25,470 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:17:25,470 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11429193), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.22969198), 'atr_normalized': np.float32(0.11828074), 'prev_log_return': np.float32(0.17404509), 'usdchf_log_return': np.float32(0.08783425), 'xagusd_log_return': np.float32(0.1050312), 'xtiusd_log_return': np.float32(0.076988995), 'synth_vix_zscore': np.float32(0.09383589)}
[2026-05-18 10:17:25,471 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:17:26,135 INFO] src.engine_xgb: XGB Train Acc: 0.4877 | Test Acc: 0.4652
[2026-05-18 10:17:26,135 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.089017764), 'gmm_vol_cluster': np.float32(0.09128072), 'rsi_slope': np.float32(0.20478465), 'atr_normalized': np.float32(0.09739109), 'prev_log_return': np.float32(0.13426904), 'usdchf_log_return': np.float32(0.09095541), 'xagusd_log_return': np.float32(0.103177115), 'xtiusd_log_return': np.float32(0.09074903), 'synth_vix_zscore': np.float32(0.09837515)}
[2026-05-18 10:17:26,136 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:17:26,902 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 10:17:26,903 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12097741), 'gmm_vol_cluster': np.float32(0.08086098), 'rsi_slope': np.float32(0.17053136), 'atr_normalized': np.float32(0.09324835), 'prev_log_return': np.float32(0.13000752), 'usdchf_log_return': np.float32(0.092360295), 'xagusd_log_return': np.float32(0.08639157), 'xtiusd_log_return': np.float32(0.08077815), 'synth_vix_zscore': np.float32(0.14484437)}
[2026-05-18 10:17:26,903 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:17:26,904 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:17:27,013 INFO] src.backtester: Backtest [M15]: Sharpe=-3.817 | MaxDD=0.190 | WR=0.344 | Return=-15.9% | Trades=244
[2026-05-18 10:17:27,014 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[ 5/70] Best Score: -0.500 | ETA: 2h 0m RAM: 68%
Best trial: 4. Best value: -0.5: 7%|█████▎ | 5/70 [09:18<2:12:58, 122.74s/it][2026-05-18 10:19:06,537 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:19:06,537 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:19:06,538 INFO] src.engine_hmm: Bull 0.9552 0.0107 0.0008 0.0333
[2026-05-18 10:19:06,538 INFO] src.engine_hmm: Bear 0.0371 0.9623 0.0001 0.0005
[2026-05-18 10:19:06,538 INFO] src.engine_hmm: Chop_Low 0.0012 0.0009 0.9732 0.0247
[2026-05-18 10:19:06,539 INFO] src.engine_hmm: Chop_High 0.0235 0.0025 0.0265 0.9475
[2026-05-18 10:19:06,539 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:19:06,539 INFO] src.engine_hmm: Bull: return=0.056581, vol=0.380072, rsi_slope=0.003625
[2026-05-18 10:19:06,540 INFO] src.engine_hmm: Bear: return=-0.160907, vol=1.931409, rsi_slope=0.006621
[2026-05-18 10:19:06,540 INFO] src.engine_hmm: Chop_Low: return=-0.008505, vol=-0.674043, rsi_slope=-0.001245
[2026-05-18 10:19:06,540 INFO] src.engine_hmm: Chop_High: return=0.014260, vol=-0.252225, rsi_slope=-0.003844
[2026-05-18 10:19:06,542 INFO] src.engine_hmm: Total regime transitions: 9779
[2026-05-18 10:19:06,543 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:19:06,543 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:19:06,544 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:19:06,544 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:19:06,545 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:19:06,545 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:19:06,545 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:19:06,546 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:19:06,546 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:19:06,547 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:19:06,773 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:19:06,798 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:19:06,947 INFO] src.engine_xgb: XGB Train Acc: 0.4958 | Test Acc: 0.4757
[2026-05-18 10:19:06,948 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.18082866), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.111648194), 'atr_normalized': np.float32(0.11416384), 'prev_log_return': np.float32(0.13987164), 'usdchf_log_return': np.float32(0.08990326), 'xagusd_log_return': np.float32(0.09398756), 'xtiusd_log_return': np.float32(0.11797505), 'synth_vix_zscore': np.float32(0.15162185)}
[2026-05-18 10:19:06,948 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:19:07,048 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4829
[2026-05-18 10:19:07,048 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09549827), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.25757092), 'atr_normalized': np.float32(0.11061548), 'prev_log_return': np.float32(0.11308877), 'usdchf_log_return': np.float32(0.099983044), 'xagusd_log_return': np.float32(0.113723256), 'xtiusd_log_return': np.float32(0.09290331), 'synth_vix_zscore': np.float32(0.11661693)}
[2026-05-18 10:19:07,049 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:19:07,184 INFO] src.engine_xgb: XGB Train Acc: 0.5052 | Test Acc: 0.5103
[2026-05-18 10:19:07,184 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14893702), 'gmm_vol_cluster': np.float32(0.07246252), 'rsi_slope': np.float32(0.10693781), 'atr_normalized': np.float32(0.110716134), 'prev_log_return': np.float32(0.14088947), 'usdchf_log_return': np.float32(0.10684222), 'xagusd_log_return': np.float32(0.11259115), 'xtiusd_log_return': np.float32(0.09020194), 'synth_vix_zscore': np.float32(0.1104218)}
[2026-05-18 10:19:07,185 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:19:07,186 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:19:07,716 INFO] src.backtester: Backtest [M15]: Sharpe=-12.471 | MaxDD=1.675 | WR=0.340 | Return=-81.2% | Trades=2187
[2026-05-18 10:19:07,717 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:19:08,015 INFO] src.engine_xgb: XGB Train Acc: 0.5083 | Test Acc: 0.5430
[2026-05-18 10:19:08,016 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12986268), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13461551), 'atr_normalized': np.float32(0.11618752), 'prev_log_return': np.float32(0.15079577), 'usdchf_log_return': np.float32(0.0974054), 'xagusd_log_return': np.float32(0.11775782), 'xtiusd_log_return': np.float32(0.12361504), 'synth_vix_zscore': np.float32(0.12976018)}
[2026-05-18 10:19:08,017 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:19:08,144 INFO] src.engine_xgb: XGB Train Acc: 0.5129 | Test Acc: 0.5423
[2026-05-18 10:19:08,145 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.113390334), 'gmm_vol_cluster': np.float32(0.09126087), 'rsi_slope': np.float32(0.18918867), 'atr_normalized': np.float32(0.10247918), 'prev_log_return': np.float32(0.1340621), 'usdchf_log_return': np.float32(0.08050214), 'xagusd_log_return': np.float32(0.10652802), 'xtiusd_log_return': np.float32(0.09482069), 'synth_vix_zscore': np.float32(0.087768)}
[2026-05-18 10:19:08,146 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:19:08,304 INFO] src.engine_xgb: XGB Train Acc: 0.5066 | Test Acc: 0.4994
[2026-05-18 10:19:08,304 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1234101), 'gmm_vol_cluster': np.float32(0.07907596), 'rsi_slope': np.float32(0.13604824), 'atr_normalized': np.float32(0.08997047), 'prev_log_return': np.float32(0.14832176), 'usdchf_log_return': np.float32(0.07118666), 'xagusd_log_return': np.float32(0.11301454), 'xtiusd_log_return': np.float32(0.09721686), 'synth_vix_zscore': np.float32(0.1417553)}
[2026-05-18 10:19:08,305 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:19:08,306 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:19:08,917 INFO] src.backtester: Backtest [M15]: Sharpe=-14.824 | MaxDD=2.104 | WR=0.336 | Return=-87.8% | Trades=2709
[2026-05-18 10:19:08,918 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:19:09,260 INFO] src.engine_xgb: XGB Train Acc: 0.5045 | Test Acc: 0.5131
[2026-05-18 10:19:09,260 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.097761616), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.17195162), 'atr_normalized': np.float32(0.1020045), 'prev_log_return': np.float32(0.15391065), 'usdchf_log_return': np.float32(0.10783062), 'xagusd_log_return': np.float32(0.1569778), 'xtiusd_log_return': np.float32(0.109133475), 'synth_vix_zscore': np.float32(0.10042973)}
[2026-05-18 10:19:09,261 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:19:09,405 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4869
[2026-05-18 10:19:09,406 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09461898), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.2245122), 'atr_normalized': np.float32(0.10274289), 'prev_log_return': np.float32(0.14299826), 'usdchf_log_return': np.float32(0.07321047), 'xagusd_log_return': np.float32(0.15439372), 'xtiusd_log_return': np.float32(0.103125006), 'synth_vix_zscore': np.float32(0.10439856)}
[2026-05-18 10:19:09,407 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:19:09,610 INFO] src.engine_xgb: XGB Train Acc: 0.5053 | Test Acc: 0.4984
[2026-05-18 10:19:09,610 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10707549), 'gmm_vol_cluster': np.float32(0.08760278), 'rsi_slope': np.float32(0.184314), 'atr_normalized': np.float32(0.09579779), 'prev_log_return': np.float32(0.11968195), 'usdchf_log_return': np.float32(0.09116234), 'xagusd_log_return': np.float32(0.100246005), 'xtiusd_log_return': np.float32(0.07502498), 'synth_vix_zscore': np.float32(0.13909465)}
[2026-05-18 10:19:09,611 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:19:09,612 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:19:10,145 INFO] src.backtester: Backtest [M15]: Sharpe=-14.810 | MaxDD=2.120 | WR=0.332 | Return=-87.8% | Trades=2567
[2026-05-18 10:19:10,145 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:19:10,510 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5433
[2026-05-18 10:19:10,511 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12349549), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.17627122), 'atr_normalized': np.float32(0.12131726), 'prev_log_return': np.float32(0.16965815), 'usdchf_log_return': np.float32(0.10527631), 'xagusd_log_return': np.float32(0.09663413), 'xtiusd_log_return': np.float32(0.09846573), 'synth_vix_zscore': np.float32(0.1088817)}
[2026-05-18 10:19:10,511 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:19:10,743 INFO] src.engine_xgb: XGB Train Acc: 0.5123 | Test Acc: 0.5348
[2026-05-18 10:19:10,744 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11347549), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.23170502), 'atr_normalized': np.float32(0.0858001), 'prev_log_return': np.float32(0.14594653), 'usdchf_log_return': np.float32(0.10340649), 'xagusd_log_return': np.float32(0.12107879), 'xtiusd_log_return': np.float32(0.10274939), 'synth_vix_zscore': np.float32(0.095838144)}
[2026-05-18 10:19:10,744 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:19:10,976 INFO] src.engine_xgb: XGB Train Acc: 0.5101 | Test Acc: 0.5252
[2026-05-18 10:19:10,976 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1042662), 'gmm_vol_cluster': np.float32(0.056591462), 'rsi_slope': np.float32(0.19256945), 'atr_normalized': np.float32(0.09148411), 'prev_log_return': np.float32(0.13895361), 'usdchf_log_return': np.float32(0.08357761), 'xagusd_log_return': np.float32(0.11818495), 'xtiusd_log_return': np.float32(0.066018045), 'synth_vix_zscore': np.float32(0.14835453)}
[2026-05-18 10:19:10,976 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:19:10,978 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:19:11,100 INFO] src.backtester: Backtest [M15]: Sharpe=-14.631 | MaxDD=0.444 | WR=0.360 | Return=-35.9% | Trades=534
[2026-05-18 10:19:11,101 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 9%|██████▍ | 6/70 [11:02<2:04:09, 116.39s/it][2026-05-18 10:20:53,667 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:20:53,668 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:20:53,668 INFO] src.engine_hmm: Bull 0.9557 0.0108 0.0006 0.0329
[2026-05-18 10:20:53,668 INFO] src.engine_hmm: Bear 0.0333 0.9654 0.0004 0.0009
[2026-05-18 10:20:53,669 INFO] src.engine_hmm: Chop_Low 0.0013 0.0007 0.9741 0.0239
[2026-05-18 10:20:53,669 INFO] src.engine_hmm: Chop_High 0.0240 0.0017 0.0259 0.9484
[2026-05-18 10:20:53,669 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:20:53,670 INFO] src.engine_hmm: Bull: return=0.053938, vol=0.385462, rsi_slope=0.001558
[2026-05-18 10:20:53,670 INFO] src.engine_hmm: Bear: return=-0.156383, vol=1.922349, rsi_slope=0.008124
[2026-05-18 10:20:53,670 INFO] src.engine_hmm: Chop_Low: return=-0.017564, vol=-0.671763, rsi_slope=-0.000162
[2026-05-18 10:20:53,671 INFO] src.engine_hmm: Chop_High: return=0.024519, vol=-0.247826, rsi_slope=-0.003729
[2026-05-18 10:20:53,673 INFO] src.engine_hmm: Total regime transitions: 9539
[2026-05-18 10:20:53,673 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:20:53,674 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:20:53,674 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:20:53,676 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:20:53,676 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:20:53,676 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:20:53,677 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:20:53,677 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:20:53,678 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:20:53,678 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:20:53,934 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:20:53,957 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:20:54,222 INFO] src.engine_xgb: XGB Train Acc: 0.4958 | Test Acc: 0.4757
[2026-05-18 10:20:54,222 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.20262894), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.10758439), 'atr_normalized': np.float32(0.113072984), 'prev_log_return': np.float32(0.12212309), 'usdchf_log_return': np.float32(0.10785772), 'xagusd_log_return': np.float32(0.10469618), 'xtiusd_log_return': np.float32(0.115537174), 'synth_vix_zscore': np.float32(0.12649949)}
[2026-05-18 10:20:54,223 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:20:54,366 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4829
[2026-05-18 10:20:54,367 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10859462), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.19082545), 'atr_normalized': np.float32(0.11517878), 'prev_log_return': np.float32(0.12023238), 'usdchf_log_return': np.float32(0.118244655), 'xagusd_log_return': np.float32(0.11131729), 'xtiusd_log_return': np.float32(0.11031619), 'synth_vix_zscore': np.float32(0.1252906)}
[2026-05-18 10:20:54,368 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:20:54,532 INFO] src.engine_xgb: XGB Train Acc: 0.5052 | Test Acc: 0.5103
[2026-05-18 10:20:54,533 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09697903), 'gmm_vol_cluster': np.float32(0.1103847), 'rsi_slope': np.float32(0.11619898), 'atr_normalized': np.float32(0.111806534), 'prev_log_return': np.float32(0.13177423), 'usdchf_log_return': np.float32(0.11108266), 'xagusd_log_return': np.float32(0.10544481), 'xtiusd_log_return': np.float32(0.11088628), 'synth_vix_zscore': np.float32(0.10544268)}
[2026-05-18 10:20:54,533 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:20:54,535 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:20:55,111 INFO] src.backtester: Backtest [M15]: Sharpe=-12.530 | MaxDD=1.694 | WR=0.336 | Return=-81.6% | Trades=2187
[2026-05-18 10:20:55,112 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:20:55,478 INFO] src.engine_xgb: XGB Train Acc: 0.5083 | Test Acc: 0.5430
[2026-05-18 10:20:55,479 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14078078), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13577843), 'atr_normalized': np.float32(0.12340605), 'prev_log_return': np.float32(0.1395467), 'usdchf_log_return': np.float32(0.108819194), 'xagusd_log_return': np.float32(0.11055133), 'xtiusd_log_return': np.float32(0.12578675), 'synth_vix_zscore': np.float32(0.11533075)}
[2026-05-18 10:20:55,480 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:20:55,657 INFO] src.engine_xgb: XGB Train Acc: 0.5129 | Test Acc: 0.5423
[2026-05-18 10:20:55,658 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09897484), 'gmm_vol_cluster': np.float32(0.10086318), 'rsi_slope': np.float32(0.15200786), 'atr_normalized': np.float32(0.1038841), 'prev_log_return': np.float32(0.13302645), 'usdchf_log_return': np.float32(0.0891069), 'xagusd_log_return': np.float32(0.10569185), 'xtiusd_log_return': np.float32(0.10854386), 'synth_vix_zscore': np.float32(0.10790096)}
[2026-05-18 10:20:55,659 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:20:55,846 INFO] src.engine_xgb: XGB Train Acc: 0.5066 | Test Acc: 0.4994
[2026-05-18 10:20:55,846 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08574084), 'gmm_vol_cluster': np.float32(0.08633052), 'rsi_slope': np.float32(0.13824679), 'atr_normalized': np.float32(0.11184302), 'prev_log_return': np.float32(0.12657543), 'usdchf_log_return': np.float32(0.1080569), 'xagusd_log_return': np.float32(0.104553126), 'xtiusd_log_return': np.float32(0.10482769), 'synth_vix_zscore': np.float32(0.13382567)}
[2026-05-18 10:20:55,847 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:20:55,848 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:20:56,441 INFO] src.backtester: Backtest [M15]: Sharpe=-15.190 | MaxDD=2.169 | WR=0.328 | Return=-88.5% | Trades=2677
[2026-05-18 10:20:56,442 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:20:56,848 INFO] src.engine_xgb: XGB Train Acc: 0.5045 | Test Acc: 0.5131
[2026-05-18 10:20:56,849 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12354784), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14087388), 'atr_normalized': np.float32(0.12129936), 'prev_log_return': np.float32(0.14638712), 'usdchf_log_return': np.float32(0.11352098), 'xagusd_log_return': np.float32(0.12882335), 'xtiusd_log_return': np.float32(0.109501615), 'synth_vix_zscore': np.float32(0.11604585)}
[2026-05-18 10:20:56,849 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:20:57,061 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4869
[2026-05-18 10:20:57,062 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09657267), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16237229), 'atr_normalized': np.float32(0.118787274), 'prev_log_return': np.float32(0.15188283), 'usdchf_log_return': np.float32(0.104571514), 'xagusd_log_return': np.float32(0.12426199), 'xtiusd_log_return': np.float32(0.12866017), 'synth_vix_zscore': np.float32(0.11289121)}
[2026-05-18 10:20:57,062 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:20:57,278 INFO] src.engine_xgb: XGB Train Acc: 0.5053 | Test Acc: 0.4984
[2026-05-18 10:20:57,279 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.124250874), 'gmm_vol_cluster': np.float32(0.1008924), 'rsi_slope': np.float32(0.13175043), 'atr_normalized': np.float32(0.102169305), 'prev_log_return': np.float32(0.126056), 'usdchf_log_return': np.float32(0.09777496), 'xagusd_log_return': np.float32(0.098448284), 'xtiusd_log_return': np.float32(0.10131151), 'synth_vix_zscore': np.float32(0.1173462)}
[2026-05-18 10:20:57,279 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:20:57,281 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:20:57,837 INFO] src.backtester: Backtest [M15]: Sharpe=-14.854 | MaxDD=2.142 | WR=0.332 | Return=-88.1% | Trades=2561
[2026-05-18 10:20:57,838 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:20:58,265 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5433
[2026-05-18 10:20:58,265 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1336455), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14438339), 'atr_normalized': np.float32(0.122609355), 'prev_log_return': np.float32(0.1368619), 'usdchf_log_return': np.float32(0.119765624), 'xagusd_log_return': np.float32(0.11022914), 'xtiusd_log_return': np.float32(0.111591496), 'synth_vix_zscore': np.float32(0.12091359)}
[2026-05-18 10:20:58,266 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:20:58,528 INFO] src.engine_xgb: XGB Train Acc: 0.5123 | Test Acc: 0.5348
[2026-05-18 10:20:58,528 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.104259156), 'gmm_vol_cluster': np.float32(0.08886031), 'rsi_slope': np.float32(0.15724376), 'atr_normalized': np.float32(0.10487966), 'prev_log_return': np.float32(0.13617148), 'usdchf_log_return': np.float32(0.09411824), 'xagusd_log_return': np.float32(0.09759156), 'xtiusd_log_return': np.float32(0.105256416), 'synth_vix_zscore': np.float32(0.11161938)}
[2026-05-18 10:20:58,529 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:20:58,820 INFO] src.engine_xgb: XGB Train Acc: 0.5101 | Test Acc: 0.5252
[2026-05-18 10:20:58,821 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11837748), 'gmm_vol_cluster': np.float32(0.09923398), 'rsi_slope': np.float32(0.14530927), 'atr_normalized': np.float32(0.09956287), 'prev_log_return': np.float32(0.11356101), 'usdchf_log_return': np.float32(0.10309268), 'xagusd_log_return': np.float32(0.09491839), 'xtiusd_log_return': np.float32(0.101220995), 'synth_vix_zscore': np.float32(0.12472338)}
[2026-05-18 10:20:58,821 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:20:58,822 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:20:58,965 INFO] src.backtester: Backtest [M15]: Sharpe=-13.718 | MaxDD=0.418 | WR=0.371 | Return=-34.2% | Trades=537
[2026-05-18 10:20:58,966 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 10%|███████▌ | 7/70 [12:51<1:59:54, 114.19s/it][2026-05-18 10:21:56,659 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:21:56,659 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:21:56,660 INFO] src.engine_hmm: Bull 0.9550 0.0108 0.0008 0.0335
[2026-05-18 10:21:56,660 INFO] src.engine_hmm: Bear 0.0384 0.9609 0.0001 0.0005
[2026-05-18 10:21:56,660 INFO] src.engine_hmm: Chop_Low 0.0011 0.0011 0.9730 0.0249
[2026-05-18 10:21:56,660 INFO] src.engine_hmm: Chop_High 0.0233 0.0029 0.0268 0.9470
[2026-05-18 10:21:56,660 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:21:56,660 INFO] src.engine_hmm: Bull: return=0.052669, vol=0.375721, rsi_slope=0.004258
[2026-05-18 10:21:56,661 INFO] src.engine_hmm: Bear: return=-0.146435, vol=1.910719, rsi_slope=0.005064
[2026-05-18 10:21:56,661 INFO] src.engine_hmm: Chop_Low: return=-0.007038, vol=-0.674447, rsi_slope=-0.001499
[2026-05-18 10:21:56,661 INFO] src.engine_hmm: Chop_High: return=0.012104, vol=-0.253910, rsi_slope=-0.003648
[2026-05-18 10:21:56,662 INFO] src.engine_hmm: Total regime transitions: 9859
[2026-05-18 10:21:56,663 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:21:56,663 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:15:00: Bull -> Chop_High
[2026-05-18 10:21:56,663 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:21:56,663 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:21:56,664 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:21:56,664 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:21:56,664 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:21:56,664 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:21:56,664 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:21:56,664 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:21:56,811 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:21:56,826 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:21:56,930 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:21:56,930 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.17121826), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11569908), 'atr_normalized': np.float32(0.1031236), 'prev_log_return': np.float32(0.13406403), 'usdchf_log_return': np.float32(0.116015874), 'xagusd_log_return': np.float32(0.10081812), 'xtiusd_log_return': np.float32(0.12730698), 'synth_vix_zscore': np.float32(0.13175395)}
[2026-05-18 10:21:56,931 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:21:57,000 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.5171
[2026-05-18 10:21:57,000 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12797576), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1790685), 'atr_normalized': np.float32(0.1222742), 'prev_log_return': np.float32(0.1222131), 'usdchf_log_return': np.float32(0.11301794), 'xagusd_log_return': np.float32(0.104361646), 'xtiusd_log_return': np.float32(0.11207134), 'synth_vix_zscore': np.float32(0.11901753)}
[2026-05-18 10:21:57,001 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:21:57,087 INFO] src.engine_xgb: XGB Train Acc: 0.4970 | Test Acc: 0.4928
[2026-05-18 10:21:57,088 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14058636), 'gmm_vol_cluster': np.float32(0.10616164), 'rsi_slope': np.float32(0.10329625), 'atr_normalized': np.float32(0.09967175), 'prev_log_return': np.float32(0.11511954), 'usdchf_log_return': np.float32(0.10501044), 'xagusd_log_return': np.float32(0.10021657), 'xtiusd_log_return': np.float32(0.12212194), 'synth_vix_zscore': np.float32(0.107815415)}
[2026-05-18 10:21:57,088 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:21:57,089 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:21:57,400 INFO] src.backtester: Backtest [M15]: Sharpe=-4.591 | MaxDD=0.761 | WR=0.353 | Return=-53.2% | Trades=1043
[2026-05-18 10:21:57,402 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:21:57,581 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 10:21:57,582 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1258616), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13087407), 'atr_normalized': np.float32(0.12734772), 'prev_log_return': np.float32(0.14283437), 'usdchf_log_return': np.float32(0.117644064), 'xagusd_log_return': np.float32(0.10112536), 'xtiusd_log_return': np.float32(0.123657), 'synth_vix_zscore': np.float32(0.13065581)}
[2026-05-18 10:21:57,582 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:21:57,709 INFO] src.engine_xgb: XGB Train Acc: 0.4880 | Test Acc: 0.4583
[2026-05-18 10:21:57,709 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11231509), 'gmm_vol_cluster': np.float32(0.090296775), 'rsi_slope': np.float32(0.13454023), 'atr_normalized': np.float32(0.11005327), 'prev_log_return': np.float32(0.13988975), 'usdchf_log_return': np.float32(0.097048104), 'xagusd_log_return': np.float32(0.11251587), 'xtiusd_log_return': np.float32(0.109028175), 'synth_vix_zscore': np.float32(0.094312795)}
[2026-05-18 10:21:57,710 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:21:57,814 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 10:21:57,815 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12232082), 'gmm_vol_cluster': np.float32(0.1412465), 'rsi_slope': np.float32(0.14540179), 'atr_normalized': np.float32(0.08656799), 'prev_log_return': np.float32(0.123080544), 'usdchf_log_return': np.float32(0.09994776), 'xagusd_log_return': np.float32(0.08261953), 'xtiusd_log_return': np.float32(0.085864805), 'synth_vix_zscore': np.float32(0.112950146)}
[2026-05-18 10:21:57,815 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:21:57,816 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:21:58,200 INFO] src.backtester: Backtest [M15]: Sharpe=-5.103 | MaxDD=0.623 | WR=0.364 | Return=-46.2% | Trades=927
[2026-05-18 10:21:58,201 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:21:58,467 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 10:21:58,467 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12772216), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13978769), 'atr_normalized': np.float32(0.11173425), 'prev_log_return': np.float32(0.11696834), 'usdchf_log_return': np.float32(0.12864265), 'xagusd_log_return': np.float32(0.12787242), 'xtiusd_log_return': np.float32(0.11267857), 'synth_vix_zscore': np.float32(0.13459389)}
[2026-05-18 10:21:58,468 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:21:58,657 INFO] src.engine_xgb: XGB Train Acc: 0.4911 | Test Acc: 0.5131
[2026-05-18 10:21:58,658 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.113499604), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15457551), 'atr_normalized': np.float32(0.11099794), 'prev_log_return': np.float32(0.14347118), 'usdchf_log_return': np.float32(0.10710741), 'xagusd_log_return': np.float32(0.13082847), 'xtiusd_log_return': np.float32(0.12281888), 'synth_vix_zscore': np.float32(0.11670107)}
[2026-05-18 10:21:58,658 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:21:58,864 INFO] src.engine_xgb: XGB Train Acc: 0.4947 | Test Acc: 0.5016
[2026-05-18 10:21:58,864 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1327575), 'gmm_vol_cluster': np.float32(0.0846125), 'rsi_slope': np.float32(0.13058263), 'atr_normalized': np.float32(0.112565294), 'prev_log_return': np.float32(0.10799109), 'usdchf_log_return': np.float32(0.10947746), 'xagusd_log_return': np.float32(0.09250558), 'xtiusd_log_return': np.float32(0.103722736), 'synth_vix_zscore': np.float32(0.12578525)}
[2026-05-18 10:21:58,865 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:21:58,866 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:21:59,268 INFO] src.backtester: Backtest [M15]: Sharpe=-5.973 | MaxDD=0.848 | WR=0.351 | Return=-57.2% | Trades=1081
[2026-05-18 10:21:59,268 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:21:59,535 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:21:59,535 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10424923), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14589755), 'atr_normalized': np.float32(0.12554689), 'prev_log_return': np.float32(0.1767609), 'usdchf_log_return': np.float32(0.12467071), 'xagusd_log_return': np.float32(0.11093612), 'xtiusd_log_return': np.float32(0.105179146), 'synth_vix_zscore': np.float32(0.10675943)}
[2026-05-18 10:21:59,537 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:21:59,754 INFO] src.engine_xgb: XGB Train Acc: 0.4877 | Test Acc: 0.4652
[2026-05-18 10:21:59,754 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12517568), 'gmm_vol_cluster': np.float32(0.103199646), 'rsi_slope': np.float32(0.14399882), 'atr_normalized': np.float32(0.10761627), 'prev_log_return': np.float32(0.109709285), 'usdchf_log_return': np.float32(0.1010418), 'xagusd_log_return': np.float32(0.09731011), 'xtiusd_log_return': np.float32(0.10434641), 'synth_vix_zscore': np.float32(0.107601985)}
[2026-05-18 10:21:59,755 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:22:00,028 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 10:22:00,029 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15195954), 'gmm_vol_cluster': np.float32(0.07496758), 'rsi_slope': np.float32(0.13613445), 'atr_normalized': np.float32(0.10006955), 'prev_log_return': np.float32(0.11672818), 'usdchf_log_return': np.float32(0.10183846), 'xagusd_log_return': np.float32(0.08653579), 'xtiusd_log_return': np.float32(0.10657345), 'synth_vix_zscore': np.float32(0.12519307)}
[2026-05-18 10:22:00,029 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:22:00,030 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:22:00,177 INFO] src.backtester: Backtest [M15]: Sharpe=-5.185 | MaxDD=0.416 | WR=0.396 | Return=-33.1% | Trades=626
[2026-05-18 10:22:00,178 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 11%|████████▋ | 8/70 [13:51<1:39:58, 96.75s/it][2026-05-18 10:22:17,532 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:22:17,532 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:22:17,532 INFO] src.engine_hmm: Bull 0.9565 0.0000 0.0000 0.0435
[2026-05-18 10:22:17,532 INFO] src.engine_hmm: Bear 0.0000 0.9688 0.0002 0.0311
[2026-05-18 10:22:17,533 INFO] src.engine_hmm: Chop_Low 0.0000 0.0014 0.9780 0.0206
[2026-05-18 10:22:17,533 INFO] src.engine_hmm: Chop_High 0.0000 0.0143 0.0234 0.9623
[2026-05-18 10:22:17,534 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:22:17,534 INFO] src.engine_hmm: Bull: return=26.960011, vol=51.587724, rsi_slope=0.482719
[2026-05-18 10:22:17,534 INFO] src.engine_hmm: Bear: return=-0.049190, vol=1.304945, rsi_slope=0.006563
[2026-05-18 10:22:17,534 INFO] src.engine_hmm: Chop_Low: return=-0.002522, vol=-0.613137, rsi_slope=-0.002427
[2026-05-18 10:22:17,534 INFO] src.engine_hmm: Chop_High: return=0.021411, vol=-0.018658, rsi_slope=-0.000844
[2026-05-18 10:22:17,535 INFO] src.engine_hmm: Total regime transitions: 7151
[2026-05-18 10:22:17,535 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 02:15:00: Chop_High -> Chop_Low
[2026-05-18 10:22:17,536 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 07:00:00: Chop_Low -> Chop_High
[2026-05-18 10:22:17,536 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:22:17,536 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 22:30:00: Bear -> Chop_High
[2026-05-18 10:22:17,536 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:22:17,536 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_Low -> Bear
[2026-05-18 10:22:17,537 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 05:30:00: Bear -> Chop_High
[2026-05-18 10:22:17,537 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 17:00:00: Chop_High -> Bear
[2026-05-18 10:22:17,537 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 20:30:00: Bear -> Chop_High
[2026-05-18 10:22:17,537 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 23:30:00: Chop_High -> Chop_Low
[2026-05-18 10:22:17,704 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:22:17,722 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:22:17,861 WARNING] src.engine_xgb: hmm_state importance=0: XGBoost ignores the HMM regime. The regime-aligned filter gates signals on a feature XGB deems uninformative — likely caused by heavy regularisation or n_states=2. Consider re-optimising with n_states>=3 or lower reg_alpha/gamma.
[2026-05-18 10:22:17,861 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:22:17,862 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13112228), 'atr_normalized': np.float32(0.15059607), 'prev_log_return': np.float32(0.16330214), 'usdchf_log_return': np.float32(0.13578467), 'xagusd_log_return': np.float32(0.11326999), 'xtiusd_log_return': np.float32(0.1383653), 'synth_vix_zscore': np.float32(0.1675595)}
[2026-05-18 10:22:17,862 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:22:17,986 INFO] src.engine_xgb: XGB Train Acc: 0.4963 | Test Acc: 0.5175
[2026-05-18 10:22:17,986 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13350895), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.21422571), 'atr_normalized': np.float32(0.10386117), 'prev_log_return': np.float32(0.12519906), 'usdchf_log_return': np.float32(0.114333786), 'xagusd_log_return': np.float32(0.112405546), 'xtiusd_log_return': np.float32(0.089181624), 'synth_vix_zscore': np.float32(0.10728422)}
[2026-05-18 10:22:17,987 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:22:18,228 INFO] src.engine_xgb: XGB Train Acc: 0.5036 | Test Acc: 0.4914
[2026-05-18 10:22:18,228 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.115465075), 'gmm_vol_cluster': np.float32(0.09985987), 'rsi_slope': np.float32(0.122575976), 'atr_normalized': np.float32(0.113094844), 'prev_log_return': np.float32(0.12391662), 'usdchf_log_return': np.float32(0.1158628), 'xagusd_log_return': np.float32(0.10508794), 'xtiusd_log_return': np.float32(0.10405786), 'synth_vix_zscore': np.float32(0.10007907)}
[2026-05-18 10:22:18,229 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:22:18,230 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:22:18,629 INFO] src.backtester: Backtest [M15]: Sharpe=-7.591 | MaxDD=1.337 | WR=0.325 | Return=-73.7% | Trades=1522
[2026-05-18 10:22:18,630 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:22:18,812 WARNING] src.engine_xgb: hmm_state importance=0: XGBoost ignores the HMM regime. The regime-aligned filter gates signals on a feature XGB deems uninformative — likely caused by heavy regularisation or n_states=2. Consider re-optimising with n_states>=3 or lower reg_alpha/gamma.
[2026-05-18 10:22:18,812 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 10:22:18,813 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15464322), 'atr_normalized': np.float32(0.14938152), 'prev_log_return': np.float32(0.1804939), 'usdchf_log_return': np.float32(0.10706541), 'xagusd_log_return': np.float32(0.11583066), 'xtiusd_log_return': np.float32(0.15849286), 'synth_vix_zscore': np.float32(0.13409245)}
[2026-05-18 10:22:18,813 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:22:19,046 INFO] src.engine_xgb: XGB Train Acc: 0.4892 | Test Acc: 0.4597
[2026-05-18 10:22:19,047 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1343415), 'gmm_vol_cluster': np.float32(0.108322866), 'rsi_slope': np.float32(0.15828815), 'atr_normalized': np.float32(0.089423135), 'prev_log_return': np.float32(0.13665807), 'usdchf_log_return': np.float32(0.08761378), 'xagusd_log_return': np.float32(0.09985731), 'xtiusd_log_return': np.float32(0.08798364), 'synth_vix_zscore': np.float32(0.09751152)}
[2026-05-18 10:22:19,047 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:22:19,211 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 10:22:19,212 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.072751775), 'gmm_vol_cluster': np.float32(0.07977109), 'rsi_slope': np.float32(0.14309786), 'atr_normalized': np.float32(0.08738338), 'prev_log_return': np.float32(0.16940041), 'usdchf_log_return': np.float32(0.1000841), 'xagusd_log_return': np.float32(0.114166066), 'xtiusd_log_return': np.float32(0.08982156), 'synth_vix_zscore': np.float32(0.14352381)}
[2026-05-18 10:22:19,213 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:22:19,214 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:22:19,629 INFO] src.backtester: Backtest [M15]: Sharpe=-8.688 | MaxDD=1.313 | WR=0.334 | Return=-73.0% | Trades=1732
[2026-05-18 10:22:19,630 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:22:19,912 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 10:22:19,912 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.073096514), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16680391), 'atr_normalized': np.float32(0.10642397), 'prev_log_return': np.float32(0.18630837), 'usdchf_log_return': np.float32(0.10043148), 'xagusd_log_return': np.float32(0.16592228), 'xtiusd_log_return': np.float32(0.10363057), 'synth_vix_zscore': np.float32(0.09738294)}
[2026-05-18 10:22:19,912 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:22:20,242 INFO] src.engine_xgb: XGB Train Acc: 0.4912 | Test Acc: 0.5128
[2026-05-18 10:22:20,242 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13151208), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.19011876), 'atr_normalized': np.float32(0.11367482), 'prev_log_return': np.float32(0.14470853), 'usdchf_log_return': np.float32(0.08718898), 'xagusd_log_return': np.float32(0.14026028), 'xtiusd_log_return': np.float32(0.09360857), 'synth_vix_zscore': np.float32(0.098927975)}
[2026-05-18 10:22:20,243 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:22:20,534 INFO] src.engine_xgb: XGB Train Acc: 0.4947 | Test Acc: 0.5016
[2026-05-18 10:22:20,535 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10773739), 'gmm_vol_cluster': np.float32(0.102412395), 'rsi_slope': np.float32(0.1622655), 'atr_normalized': np.float32(0.10285872), 'prev_log_return': np.float32(0.11423746), 'usdchf_log_return': np.float32(0.09028636), 'xagusd_log_return': np.float32(0.10482704), 'xtiusd_log_return': np.float32(0.08608045), 'synth_vix_zscore': np.float32(0.12929475)}
[2026-05-18 10:22:20,536 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:22:20,537 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:22:20,966 INFO] src.backtester: Backtest [M15]: Sharpe=-10.003 | MaxDD=1.659 | WR=0.320 | Return=-81.0% | Trades=1892
[2026-05-18 10:22:20,967 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:22:21,218 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:22:21,218 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.02883175), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.2015258), 'atr_normalized': np.float32(0.13521896), 'prev_log_return': np.float32(0.2159718), 'usdchf_log_return': np.float32(0.1064722), 'xagusd_log_return': np.float32(0.1113189), 'xtiusd_log_return': np.float32(0.09058028), 'synth_vix_zscore': np.float32(0.11008027)}
[2026-05-18 10:22:21,219 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:22:21,475 INFO] src.engine_xgb: XGB Train Acc: 0.4877 | Test Acc: 0.4652
[2026-05-18 10:22:21,476 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08840897), 'gmm_vol_cluster': np.float32(0.07561501), 'rsi_slope': np.float32(0.19563873), 'atr_normalized': np.float32(0.095907405), 'prev_log_return': np.float32(0.14442866), 'usdchf_log_return': np.float32(0.09293726), 'xagusd_log_return': np.float32(0.099507116), 'xtiusd_log_return': np.float32(0.100951925), 'synth_vix_zscore': np.float32(0.106604956)}
[2026-05-18 10:22:21,476 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:22:21,839 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 10:22:21,840 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08682026), 'gmm_vol_cluster': np.float32(0.08065364), 'rsi_slope': np.float32(0.18315336), 'atr_normalized': np.float32(0.09479168), 'prev_log_return': np.float32(0.13987358), 'usdchf_log_return': np.float32(0.10593588), 'xagusd_log_return': np.float32(0.10239803), 'xtiusd_log_return': np.float32(0.073770225), 'synth_vix_zscore': np.float32(0.13260335)}
[2026-05-18 10:22:21,840 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:22:21,842 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:22:21,992 INFO] src.backtester: Backtest [M15]: Sharpe=-8.111 | MaxDD=0.666 | WR=0.391 | Return=-46.9% | Trades=849
[2026-05-18 10:22:21,993 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 13%|█████████▊ | 9/70 [14:13<1:14:33, 73.34s/it][2026-05-18 10:22:39,941 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:22:39,942 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:22:39,942 INFO] src.engine_hmm: Bull 0.9565 0.0000 0.0000 0.0435
[2026-05-18 10:22:39,942 INFO] src.engine_hmm: Bear 0.0000 0.9692 0.0002 0.0306
[2026-05-18 10:22:39,942 INFO] src.engine_hmm: Chop_Low 0.0000 0.0013 0.9781 0.0206
[2026-05-18 10:22:39,943 INFO] src.engine_hmm: Chop_High 0.0000 0.0143 0.0232 0.9625
[2026-05-18 10:22:39,943 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:22:39,943 INFO] src.engine_hmm: Bull: return=28.275567, vol=51.587724, rsi_slope=0.482719
[2026-05-18 10:22:39,943 INFO] src.engine_hmm: Bear: return=-0.052151, vol=1.299946, rsi_slope=0.006609
[2026-05-18 10:22:39,943 INFO] src.engine_hmm: Chop_Low: return=-0.003420, vol=-0.613613, rsi_slope=-0.002521
[2026-05-18 10:22:39,943 INFO] src.engine_hmm: Chop_High: return=0.023728, vol=-0.021355, rsi_slope=-0.000795
[2026-05-18 10:22:39,945 INFO] src.engine_hmm: Total regime transitions: 7095
[2026-05-18 10:22:39,945 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 02:15:00: Chop_High -> Chop_Low
[2026-05-18 10:22:39,946 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 07:00:00: Chop_Low -> Chop_High
[2026-05-18 10:22:39,946 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:22:39,946 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 22:30:00: Bear -> Chop_High
[2026-05-18 10:22:39,946 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:22:39,946 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_Low -> Bear
[2026-05-18 10:22:39,946 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 06:00:00: Bear -> Chop_High
[2026-05-18 10:22:39,946 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 17:00:00: Chop_High -> Bear
[2026-05-18 10:22:39,948 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 20:30:00: Bear -> Chop_High
[2026-05-18 10:22:39,948 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 23:15:00: Chop_High -> Chop_Low
[2026-05-18 10:22:40,113 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:22:40,131 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:22:40,266 WARNING] src.engine_xgb: hmm_state importance=0: XGBoost ignores the HMM regime. The regime-aligned filter gates signals on a feature XGB deems uninformative — likely caused by heavy regularisation or n_states=2. Consider re-optimising with n_states>=3 or lower reg_alpha/gamma.
[2026-05-18 10:22:40,266 INFO] src.engine_xgb: XGB Train Acc: 0.5043 | Test Acc: 0.5246
[2026-05-18 10:22:40,266 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14846125), 'atr_normalized': np.float32(0.14235134), 'prev_log_return': np.float32(0.15341084), 'usdchf_log_return': np.float32(0.12899785), 'xagusd_log_return': np.float32(0.11486804), 'xtiusd_log_return': np.float32(0.13895133), 'synth_vix_zscore': np.float32(0.17295931)}
[2026-05-18 10:22:40,267 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:22:40,411 INFO] src.engine_xgb: XGB Train Acc: 0.5182 | Test Acc: 0.5124
[2026-05-18 10:22:40,412 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12969728), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16578907), 'atr_normalized': np.float32(0.110781945), 'prev_log_return': np.float32(0.12218264), 'usdchf_log_return': np.float32(0.11005016), 'xagusd_log_return': np.float32(0.1131037), 'xtiusd_log_return': np.float32(0.11411659), 'synth_vix_zscore': np.float32(0.13427861)}
[2026-05-18 10:22:40,413 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:22:40,614 INFO] src.engine_xgb: XGB Train Acc: 0.5274 | Test Acc: 0.4967
[2026-05-18 10:22:40,615 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11103188), 'gmm_vol_cluster': np.float32(0.10393193), 'rsi_slope': np.float32(0.11921133), 'atr_normalized': np.float32(0.113842785), 'prev_log_return': np.float32(0.11508782), 'usdchf_log_return': np.float32(0.114178844), 'xagusd_log_return': np.float32(0.103558), 'xtiusd_log_return': np.float32(0.105497055), 'synth_vix_zscore': np.float32(0.11366036)}
[2026-05-18 10:22:40,615 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:22:40,616 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:22:40,971 INFO] src.backtester: Backtest [M15]: Sharpe=-4.392 | MaxDD=0.607 | WR=0.342 | Return=-45.5% | Trades=836
[2026-05-18 10:22:40,971 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:22:41,218 INFO] src.engine_xgb: XGB Train Acc: 0.4932 | Test Acc: 0.4574
[2026-05-18 10:22:41,218 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1013665), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14169851), 'atr_normalized': np.float32(0.12486453), 'prev_log_return': np.float32(0.13783504), 'usdchf_log_return': np.float32(0.11520136), 'xagusd_log_return': np.float32(0.13056232), 'xtiusd_log_return': np.float32(0.12072743), 'synth_vix_zscore': np.float32(0.12774429)}
[2026-05-18 10:22:41,218 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:22:41,537 INFO] src.engine_xgb: XGB Train Acc: 0.5242 | Test Acc: 0.4822
[2026-05-18 10:22:41,537 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12495784), 'gmm_vol_cluster': np.float32(0.12616071), 'rsi_slope': np.float32(0.13649903), 'atr_normalized': np.float32(0.09496021), 'prev_log_return': np.float32(0.11315392), 'usdchf_log_return': np.float32(0.10311241), 'xagusd_log_return': np.float32(0.10241047), 'xtiusd_log_return': np.float32(0.099384576), 'synth_vix_zscore': np.float32(0.09936082)}
[2026-05-18 10:22:41,538 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:22:41,715 INFO] src.engine_xgb: XGB Train Acc: 0.4944 | Test Acc: 0.5017
[2026-05-18 10:22:41,716 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11552264), 'gmm_vol_cluster': np.float32(0.11539584), 'rsi_slope': np.float32(0.114859544), 'atr_normalized': np.float32(0.092755206), 'prev_log_return': np.float32(0.11518603), 'usdchf_log_return': np.float32(0.09832514), 'xagusd_log_return': np.float32(0.110334314), 'xtiusd_log_return': np.float32(0.09192975), 'synth_vix_zscore': np.float32(0.14569153)}
[2026-05-18 10:22:41,716 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:22:41,717 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:22:42,062 INFO] src.backtester: Backtest [M15]: Sharpe=-0.923 | MaxDD=0.013 | WR=0.333 | Return=-1.0% | Trades=15
[2026-05-18 10:22:42,062 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:22:42,474 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4893
[2026-05-18 10:22:42,476 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.118745185), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1389251), 'atr_normalized': np.float32(0.11836759), 'prev_log_return': np.float32(0.13315147), 'usdchf_log_return': np.float32(0.12629367), 'xagusd_log_return': np.float32(0.12299427), 'xtiusd_log_return': np.float32(0.12431695), 'synth_vix_zscore': np.float32(0.11720575)}
[2026-05-18 10:22:42,477 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:22:42,745 INFO] src.engine_xgb: XGB Train Acc: 0.5060 | Test Acc: 0.5191
[2026-05-18 10:22:42,745 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12376077), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16251312), 'atr_normalized': np.float32(0.11890782), 'prev_log_return': np.float32(0.14659218), 'usdchf_log_return': np.float32(0.10367871), 'xagusd_log_return': np.float32(0.12491518), 'xtiusd_log_return': np.float32(0.10317328), 'synth_vix_zscore': np.float32(0.11645898)}
[2026-05-18 10:22:42,746 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:22:43,044 INFO] src.engine_xgb: XGB Train Acc: 0.5052 | Test Acc: 0.5037
[2026-05-18 10:22:43,045 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12283604), 'gmm_vol_cluster': np.float32(0.111372106), 'rsi_slope': np.float32(0.12795323), 'atr_normalized': np.float32(0.10853748), 'prev_log_return': np.float32(0.1197614), 'usdchf_log_return': np.float32(0.08952164), 'xagusd_log_return': np.float32(0.10715762), 'xtiusd_log_return': np.float32(0.09017752), 'synth_vix_zscore': np.float32(0.12268296)}
[2026-05-18 10:22:43,045 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:22:43,047 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:22:43,393 INFO] src.backtester: Backtest [M15]: Sharpe=-2.586 | MaxDD=0.161 | WR=0.332 | Return=-14.6% | Trades=229
[2026-05-18 10:22:43,394 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:22:43,647 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:22:43,648 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12199156), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1542503), 'atr_normalized': np.float32(0.12997638), 'prev_log_return': np.float32(0.14748695), 'usdchf_log_return': np.float32(0.11554219), 'xagusd_log_return': np.float32(0.09930908), 'xtiusd_log_return': np.float32(0.118675254), 'synth_vix_zscore': np.float32(0.11276834)}
[2026-05-18 10:22:43,648 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:22:43,904 INFO] src.engine_xgb: XGB Train Acc: 0.4878 | Test Acc: 0.4652
[2026-05-18 10:22:43,905 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08235243), 'gmm_vol_cluster': np.float32(0.06391854), 'rsi_slope': np.float32(0.18720672), 'atr_normalized': np.float32(0.10577938), 'prev_log_return': np.float32(0.13426375), 'usdchf_log_return': np.float32(0.10309968), 'xagusd_log_return': np.float32(0.09996961), 'xtiusd_log_return': np.float32(0.116367675), 'synth_vix_zscore': np.float32(0.10704215)}
[2026-05-18 10:22:43,906 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:22:44,207 INFO] src.engine_xgb: XGB Train Acc: 0.4900 | Test Acc: 0.4749
[2026-05-18 10:22:44,208 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.102658644), 'gmm_vol_cluster': np.float32(0.12550454), 'rsi_slope': np.float32(0.13768381), 'atr_normalized': np.float32(0.10270537), 'prev_log_return': np.float32(0.10983184), 'usdchf_log_return': np.float32(0.103699975), 'xagusd_log_return': np.float32(0.094760016), 'xtiusd_log_return': np.float32(0.09430064), 'synth_vix_zscore': np.float32(0.12885514)}
[2026-05-18 10:22:44,208 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:22:44,209 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:22:44,312 INFO] src.backtester: Backtest [M15]: Sharpe=-0.751 | MaxDD=0.009 | WR=0.400 | Return=-0.5% | Trades=5
[2026-05-18 10:22:44,313 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[ 10/70] Best Score: -0.500 | ETA: 1h 27m RAM: 66%
Best trial: 4. Best value: -0.5: 14%|███████████ | 10/70 [14:35<57:35, 57.59s/it][2026-05-18 10:25:06,182 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:25:06,183 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:25:06,184 INFO] src.engine_hmm: Bull 0.9556 0.0110 0.0006 0.0327
[2026-05-18 10:25:06,184 INFO] src.engine_hmm: Bear 0.0316 0.9668 0.0003 0.0012
[2026-05-18 10:25:06,184 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9745 0.0236
[2026-05-18 10:25:06,185 INFO] src.engine_hmm: Chop_High 0.0243 0.0016 0.0260 0.9481
[2026-05-18 10:25:06,185 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:25:06,185 INFO] src.engine_hmm: Bull: return=0.053378, vol=0.380770, rsi_slope=0.000468
[2026-05-18 10:25:06,187 INFO] src.engine_hmm: Bear: return=-0.149490, vol=1.869089, rsi_slope=0.009859
[2026-05-18 10:25:06,187 INFO] src.engine_hmm: Chop_Low: return=-0.021166, vol=-0.670158, rsi_slope=0.000417
[2026-05-18 10:25:06,188 INFO] src.engine_hmm: Chop_High: return=0.029011, vol=-0.246623, rsi_slope=-0.004161
[2026-05-18 10:25:06,190 INFO] src.engine_hmm: Total regime transitions: 9483
[2026-05-18 10:25:06,191 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:25:06,191 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:25:06,192 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:25:06,192 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:25:06,193 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:25:06,193 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:25:06,194 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:25:06,194 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:25:06,195 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:25:06,195 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:25:06,392 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:25:06,411 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:25:06,561 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:25:06,562 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.2003027), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.105892606), 'atr_normalized': np.float32(0.10601518), 'prev_log_return': np.float32(0.1543524), 'usdchf_log_return': np.float32(0.08212783), 'xagusd_log_return': np.float32(0.082610495), 'xtiusd_log_return': np.float32(0.09929998), 'synth_vix_zscore': np.float32(0.16939883)}
[2026-05-18 10:25:06,562 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:25:06,654 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.5171
[2026-05-18 10:25:06,655 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.062982455), 'gmm_vol_cluster': np.float32(0.04316089), 'rsi_slope': np.float32(0.34041244), 'atr_normalized': np.float32(0.07987012), 'prev_log_return': np.float32(0.096571624), 'usdchf_log_return': np.float32(0.07170611), 'xagusd_log_return': np.float32(0.1353895), 'xtiusd_log_return': np.float32(0.07471155), 'synth_vix_zscore': np.float32(0.09519526)}
[2026-05-18 10:25:06,656 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:25:06,770 INFO] src.engine_xgb: XGB Train Acc: 0.4948 | Test Acc: 0.4897
[2026-05-18 10:25:06,770 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10536911), 'gmm_vol_cluster': np.float32(0.09082317), 'rsi_slope': np.float32(0.1273454), 'atr_normalized': np.float32(0.11428601), 'prev_log_return': np.float32(0.1791263), 'usdchf_log_return': np.float32(0.08007274), 'xagusd_log_return': np.float32(0.13748239), 'xtiusd_log_return': np.float32(0.07097258), 'synth_vix_zscore': np.float32(0.0945222)}
[2026-05-18 10:25:06,771 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:25:06,772 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:25:07,392 INFO] src.backtester: Backtest [M15]: Sharpe=-4.899 | MaxDD=0.843 | WR=0.361 | Return=-56.8% | Trades=1076
[2026-05-18 10:25:07,393 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:25:07,702 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 10:25:07,703 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10997397), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16027792), 'atr_normalized': np.float32(0.10710636), 'prev_log_return': np.float32(0.17657806), 'usdchf_log_return': np.float32(0.08734483), 'xagusd_log_return': np.float32(0.11001032), 'xtiusd_log_return': np.float32(0.16621903), 'synth_vix_zscore': np.float32(0.08248946)}
[2026-05-18 10:25:07,703 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:25:07,815 INFO] src.engine_xgb: XGB Train Acc: 0.4871 | Test Acc: 0.4577
[2026-05-18 10:25:07,815 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.083668664), 'gmm_vol_cluster': np.float32(0.08990526), 'rsi_slope': np.float32(0.23201182), 'atr_normalized': np.float32(0.079158284), 'prev_log_return': np.float32(0.1619624), 'usdchf_log_return': np.float32(0.05804527), 'xagusd_log_return': np.float32(0.14142397), 'xtiusd_log_return': np.float32(0.065781996), 'synth_vix_zscore': np.float32(0.08804237)}
[2026-05-18 10:25:07,816 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:25:07,922 WARNING] src.engine_xgb: hmm_state importance=0: XGBoost ignores the HMM regime. The regime-aligned filter gates signals on a feature XGB deems uninformative — likely caused by heavy regularisation or n_states=2. Consider re-optimising with n_states>=3 or lower reg_alpha/gamma.
[2026-05-18 10:25:07,922 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 10:25:07,922 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.09575953), 'rsi_slope': np.float32(0.17588064), 'atr_normalized': np.float32(0.08690829), 'prev_log_return': np.float32(0.18559219), 'usdchf_log_return': np.float32(0.078880824), 'xagusd_log_return': np.float32(0.11237647), 'xtiusd_log_return': np.float32(0.0762779), 'synth_vix_zscore': np.float32(0.18832418)}
[2026-05-18 10:25:07,923 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:25:07,924 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:25:08,518 INFO] src.backtester: Backtest [M15]: Sharpe=-5.567 | MaxDD=0.668 | WR=0.339 | Return=-48.6% | Trades=930
[2026-05-18 10:25:08,518 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:25:08,801 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 10:25:08,801 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08881578), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.18763176), 'atr_normalized': np.float32(0.07316751), 'prev_log_return': np.float32(0.19817661), 'usdchf_log_return': np.float32(0.10242931), 'xagusd_log_return': np.float32(0.15137985), 'xtiusd_log_return': np.float32(0.09707735), 'synth_vix_zscore': np.float32(0.1013218)}
[2026-05-18 10:25:08,802 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:25:08,965 INFO] src.engine_xgb: XGB Train Acc: 0.4910 | Test Acc: 0.5131
[2026-05-18 10:25:08,966 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.071077116), 'gmm_vol_cluster': np.float32(0.07375371), 'rsi_slope': np.float32(0.23535113), 'atr_normalized': np.float32(0.08390968), 'prev_log_return': np.float32(0.14920552), 'usdchf_log_return': np.float32(0.06296145), 'xagusd_log_return': np.float32(0.14087982), 'xtiusd_log_return': np.float32(0.08890164), 'synth_vix_zscore': np.float32(0.0939599)}
[2026-05-18 10:25:08,967 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:25:09,138 INFO] src.engine_xgb: XGB Train Acc: 0.4947 | Test Acc: 0.5016
[2026-05-18 10:25:09,138 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.077441044), 'gmm_vol_cluster': np.float32(0.059146054), 'rsi_slope': np.float32(0.2656604), 'atr_normalized': np.float32(0.07580335), 'prev_log_return': np.float32(0.12638275), 'usdchf_log_return': np.float32(0.070504546), 'xagusd_log_return': np.float32(0.097895585), 'xtiusd_log_return': np.float32(0.058872726), 'synth_vix_zscore': np.float32(0.16829352)}
[2026-05-18 10:25:09,139 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:25:09,140 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:25:09,707 INFO] src.backtester: Backtest [M15]: Sharpe=-6.466 | MaxDD=0.938 | WR=0.337 | Return=-60.8% | Trades=1097
[2026-05-18 10:25:09,708 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:25:10,040 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:25:10,041 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.094966486), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.21453291), 'atr_normalized': np.float32(0.122279495), 'prev_log_return': np.float32(0.20839207), 'usdchf_log_return': np.float32(0.08202347), 'xagusd_log_return': np.float32(0.10300855), 'xtiusd_log_return': np.float32(0.091267355), 'synth_vix_zscore': np.float32(0.08352968)}
[2026-05-18 10:25:10,042 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:25:10,246 INFO] src.engine_xgb: XGB Train Acc: 0.4877 | Test Acc: 0.4652
[2026-05-18 10:25:10,247 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.07349352), 'gmm_vol_cluster': np.float32(0.076616056), 'rsi_slope': np.float32(0.2750488), 'atr_normalized': np.float32(0.076296516), 'prev_log_return': np.float32(0.13731669), 'usdchf_log_return': np.float32(0.085114755), 'xagusd_log_return': np.float32(0.11426589), 'xtiusd_log_return': np.float32(0.07665926), 'synth_vix_zscore': np.float32(0.08518848)}
[2026-05-18 10:25:10,248 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:25:10,449 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 10:25:10,449 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.07797329), 'gmm_vol_cluster': np.float32(0.06783892), 'rsi_slope': np.float32(0.2803371), 'atr_normalized': np.float32(0.056242447), 'prev_log_return': np.float32(0.12182812), 'usdchf_log_return': np.float32(0.0680877), 'xagusd_log_return': np.float32(0.12278756), 'xtiusd_log_return': np.float32(0.0494956), 'synth_vix_zscore': np.float32(0.15540928)}
[2026-05-18 10:25:10,450 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:25:10,451 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:25:10,602 INFO] src.backtester: Backtest [M15]: Sharpe=-5.999 | MaxDD=0.479 | WR=0.388 | Return=-37.2% | Trades=660
[2026-05-18 10:25:10,603 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 16%|███████████▊ | 11/70 [17:01<1:23:19, 84.73s/it][2026-05-18 10:27:18,827 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:27:18,827 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:27:18,828 INFO] src.engine_hmm: Bull 0.9557 0.0109 0.0006 0.0328
[2026-05-18 10:27:18,828 INFO] src.engine_hmm: Bear 0.0322 0.9664 0.0003 0.0011
[2026-05-18 10:27:18,828 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9743 0.0237
[2026-05-18 10:27:18,829 INFO] src.engine_hmm: Chop_High 0.0242 0.0016 0.0260 0.9482
[2026-05-18 10:27:18,829 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:27:18,829 INFO] src.engine_hmm: Bull: return=0.053364, vol=0.383030, rsi_slope=0.001024
[2026-05-18 10:27:18,830 INFO] src.engine_hmm: Bear: return=-0.154660, vol=1.888428, rsi_slope=0.008955
[2026-05-18 10:27:18,830 INFO] src.engine_hmm: Chop_Low: return=-0.019219, vol=-0.670601, rsi_slope=0.000156
[2026-05-18 10:27:18,830 INFO] src.engine_hmm: Chop_High: return=0.027791, vol=-0.246671, rsi_slope=-0.003980
[2026-05-18 10:27:18,833 INFO] src.engine_hmm: Total regime transitions: 9508
[2026-05-18 10:27:18,833 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:27:18,834 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:27:18,834 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:27:18,834 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:27:18,835 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:27:18,835 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:27:18,835 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:27:18,836 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:27:18,836 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:27:18,836 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:27:19,060 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:27:19,085 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:27:19,282 INFO] src.engine_xgb: XGB Train Acc: 0.4958 | Test Acc: 0.4757
[2026-05-18 10:27:19,282 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.19643256), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.10843995), 'atr_normalized': np.float32(0.11322357), 'prev_log_return': np.float32(0.12716918), 'usdchf_log_return': np.float32(0.10212994), 'xagusd_log_return': np.float32(0.11559581), 'xtiusd_log_return': np.float32(0.114700325), 'synth_vix_zscore': np.float32(0.12230864)}
[2026-05-18 10:27:19,282 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:27:19,432 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4829
[2026-05-18 10:27:19,432 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.116027854), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16485013), 'atr_normalized': np.float32(0.11892551), 'prev_log_return': np.float32(0.12584122), 'usdchf_log_return': np.float32(0.11293743), 'xagusd_log_return': np.float32(0.11746256), 'xtiusd_log_return': np.float32(0.11487609), 'synth_vix_zscore': np.float32(0.12907927)}
[2026-05-18 10:27:19,433 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:27:19,733 INFO] src.engine_xgb: XGB Train Acc: 0.5052 | Test Acc: 0.5107
[2026-05-18 10:27:19,733 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10544128), 'gmm_vol_cluster': np.float32(0.091752656), 'rsi_slope': np.float32(0.12013227), 'atr_normalized': np.float32(0.11468397), 'prev_log_return': np.float32(0.12206124), 'usdchf_log_return': np.float32(0.116015), 'xagusd_log_return': np.float32(0.105602205), 'xtiusd_log_return': np.float32(0.11492803), 'synth_vix_zscore': np.float32(0.10938335)}
[2026-05-18 10:27:19,734 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:27:19,735 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:27:20,350 INFO] src.backtester: Backtest [M15]: Sharpe=-12.482 | MaxDD=1.665 | WR=0.330 | Return=-81.0% | Trades=2133
[2026-05-18 10:27:20,353 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:27:20,832 INFO] src.engine_xgb: XGB Train Acc: 0.5083 | Test Acc: 0.5430
[2026-05-18 10:27:20,833 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.130569), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13030827), 'atr_normalized': np.float32(0.12633458), 'prev_log_return': np.float32(0.13414553), 'usdchf_log_return': np.float32(0.11565773), 'xagusd_log_return': np.float32(0.11675137), 'xtiusd_log_return': np.float32(0.1290388), 'synth_vix_zscore': np.float32(0.11719478)}
[2026-05-18 10:27:20,834 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:27:21,099 INFO] src.engine_xgb: XGB Train Acc: 0.5129 | Test Acc: 0.5423
[2026-05-18 10:27:21,099 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08235127), 'gmm_vol_cluster': np.float32(0.19161789), 'rsi_slope': np.float32(0.11871842), 'atr_normalized': np.float32(0.09566734), 'prev_log_return': np.float32(0.115758464), 'usdchf_log_return': np.float32(0.09223615), 'xagusd_log_return': np.float32(0.09840069), 'xtiusd_log_return': np.float32(0.09316566), 'synth_vix_zscore': np.float32(0.11208411)}
[2026-05-18 10:27:21,100 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:27:21,297 INFO] src.engine_xgb: XGB Train Acc: 0.5066 | Test Acc: 0.4994
[2026-05-18 10:27:21,298 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08439246), 'gmm_vol_cluster': np.float32(0.0883798), 'rsi_slope': np.float32(0.13672204), 'atr_normalized': np.float32(0.10301324), 'prev_log_return': np.float32(0.13684955), 'usdchf_log_return': np.float32(0.10324812), 'xagusd_log_return': np.float32(0.11821599), 'xtiusd_log_return': np.float32(0.102903865), 'synth_vix_zscore': np.float32(0.12627485)}
[2026-05-18 10:27:21,299 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:27:21,300 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:27:21,903 INFO] src.backtester: Backtest [M15]: Sharpe=-15.119 | MaxDD=2.153 | WR=0.330 | Return=-88.3% | Trades=2653
[2026-05-18 10:27:21,904 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:27:22,246 INFO] src.engine_xgb: XGB Train Acc: 0.5045 | Test Acc: 0.5131
[2026-05-18 10:27:22,246 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13987741), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13645515), 'atr_normalized': np.float32(0.12025221), 'prev_log_return': np.float32(0.13817564), 'usdchf_log_return': np.float32(0.116712846), 'xagusd_log_return': np.float32(0.13508801), 'xtiusd_log_return': np.float32(0.104841836), 'synth_vix_zscore': np.float32(0.108596876)}
[2026-05-18 10:27:22,248 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:27:22,570 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4869
[2026-05-18 10:27:22,570 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11166341), 'gmm_vol_cluster': np.float32(0.09134343), 'rsi_slope': np.float32(0.1323854), 'atr_normalized': np.float32(0.10748657), 'prev_log_return': np.float32(0.12815532), 'usdchf_log_return': np.float32(0.1069148), 'xagusd_log_return': np.float32(0.11646636), 'xtiusd_log_return': np.float32(0.104248896), 'synth_vix_zscore': np.float32(0.10133581)}
[2026-05-18 10:27:22,571 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:27:22,962 INFO] src.engine_xgb: XGB Train Acc: 0.5053 | Test Acc: 0.4984
[2026-05-18 10:27:22,963 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11169859), 'gmm_vol_cluster': np.float32(0.08928508), 'rsi_slope': np.float32(0.13011399), 'atr_normalized': np.float32(0.10883291), 'prev_log_return': np.float32(0.12033487), 'usdchf_log_return': np.float32(0.10978999), 'xagusd_log_return': np.float32(0.10747632), 'xtiusd_log_return': np.float32(0.1033244), 'synth_vix_zscore': np.float32(0.1191438)}
[2026-05-18 10:27:22,963 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:27:22,965 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:27:23,502 INFO] src.backtester: Backtest [M15]: Sharpe=-14.826 | MaxDD=2.131 | WR=0.333 | Return=-88.0% | Trades=2549
[2026-05-18 10:27:23,503 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:27:23,960 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5433
[2026-05-18 10:27:23,961 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14120007), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13705876), 'atr_normalized': np.float32(0.11982455), 'prev_log_return': np.float32(0.13768844), 'usdchf_log_return': np.float32(0.12251436), 'xagusd_log_return': np.float32(0.11666222), 'xtiusd_log_return': np.float32(0.11456902), 'synth_vix_zscore': np.float32(0.110482626)}
[2026-05-18 10:27:23,961 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:27:24,740 INFO] src.engine_xgb: XGB Train Acc: 0.5123 | Test Acc: 0.5348
[2026-05-18 10:27:24,740 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10678781), 'gmm_vol_cluster': np.float32(0.10020438), 'rsi_slope': np.float32(0.12580958), 'atr_normalized': np.float32(0.105264604), 'prev_log_return': np.float32(0.121296905), 'usdchf_log_return': np.float32(0.11276022), 'xagusd_log_return': np.float32(0.11033314), 'xtiusd_log_return': np.float32(0.10918667), 'synth_vix_zscore': np.float32(0.10835672)}
[2026-05-18 10:27:24,740 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:27:25,333 INFO] src.engine_xgb: XGB Train Acc: 0.5101 | Test Acc: 0.5252
[2026-05-18 10:27:25,334 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.111415766), 'gmm_vol_cluster': np.float32(0.10153587), 'rsi_slope': np.float32(0.12775774), 'atr_normalized': np.float32(0.11223706), 'prev_log_return': np.float32(0.11959389), 'usdchf_log_return': np.float32(0.10414298), 'xagusd_log_return': np.float32(0.10557406), 'xtiusd_log_return': np.float32(0.100279875), 'synth_vix_zscore': np.float32(0.11746274)}
[2026-05-18 10:27:25,334 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:27:25,335 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:27:25,491 INFO] src.backtester: Backtest [M15]: Sharpe=-14.459 | MaxDD=0.435 | WR=0.357 | Return=-35.3% | Trades=527
[2026-05-18 10:27:25,492 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 17%|████████████▋ | 12/70 [19:16<1:36:41, 100.02s/it][2026-05-18 10:28:53,432 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:28:53,433 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:28:53,433 INFO] src.engine_hmm: Bull 0.9557 0.0108 0.0006 0.0329
[2026-05-18 10:28:53,433 INFO] src.engine_hmm: Bear 0.0331 0.9656 0.0004 0.0009
[2026-05-18 10:28:53,434 INFO] src.engine_hmm: Chop_Low 0.0013 0.0007 0.9741 0.0239
[2026-05-18 10:28:53,434 INFO] src.engine_hmm: Chop_High 0.0240 0.0017 0.0259 0.9484
[2026-05-18 10:28:53,435 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:28:53,435 INFO] src.engine_hmm: Bull: return=0.054544, vol=0.384247, rsi_slope=0.001460
[2026-05-18 10:28:53,435 INFO] src.engine_hmm: Bear: return=-0.157195, vol=1.913365, rsi_slope=0.008272
[2026-05-18 10:28:53,436 INFO] src.engine_hmm: Chop_Low: return=-0.018112, vol=-0.671691, rsi_slope=-0.000089
[2026-05-18 10:28:53,436 INFO] src.engine_hmm: Chop_High: return=0.025247, vol=-0.247970, rsi_slope=-0.003793
[2026-05-18 10:28:53,438 INFO] src.engine_hmm: Total regime transitions: 9533
[2026-05-18 10:28:53,438 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:28:53,439 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:28:53,439 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:28:53,440 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:28:53,440 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:28:53,440 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:28:53,441 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:28:53,441 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:28:53,442 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:28:53,442 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:28:53,670 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:28:53,692 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:28:53,872 INFO] src.engine_xgb: XGB Train Acc: 0.4958 | Test Acc: 0.4757
[2026-05-18 10:28:53,872 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.17314054), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.107776284), 'atr_normalized': np.float32(0.12447157), 'prev_log_return': np.float32(0.13081247), 'usdchf_log_return': np.float32(0.10401567), 'xagusd_log_return': np.float32(0.101462424), 'xtiusd_log_return': np.float32(0.114460886), 'synth_vix_zscore': np.float32(0.1438602)}
[2026-05-18 10:28:53,872 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:28:54,062 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4829
[2026-05-18 10:28:54,062 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11521984), 'gmm_vol_cluster': np.float32(0.061295625), 'rsi_slope': np.float32(0.17665267), 'atr_normalized': np.float32(0.10715236), 'prev_log_return': np.float32(0.116367064), 'usdchf_log_return': np.float32(0.109126255), 'xagusd_log_return': np.float32(0.10674395), 'xtiusd_log_return': np.float32(0.0972173), 'synth_vix_zscore': np.float32(0.11022494)}
[2026-05-18 10:28:54,063 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:28:54,774 INFO] src.engine_xgb: XGB Train Acc: 0.5055 | Test Acc: 0.5110
[2026-05-18 10:28:54,775 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10431519), 'gmm_vol_cluster': np.float32(0.096003994), 'rsi_slope': np.float32(0.11724838), 'atr_normalized': np.float32(0.11129327), 'prev_log_return': np.float32(0.1260877), 'usdchf_log_return': np.float32(0.111202806), 'xagusd_log_return': np.float32(0.11204183), 'xtiusd_log_return': np.float32(0.11371694), 'synth_vix_zscore': np.float32(0.10808985)}
[2026-05-18 10:28:54,776 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:28:54,777 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:28:55,430 INFO] src.backtester: Backtest [M15]: Sharpe=-12.465 | MaxDD=1.681 | WR=0.330 | Return=-81.3% | Trades=2148
[2026-05-18 10:28:55,430 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:28:55,843 INFO] src.engine_xgb: XGB Train Acc: 0.5083 | Test Acc: 0.5430
[2026-05-18 10:28:55,844 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11918119), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1317826), 'atr_normalized': np.float32(0.1222877), 'prev_log_return': np.float32(0.13721783), 'usdchf_log_return': np.float32(0.1158176), 'xagusd_log_return': np.float32(0.11576956), 'xtiusd_log_return': np.float32(0.13125856), 'synth_vix_zscore': np.float32(0.12668489)}
[2026-05-18 10:28:55,844 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:28:56,205 INFO] src.engine_xgb: XGB Train Acc: 0.5129 | Test Acc: 0.5423
[2026-05-18 10:28:56,206 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10300011), 'gmm_vol_cluster': np.float32(0.14471275), 'rsi_slope': np.float32(0.14303209), 'atr_normalized': np.float32(0.0945699), 'prev_log_return': np.float32(0.12166058), 'usdchf_log_return': np.float32(0.09165287), 'xagusd_log_return': np.float32(0.10167803), 'xtiusd_log_return': np.float32(0.096441545), 'synth_vix_zscore': np.float32(0.10325209)}
[2026-05-18 10:28:56,206 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:28:56,395 INFO] src.engine_xgb: XGB Train Acc: 0.5066 | Test Acc: 0.4994
[2026-05-18 10:28:56,396 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.103328645), 'gmm_vol_cluster': np.float32(0.07761525), 'rsi_slope': np.float32(0.14130236), 'atr_normalized': np.float32(0.102483116), 'prev_log_return': np.float32(0.13506871), 'usdchf_log_return': np.float32(0.09529362), 'xagusd_log_return': np.float32(0.11057755), 'xtiusd_log_return': np.float32(0.095734864), 'synth_vix_zscore': np.float32(0.13859591)}
[2026-05-18 10:28:56,396 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:28:56,398 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:28:56,923 INFO] src.backtester: Backtest [M15]: Sharpe=-15.310 | MaxDD=2.182 | WR=0.327 | Return=-88.7% | Trades=2670
[2026-05-18 10:28:56,923 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:28:57,314 INFO] src.engine_xgb: XGB Train Acc: 0.5045 | Test Acc: 0.5131
[2026-05-18 10:28:57,315 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10742145), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14617242), 'atr_normalized': np.float32(0.118550956), 'prev_log_return': np.float32(0.15053433), 'usdchf_log_return': np.float32(0.11983769), 'xagusd_log_return': np.float32(0.14966509), 'xtiusd_log_return': np.float32(0.0928221), 'synth_vix_zscore': np.float32(0.11499592)}
[2026-05-18 10:28:57,315 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:28:57,723 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4869
[2026-05-18 10:28:57,724 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.101632535), 'gmm_vol_cluster': np.float32(0.11678266), 'rsi_slope': np.float32(0.14569698), 'atr_normalized': np.float32(0.104278), 'prev_log_return': np.float32(0.12515384), 'usdchf_log_return': np.float32(0.0874042), 'xagusd_log_return': np.float32(0.11878331), 'xtiusd_log_return': np.float32(0.1037997), 'synth_vix_zscore': np.float32(0.09646877)}
[2026-05-18 10:28:57,724 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:28:58,902 INFO] src.engine_xgb: XGB Train Acc: 0.5053 | Test Acc: 0.4984
[2026-05-18 10:28:58,902 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11676225), 'gmm_vol_cluster': np.float32(0.10029005), 'rsi_slope': np.float32(0.1265508), 'atr_normalized': np.float32(0.1046908), 'prev_log_return': np.float32(0.11907576), 'usdchf_log_return': np.float32(0.1053153), 'xagusd_log_return': np.float32(0.10700146), 'xtiusd_log_return': np.float32(0.1017086), 'synth_vix_zscore': np.float32(0.118604995)}
[2026-05-18 10:28:58,903 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:28:58,904 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:28:59,465 INFO] src.backtester: Backtest [M15]: Sharpe=-14.734 | MaxDD=2.119 | WR=0.333 | Return=-87.8% | Trades=2546
[2026-05-18 10:28:59,466 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:28:59,823 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5433
[2026-05-18 10:28:59,823 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11320003), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15455921), 'atr_normalized': np.float32(0.12724677), 'prev_log_return': np.float32(0.15343808), 'usdchf_log_return': np.float32(0.11507529), 'xagusd_log_return': np.float32(0.11023121), 'xtiusd_log_return': np.float32(0.10858979), 'synth_vix_zscore': np.float32(0.117659636)}
[2026-05-18 10:28:59,824 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:29:01,069 INFO] src.engine_xgb: XGB Train Acc: 0.5123 | Test Acc: 0.5348
[2026-05-18 10:29:01,070 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.105932616), 'gmm_vol_cluster': np.float32(0.09274401), 'rsi_slope': np.float32(0.1435119), 'atr_normalized': np.float32(0.10646362), 'prev_log_return': np.float32(0.11974879), 'usdchf_log_return': np.float32(0.10379235), 'xagusd_log_return': np.float32(0.11106627), 'xtiusd_log_return': np.float32(0.10748643), 'synth_vix_zscore': np.float32(0.109254025)}
[2026-05-18 10:29:01,071 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:29:01,660 INFO] src.engine_xgb: XGB Train Acc: 0.5101 | Test Acc: 0.5252
[2026-05-18 10:29:01,661 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1169646), 'gmm_vol_cluster': np.float32(0.08900867), 'rsi_slope': np.float32(0.14827959), 'atr_normalized': np.float32(0.099694826), 'prev_log_return': np.float32(0.12175829), 'usdchf_log_return': np.float32(0.10106435), 'xagusd_log_return': np.float32(0.10261185), 'xtiusd_log_return': np.float32(0.09585938), 'synth_vix_zscore': np.float32(0.12475848)}
[2026-05-18 10:29:01,661 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:29:01,663 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:29:01,825 INFO] src.backtester: Backtest [M15]: Sharpe=-13.711 | MaxDD=0.418 | WR=0.371 | Return=-34.1% | Trades=536
[2026-05-18 10:29:01,826 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 19%|█████████████▉ | 13/70 [20:52<1:33:56, 98.88s/it][2026-05-18 10:31:16,043 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:31:16,044 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:31:16,044 INFO] src.engine_hmm: Bull 0.9551 0.0115 0.0007 0.0328
[2026-05-18 10:31:16,044 INFO] src.engine_hmm: Bear 0.0304 0.9677 0.0004 0.0015
[2026-05-18 10:31:16,045 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9743 0.0237
[2026-05-18 10:31:16,045 INFO] src.engine_hmm: Chop_High 0.0248 0.0016 0.0262 0.9475
[2026-05-18 10:31:16,045 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:31:16,046 INFO] src.engine_hmm: Bull: return=0.062041, vol=0.360775, rsi_slope=-0.000404
[2026-05-18 10:31:16,046 INFO] src.engine_hmm: Bear: return=-0.142315, vol=1.799155, rsi_slope=0.010429
[2026-05-18 10:31:16,046 INFO] src.engine_hmm: Chop_Low: return=-0.027288, vol=-0.671898, rsi_slope=0.000851
[2026-05-18 10:31:16,047 INFO] src.engine_hmm: Chop_High: return=0.029017, vol=-0.253212, rsi_slope=-0.004362
[2026-05-18 10:31:16,049 INFO] src.engine_hmm: Total regime transitions: 9579
[2026-05-18 10:31:16,050 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:31:16,051 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:15:00: Bull -> Chop_High
[2026-05-18 10:31:16,051 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:31:16,051 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:31:16,051 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:31:16,053 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:31:16,053 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:31:16,053 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:31:16,054 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:31:16,054 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:31:16,281 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:31:16,312 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:31:16,501 INFO] src.engine_xgb: XGB Train Acc: 0.4958 | Test Acc: 0.4757
[2026-05-18 10:31:16,501 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.20124404), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.105648614), 'atr_normalized': np.float32(0.11574071), 'prev_log_return': np.float32(0.12971458), 'usdchf_log_return': np.float32(0.09064154), 'xagusd_log_return': np.float32(0.10248385), 'xtiusd_log_return': np.float32(0.12895457), 'synth_vix_zscore': np.float32(0.12557214)}
[2026-05-18 10:31:16,502 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:31:16,594 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4829
[2026-05-18 10:31:16,594 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11844015), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1970359), 'atr_normalized': np.float32(0.11106569), 'prev_log_return': np.float32(0.120009854), 'usdchf_log_return': np.float32(0.11042409), 'xagusd_log_return': np.float32(0.10604597), 'xtiusd_log_return': np.float32(0.1161117), 'synth_vix_zscore': np.float32(0.12086666)}
[2026-05-18 10:31:16,595 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:31:16,764 INFO] src.engine_xgb: XGB Train Acc: 0.5052 | Test Acc: 0.5103
[2026-05-18 10:31:16,764 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09301874), 'gmm_vol_cluster': np.float32(0.11334565), 'rsi_slope': np.float32(0.12675644), 'atr_normalized': np.float32(0.10905519), 'prev_log_return': np.float32(0.13006853), 'usdchf_log_return': np.float32(0.10903379), 'xagusd_log_return': np.float32(0.11097605), 'xtiusd_log_return': np.float32(0.10599389), 'synth_vix_zscore': np.float32(0.101751655)}
[2026-05-18 10:31:16,765 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:31:16,766 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:31:17,351 INFO] src.backtester: Backtest [M15]: Sharpe=-12.329 | MaxDD=1.601 | WR=0.330 | Return=-79.8% | Trades=2032
[2026-05-18 10:31:17,351 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:31:17,745 INFO] src.engine_xgb: XGB Train Acc: 0.5083 | Test Acc: 0.5430
[2026-05-18 10:31:17,746 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1571202), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.122267716), 'atr_normalized': np.float32(0.1264109), 'prev_log_return': np.float32(0.1312999), 'usdchf_log_return': np.float32(0.11231621), 'xagusd_log_return': np.float32(0.10179973), 'xtiusd_log_return': np.float32(0.13189119), 'synth_vix_zscore': np.float32(0.116894156)}
[2026-05-18 10:31:17,747 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:31:17,905 INFO] src.engine_xgb: XGB Train Acc: 0.5129 | Test Acc: 0.5423
[2026-05-18 10:31:17,906 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1020906), 'gmm_vol_cluster': np.float32(0.11468799), 'rsi_slope': np.float32(0.1517214), 'atr_normalized': np.float32(0.09892037), 'prev_log_return': np.float32(0.119253755), 'usdchf_log_return': np.float32(0.09378912), 'xagusd_log_return': np.float32(0.10154997), 'xtiusd_log_return': np.float32(0.10577867), 'synth_vix_zscore': np.float32(0.11220814)}
[2026-05-18 10:31:17,906 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:31:18,079 INFO] src.engine_xgb: XGB Train Acc: 0.5066 | Test Acc: 0.4994
[2026-05-18 10:31:18,081 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08704642), 'gmm_vol_cluster': np.float32(0.09356729), 'rsi_slope': np.float32(0.13327399), 'atr_normalized': np.float32(0.10500663), 'prev_log_return': np.float32(0.12977496), 'usdchf_log_return': np.float32(0.10256878), 'xagusd_log_return': np.float32(0.114379026), 'xtiusd_log_return': np.float32(0.09795027), 'synth_vix_zscore': np.float32(0.1364326)}
[2026-05-18 10:31:18,081 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:31:18,082 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:31:18,687 INFO] src.backtester: Backtest [M15]: Sharpe=-14.839 | MaxDD=2.042 | WR=0.328 | Return=-87.0% | Trades=2549
[2026-05-18 10:31:18,688 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:31:19,051 INFO] src.engine_xgb: XGB Train Acc: 0.5045 | Test Acc: 0.5131
[2026-05-18 10:31:19,052 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.113732025), 'gmm_vol_cluster': np.float32(0.09085704), 'rsi_slope': np.float32(0.13165398), 'atr_normalized': np.float32(0.09946989), 'prev_log_return': np.float32(0.14141825), 'usdchf_log_return': np.float32(0.09711852), 'xagusd_log_return': np.float32(0.11569907), 'xtiusd_log_return': np.float32(0.10393658), 'synth_vix_zscore': np.float32(0.1061146)}
[2026-05-18 10:31:19,052 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:31:19,231 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4869
[2026-05-18 10:31:19,232 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08874058), 'gmm_vol_cluster': np.float32(0.094710685), 'rsi_slope': np.float32(0.15704311), 'atr_normalized': np.float32(0.11333347), 'prev_log_return': np.float32(0.12871191), 'usdchf_log_return': np.float32(0.09365911), 'xagusd_log_return': np.float32(0.118140355), 'xtiusd_log_return': np.float32(0.10460649), 'synth_vix_zscore': np.float32(0.10105425)}
[2026-05-18 10:31:19,233 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:31:19,823 INFO] src.engine_xgb: XGB Train Acc: 0.5061 | Test Acc: 0.4984
[2026-05-18 10:31:19,824 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11962289), 'gmm_vol_cluster': np.float32(0.10395288), 'rsi_slope': np.float32(0.12600091), 'atr_normalized': np.float32(0.10263612), 'prev_log_return': np.float32(0.11364119), 'usdchf_log_return': np.float32(0.10792219), 'xagusd_log_return': np.float32(0.10598623), 'xtiusd_log_return': np.float32(0.10322086), 'synth_vix_zscore': np.float32(0.11701673)}
[2026-05-18 10:31:19,824 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:31:19,826 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:31:20,477 INFO] src.backtester: Backtest [M15]: Sharpe=-14.651 | MaxDD=1.985 | WR=0.331 | Return=-86.2% | Trades=2393
[2026-05-18 10:31:20,478 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:31:21,091 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5433
[2026-05-18 10:31:21,091 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10056813), 'gmm_vol_cluster': np.float32(0.10866245), 'rsi_slope': np.float32(0.13305593), 'atr_normalized': np.float32(0.114956826), 'prev_log_return': np.float32(0.12446844), 'usdchf_log_return': np.float32(0.11304771), 'xagusd_log_return': np.float32(0.102004565), 'xtiusd_log_return': np.float32(0.10160518), 'synth_vix_zscore': np.float32(0.10163074)}
[2026-05-18 10:31:21,092 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:31:21,631 INFO] src.engine_xgb: XGB Train Acc: 0.5123 | Test Acc: 0.5348
[2026-05-18 10:31:21,632 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09286704), 'gmm_vol_cluster': np.float32(0.09870153), 'rsi_slope': np.float32(0.15345243), 'atr_normalized': np.float32(0.10492058), 'prev_log_return': np.float32(0.12256623), 'usdchf_log_return': np.float32(0.10526998), 'xagusd_log_return': np.float32(0.108531564), 'xtiusd_log_return': np.float32(0.10543503), 'synth_vix_zscore': np.float32(0.10825567)}
[2026-05-18 10:31:21,632 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:31:22,090 INFO] src.engine_xgb: XGB Train Acc: 0.5101 | Test Acc: 0.5252
[2026-05-18 10:31:22,090 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14475892), 'gmm_vol_cluster': np.float32(0.084966406), 'rsi_slope': np.float32(0.13513477), 'atr_normalized': np.float32(0.098793335), 'prev_log_return': np.float32(0.1172763), 'usdchf_log_return': np.float32(0.10213696), 'xagusd_log_return': np.float32(0.09635907), 'xtiusd_log_return': np.float32(0.09627161), 'synth_vix_zscore': np.float32(0.12430256)}
[2026-05-18 10:31:22,092 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:31:22,093 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:31:22,252 INFO] src.backtester: Backtest [M15]: Sharpe=-12.794 | MaxDD=0.352 | WR=0.386 | Return=-29.6% | Trades=471
[2026-05-18 10:31:22,253 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 20%|██████████████▊ | 14/70 [23:14<1:44:27, 111.91s/it][2026-05-18 10:32:44,396 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:32:44,396 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:32:44,396 INFO] src.engine_hmm: Bull 0.9558 0.0106 0.0006 0.0329
[2026-05-18 10:32:44,397 INFO] src.engine_hmm: Bear 0.0341 0.9649 0.0003 0.0007
[2026-05-18 10:32:44,397 INFO] src.engine_hmm: Chop_Low 0.0013 0.0007 0.9740 0.0240
[2026-05-18 10:32:44,397 INFO] src.engine_hmm: Chop_High 0.0239 0.0018 0.0259 0.9485
[2026-05-18 10:32:44,397 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:32:44,397 INFO] src.engine_hmm: Bull: return=0.054313, vol=0.388627, rsi_slope=0.001842
[2026-05-18 10:32:44,397 INFO] src.engine_hmm: Bear: return=-0.159490, vol=1.948002, rsi_slope=0.007672
[2026-05-18 10:32:44,397 INFO] src.engine_hmm: Chop_Low: return=-0.015876, vol=-0.672025, rsi_slope=-0.000364
[2026-05-18 10:32:44,397 INFO] src.engine_hmm: Chop_High: return=0.022361, vol=-0.247537, rsi_slope=-0.003554
[2026-05-18 10:32:44,399 INFO] src.engine_hmm: Total regime transitions: 9558
[2026-05-18 10:32:44,399 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:32:44,399 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:32:44,399 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:32:44,399 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:32:44,401 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:32:44,401 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:32:44,401 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:32:44,401 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:32:44,401 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:32:44,401 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:32:44,557 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:32:44,576 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:32:44,693 INFO] src.engine_xgb: XGB Train Acc: 0.5111 | Test Acc: 0.4786
[2026-05-18 10:32:44,693 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13020986), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12744747), 'atr_normalized': np.float32(0.114448614), 'prev_log_return': np.float32(0.14228168), 'usdchf_log_return': np.float32(0.11756717), 'xagusd_log_return': np.float32(0.11103872), 'xtiusd_log_return': np.float32(0.12151309), 'synth_vix_zscore': np.float32(0.13549343)}
[2026-05-18 10:32:44,694 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:32:44,760 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4829
[2026-05-18 10:32:44,761 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11670686), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.2083782), 'atr_normalized': np.float32(0.10406721), 'prev_log_return': np.float32(0.118211), 'usdchf_log_return': np.float32(0.096638955), 'xagusd_log_return': np.float32(0.12726483), 'xtiusd_log_return': np.float32(0.114818335), 'synth_vix_zscore': np.float32(0.11391454)}
[2026-05-18 10:32:44,761 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:32:44,848 INFO] src.engine_xgb: XGB Train Acc: 0.5215 | Test Acc: 0.5194
[2026-05-18 10:32:44,848 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11988931), 'gmm_vol_cluster': np.float32(0.12594914), 'rsi_slope': np.float32(0.10521437), 'atr_normalized': np.float32(0.10303204), 'prev_log_return': np.float32(0.11953145), 'usdchf_log_return': np.float32(0.10992445), 'xagusd_log_return': np.float32(0.10791774), 'xtiusd_log_return': np.float32(0.10313219), 'synth_vix_zscore': np.float32(0.105409294)}
[2026-05-18 10:32:44,848 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:32:44,849 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:32:45,113 INFO] src.backtester: Backtest [M15]: Sharpe=-7.458 | MaxDD=0.764 | WR=0.361 | Return=-53.3% | Trades=1186
[2026-05-18 10:32:45,113 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:32:45,310 INFO] src.engine_xgb: XGB Train Acc: 0.5098 | Test Acc: 0.5442
[2026-05-18 10:32:45,311 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1245314), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12291863), 'atr_normalized': np.float32(0.14525978), 'prev_log_return': np.float32(0.124613985), 'usdchf_log_return': np.float32(0.12318127), 'xagusd_log_return': np.float32(0.12043513), 'xtiusd_log_return': np.float32(0.116456114), 'synth_vix_zscore': np.float32(0.12260368)}
[2026-05-18 10:32:45,311 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:32:45,479 INFO] src.engine_xgb: XGB Train Acc: 0.5268 | Test Acc: 0.5412
[2026-05-18 10:32:45,479 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10111365), 'gmm_vol_cluster': np.float32(0.13165365), 'rsi_slope': np.float32(0.13833407), 'atr_normalized': np.float32(0.09082956), 'prev_log_return': np.float32(0.10941576), 'usdchf_log_return': np.float32(0.10409805), 'xagusd_log_return': np.float32(0.106952645), 'xtiusd_log_return': np.float32(0.10968497), 'synth_vix_zscore': np.float32(0.10791774)}
[2026-05-18 10:32:45,479 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:32:45,587 INFO] src.engine_xgb: XGB Train Acc: 0.5084 | Test Acc: 0.4983
[2026-05-18 10:32:45,587 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11280702), 'gmm_vol_cluster': np.float32(0.08916497), 'rsi_slope': np.float32(0.12336195), 'atr_normalized': np.float32(0.09363133), 'prev_log_return': np.float32(0.12574165), 'usdchf_log_return': np.float32(0.102545716), 'xagusd_log_return': np.float32(0.11625693), 'xtiusd_log_return': np.float32(0.09682892), 'synth_vix_zscore': np.float32(0.1396615)}
[2026-05-18 10:32:45,588 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:32:45,589 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:32:45,872 INFO] src.backtester: Backtest [M15]: Sharpe=-10.930 | MaxDD=1.089 | WR=0.330 | Return=-66.2% | Trades=1329
[2026-05-18 10:32:45,872 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:32:46,067 WARNING] src.engine_xgb: hmm_state importance=0: XGBoost ignores the HMM regime. The regime-aligned filter gates signals on a feature XGB deems uninformative — likely caused by heavy regularisation or n_states=2. Consider re-optimising with n_states>=3 or lower reg_alpha/gamma.
[2026-05-18 10:32:46,068 INFO] src.engine_xgb: XGB Train Acc: 0.5045 | Test Acc: 0.5131
[2026-05-18 10:32:46,068 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14376096), 'atr_normalized': np.float32(0.1364697), 'prev_log_return': np.float32(0.15073973), 'usdchf_log_return': np.float32(0.14639375), 'xagusd_log_return': np.float32(0.15689334), 'xtiusd_log_return': np.float32(0.1318079), 'synth_vix_zscore': np.float32(0.13393459)}
[2026-05-18 10:32:46,068 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:32:46,209 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4869
[2026-05-18 10:32:46,209 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10289409), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16160786), 'atr_normalized': np.float32(0.120641194), 'prev_log_return': np.float32(0.14098093), 'usdchf_log_return': np.float32(0.098647304), 'xagusd_log_return': np.float32(0.1313531), 'xtiusd_log_return': np.float32(0.122707084), 'synth_vix_zscore': np.float32(0.12116847)}
[2026-05-18 10:32:46,209 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:32:46,397 INFO] src.engine_xgb: XGB Train Acc: 0.5115 | Test Acc: 0.5003
[2026-05-18 10:32:46,397 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1594683), 'gmm_vol_cluster': np.float32(0.08169746), 'rsi_slope': np.float32(0.118554175), 'atr_normalized': np.float32(0.11070371), 'prev_log_return': np.float32(0.114209995), 'usdchf_log_return': np.float32(0.094110325), 'xagusd_log_return': np.float32(0.09993263), 'xtiusd_log_return': np.float32(0.10185274), 'synth_vix_zscore': np.float32(0.11947069)}
[2026-05-18 10:32:46,397 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:32:46,398 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:32:46,681 INFO] src.backtester: Backtest [M15]: Sharpe=-9.499 | MaxDD=1.004 | WR=0.355 | Return=-63.3% | Trades=1293
[2026-05-18 10:32:46,682 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:32:46,894 WARNING] src.engine_xgb: hmm_state importance=0: XGBoost ignores the HMM regime. The regime-aligned filter gates signals on a feature XGB deems uninformative — likely caused by heavy regularisation or n_states=2. Consider re-optimising with n_states>=3 or lower reg_alpha/gamma.
[2026-05-18 10:32:46,894 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5433
[2026-05-18 10:32:46,895 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.17993288), 'atr_normalized': np.float32(0.16596477), 'prev_log_return': np.float32(0.13807087), 'usdchf_log_return': np.float32(0.12832303), 'xagusd_log_return': np.float32(0.13698438), 'xtiusd_log_return': np.float32(0.13343099), 'synth_vix_zscore': np.float32(0.1172931)}
[2026-05-18 10:32:46,895 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:32:47,122 INFO] src.engine_xgb: XGB Train Acc: 0.5151 | Test Acc: 0.5354
[2026-05-18 10:32:47,122 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1061473), 'gmm_vol_cluster': np.float32(0.13081928), 'rsi_slope': np.float32(0.12766217), 'atr_normalized': np.float32(0.100176625), 'prev_log_return': np.float32(0.124336995), 'usdchf_log_return': np.float32(0.10688545), 'xagusd_log_return': np.float32(0.10413023), 'xtiusd_log_return': np.float32(0.095389724), 'synth_vix_zscore': np.float32(0.104452275)}
[2026-05-18 10:32:47,123 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:32:47,315 INFO] src.engine_xgb: XGB Train Acc: 0.5126 | Test Acc: 0.5252
[2026-05-18 10:32:47,316 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11560176), 'gmm_vol_cluster': np.float32(0.08911754), 'rsi_slope': np.float32(0.13563608), 'atr_normalized': np.float32(0.10672134), 'prev_log_return': np.float32(0.12500353), 'usdchf_log_return': np.float32(0.11120178), 'xagusd_log_return': np.float32(0.08651482), 'xtiusd_log_return': np.float32(0.09660881), 'synth_vix_zscore': np.float32(0.13359426)}
[2026-05-18 10:32:47,316 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:32:47,317 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:32:47,398 INFO] src.backtester: Backtest [M15]: Sharpe=-10.962 | MaxDD=0.237 | WR=0.340 | Return=-21.1% | Trades=256
[2026-05-18 10:32:47,398 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[ 15/70] Best Score: -0.500 | ETA: 1h 30m RAM: 66%
Best trial: 4. Best value: -0.5: 21%|███████████████▊ | 15/70 [24:38<1:34:44, 103.36s/it][2026-05-18 10:34:19,199 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:34:19,199 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:34:19,199 INFO] src.engine_hmm: Bull 0.9555 0.0111 0.0006 0.0327
[2026-05-18 10:34:19,200 INFO] src.engine_hmm: Bear 0.0314 0.9670 0.0004 0.0013
[2026-05-18 10:34:19,200 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0236
[2026-05-18 10:34:19,200 INFO] src.engine_hmm: Chop_High 0.0244 0.0016 0.0261 0.9479
[2026-05-18 10:34:19,200 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:34:19,200 INFO] src.engine_hmm: Bull: return=0.056044, vol=0.375880, rsi_slope=0.000199
[2026-05-18 10:34:19,200 INFO] src.engine_hmm: Bear: return=-0.148193, vol=1.851211, rsi_slope=0.010183
[2026-05-18 10:34:19,200 INFO] src.engine_hmm: Chop_Low: return=-0.022951, vol=-0.670521, rsi_slope=0.000514
[2026-05-18 10:34:19,201 INFO] src.engine_hmm: Chop_High: return=0.029076, vol=-0.248197, rsi_slope=-0.004219
[2026-05-18 10:34:19,202 INFO] src.engine_hmm: Total regime transitions: 9503
[2026-05-18 10:34:19,203 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:34:19,203 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:34:19,203 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:34:19,203 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:34:19,203 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:34:19,204 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:34:19,204 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:34:19,204 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:34:19,204 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:34:19,205 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:34:19,365 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:34:19,384 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:34:19,492 INFO] src.engine_xgb: XGB Train Acc: 0.4958 | Test Acc: 0.4757
[2026-05-18 10:34:19,493 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.18849672), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11627574), 'atr_normalized': np.float32(0.12406437), 'prev_log_return': np.float32(0.13618372), 'usdchf_log_return': np.float32(0.097366214), 'xagusd_log_return': np.float32(0.09177136), 'xtiusd_log_return': np.float32(0.102656074), 'synth_vix_zscore': np.float32(0.1431858)}
[2026-05-18 10:34:19,493 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:34:19,572 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4829
[2026-05-18 10:34:19,572 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10169213), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.21756825), 'atr_normalized': np.float32(0.110005595), 'prev_log_return': np.float32(0.12959257), 'usdchf_log_return': np.float32(0.104705565), 'xagusd_log_return': np.float32(0.11992153), 'xtiusd_log_return': np.float32(0.10105692), 'synth_vix_zscore': np.float32(0.11545742)}
[2026-05-18 10:34:19,573 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:34:19,720 INFO] src.engine_xgb: XGB Train Acc: 0.5052 | Test Acc: 0.5103
[2026-05-18 10:34:19,720 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.114871696), 'gmm_vol_cluster': np.float32(0.12397934), 'rsi_slope': np.float32(0.117317535), 'atr_normalized': np.float32(0.09961869), 'prev_log_return': np.float32(0.12710649), 'usdchf_log_return': np.float32(0.10359885), 'xagusd_log_return': np.float32(0.11291239), 'xtiusd_log_return': np.float32(0.100776866), 'synth_vix_zscore': np.float32(0.09981821)}
[2026-05-18 10:34:19,721 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:34:19,722 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:34:20,124 INFO] src.backtester: Backtest [M15]: Sharpe=-12.707 | MaxDD=1.711 | WR=0.331 | Return=-81.9% | Trades=2181
[2026-05-18 10:34:20,125 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:34:20,341 INFO] src.engine_xgb: XGB Train Acc: 0.5083 | Test Acc: 0.5430
[2026-05-18 10:34:20,341 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12411825), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12308292), 'atr_normalized': np.float32(0.11872918), 'prev_log_return': np.float32(0.15068164), 'usdchf_log_return': np.float32(0.11791745), 'xagusd_log_return': np.float32(0.11148979), 'xtiusd_log_return': np.float32(0.12313793), 'synth_vix_zscore': np.float32(0.13084291)}
[2026-05-18 10:34:20,342 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:34:20,488 INFO] src.engine_xgb: XGB Train Acc: 0.5129 | Test Acc: 0.5423
[2026-05-18 10:34:20,488 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08999815), 'gmm_vol_cluster': np.float32(0.12162157), 'rsi_slope': np.float32(0.1618144), 'atr_normalized': np.float32(0.0904834), 'prev_log_return': np.float32(0.1372905), 'usdchf_log_return': np.float32(0.08625933), 'xagusd_log_return': np.float32(0.11331257), 'xtiusd_log_return': np.float32(0.09577099), 'synth_vix_zscore': np.float32(0.103449196)}
[2026-05-18 10:34:20,489 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:34:20,640 INFO] src.engine_xgb: XGB Train Acc: 0.5066 | Test Acc: 0.4994
[2026-05-18 10:34:20,640 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.080886066), 'gmm_vol_cluster': np.float32(0.08005301), 'rsi_slope': np.float32(0.13984142), 'atr_normalized': np.float32(0.09764625), 'prev_log_return': np.float32(0.14951327), 'usdchf_log_return': np.float32(0.09518645), 'xagusd_log_return': np.float32(0.10813485), 'xtiusd_log_return': np.float32(0.08586669), 'synth_vix_zscore': np.float32(0.162872)}
[2026-05-18 10:34:20,641 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:34:20,642 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:34:21,056 INFO] src.backtester: Backtest [M15]: Sharpe=-15.201 | MaxDD=2.161 | WR=0.328 | Return=-88.4% | Trades=2648
[2026-05-18 10:34:21,056 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:34:21,320 INFO] src.engine_xgb: XGB Train Acc: 0.5045 | Test Acc: 0.5131
[2026-05-18 10:34:21,320 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13082904), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14882141), 'atr_normalized': np.float32(0.10947485), 'prev_log_return': np.float32(0.14676234), 'usdchf_log_return': np.float32(0.113010295), 'xagusd_log_return': np.float32(0.1320772), 'xtiusd_log_return': np.float32(0.10696283), 'synth_vix_zscore': np.float32(0.11206209)}
[2026-05-18 10:34:21,321 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:34:21,494 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4869
[2026-05-18 10:34:21,494 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.07751638), 'gmm_vol_cluster': np.float32(0.06633133), 'rsi_slope': np.float32(0.18277986), 'atr_normalized': np.float32(0.107685626), 'prev_log_return': np.float32(0.14201944), 'usdchf_log_return': np.float32(0.095642895), 'xagusd_log_return': np.float32(0.13525432), 'xtiusd_log_return': np.float32(0.105845444), 'synth_vix_zscore': np.float32(0.08692475)}
[2026-05-18 10:34:21,495 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:34:21,681 INFO] src.engine_xgb: XGB Train Acc: 0.5053 | Test Acc: 0.4984
[2026-05-18 10:34:21,681 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13559133), 'gmm_vol_cluster': np.float32(0.0810133), 'rsi_slope': np.float32(0.15998113), 'atr_normalized': np.float32(0.09075509), 'prev_log_return': np.float32(0.12587343), 'usdchf_log_return': np.float32(0.102412686), 'xagusd_log_return': np.float32(0.097063884), 'xtiusd_log_return': np.float32(0.0812473), 'synth_vix_zscore': np.float32(0.12606189)}
[2026-05-18 10:34:21,682 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:34:21,683 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:34:22,089 INFO] src.backtester: Backtest [M15]: Sharpe=-14.793 | MaxDD=2.113 | WR=0.333 | Return=-87.8% | Trades=2537
[2026-05-18 10:34:22,089 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:34:22,377 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5433
[2026-05-18 10:34:22,377 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14300883), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16070627), 'atr_normalized': np.float32(0.12117399), 'prev_log_return': np.float32(0.1435712), 'usdchf_log_return': np.float32(0.10847348), 'xagusd_log_return': np.float32(0.111449234), 'xtiusd_log_return': np.float32(0.09534482), 'synth_vix_zscore': np.float32(0.1162722)}
[2026-05-18 10:34:22,378 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:34:23,268 INFO] src.engine_xgb: XGB Train Acc: 0.5123 | Test Acc: 0.5348
[2026-05-18 10:34:23,269 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10552927), 'gmm_vol_cluster': np.float32(0.08986741), 'rsi_slope': np.float32(0.15413642), 'atr_normalized': np.float32(0.103418), 'prev_log_return': np.float32(0.12502275), 'usdchf_log_return': np.float32(0.10070539), 'xagusd_log_return': np.float32(0.10704283), 'xtiusd_log_return': np.float32(0.10618887), 'synth_vix_zscore': np.float32(0.10808906)}
[2026-05-18 10:34:23,269 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:34:23,535 INFO] src.engine_xgb: XGB Train Acc: 0.5101 | Test Acc: 0.5252
[2026-05-18 10:34:23,536 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.121275164), 'gmm_vol_cluster': np.float32(0.095320046), 'rsi_slope': np.float32(0.16126145), 'atr_normalized': np.float32(0.09418164), 'prev_log_return': np.float32(0.12366128), 'usdchf_log_return': np.float32(0.092608444), 'xagusd_log_return': np.float32(0.100626245), 'xtiusd_log_return': np.float32(0.07857857), 'synth_vix_zscore': np.float32(0.13248721)}
[2026-05-18 10:34:23,537 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:34:23,538 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:34:23,687 INFO] src.backtester: Backtest [M15]: Sharpe=-14.099 | MaxDD=0.417 | WR=0.366 | Return=-34.1% | Trades=503
[2026-05-18 10:34:23,688 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 23%|████████████████▉ | 16/70 [26:14<1:31:05, 101.22s/it][2026-05-18 10:35:57,137 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:35:57,137 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:35:57,138 INFO] src.engine_hmm: Bull 0.9554 0.0112 0.0006 0.0328
[2026-05-18 10:35:57,138 INFO] src.engine_hmm: Bear 0.0313 0.9670 0.0004 0.0013
[2026-05-18 10:35:57,138 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0236
[2026-05-18 10:35:57,138 INFO] src.engine_hmm: Chop_High 0.0245 0.0016 0.0261 0.9479
[2026-05-18 10:35:57,139 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:35:57,139 INFO] src.engine_hmm: Bull: return=0.056370, vol=0.373970, rsi_slope=0.000129
[2026-05-18 10:35:57,139 INFO] src.engine_hmm: Bear: return=-0.146933, vol=1.845531, rsi_slope=0.010234
[2026-05-18 10:35:57,139 INFO] src.engine_hmm: Chop_Low: return=-0.023262, vol=-0.670676, rsi_slope=0.000538
[2026-05-18 10:35:57,139 INFO] src.engine_hmm: Chop_High: return=0.028988, vol=-0.248803, rsi_slope=-0.004228
[2026-05-18 10:35:57,141 INFO] src.engine_hmm: Total regime transitions: 9511
[2026-05-18 10:35:57,141 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:35:57,142 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:15:00: Bull -> Chop_High
[2026-05-18 10:35:57,142 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:35:57,142 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:35:57,142 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:35:57,142 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:35:57,143 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:35:57,143 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:35:57,143 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:35:57,143 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:35:57,302 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:35:57,325 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:35:57,455 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:35:57,456 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.18776034), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11462997), 'atr_normalized': np.float32(0.116050005), 'prev_log_return': np.float32(0.13754345), 'usdchf_log_return': np.float32(0.10407485), 'xagusd_log_return': np.float32(0.11319478), 'xtiusd_log_return': np.float32(0.11145948), 'synth_vix_zscore': np.float32(0.1152871)}
[2026-05-18 10:35:57,456 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:35:57,592 INFO] src.engine_xgb: XGB Train Acc: 0.4968 | Test Acc: 0.5175
[2026-05-18 10:35:57,593 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11053732), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14692155), 'atr_normalized': np.float32(0.11821434), 'prev_log_return': np.float32(0.1307), 'usdchf_log_return': np.float32(0.12919535), 'xagusd_log_return': np.float32(0.11529586), 'xtiusd_log_return': np.float32(0.11783853), 'synth_vix_zscore': np.float32(0.13129707)}
[2026-05-18 10:35:57,593 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:35:57,856 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4953
[2026-05-18 10:35:57,857 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0998327), 'gmm_vol_cluster': np.float32(0.09565558), 'rsi_slope': np.float32(0.11469585), 'atr_normalized': np.float32(0.11323633), 'prev_log_return': np.float32(0.1171773), 'usdchf_log_return': np.float32(0.11563187), 'xagusd_log_return': np.float32(0.109194055), 'xtiusd_log_return': np.float32(0.119419105), 'synth_vix_zscore': np.float32(0.11515725)}
[2026-05-18 10:35:57,857 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:35:57,858 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:35:58,268 INFO] src.backtester: Backtest [M15]: Sharpe=-4.961 | MaxDD=0.848 | WR=0.361 | Return=-57.1% | Trades=1076
[2026-05-18 10:35:58,269 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:35:58,543 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 10:35:58,544 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1502568), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12231223), 'atr_normalized': np.float32(0.13123485), 'prev_log_return': np.float32(0.12723307), 'usdchf_log_return': np.float32(0.121096425), 'xagusd_log_return': np.float32(0.10605637), 'xtiusd_log_return': np.float32(0.123549476), 'synth_vix_zscore': np.float32(0.11826083)}
[2026-05-18 10:35:58,544 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:35:58,780 INFO] src.engine_xgb: XGB Train Acc: 0.4877 | Test Acc: 0.4574
[2026-05-18 10:35:58,781 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0936034), 'gmm_vol_cluster': np.float32(0.15249497), 'rsi_slope': np.float32(0.11781455), 'atr_normalized': np.float32(0.1018674), 'prev_log_return': np.float32(0.11371023), 'usdchf_log_return': np.float32(0.10533187), 'xagusd_log_return': np.float32(0.104564026), 'xtiusd_log_return': np.float32(0.1031225), 'synth_vix_zscore': np.float32(0.10749102)}
[2026-05-18 10:35:58,781 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:35:58,959 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 10:35:58,959 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10686767), 'gmm_vol_cluster': np.float32(0.09430307), 'rsi_slope': np.float32(0.1282415), 'atr_normalized': np.float32(0.10363919), 'prev_log_return': np.float32(0.119714126), 'usdchf_log_return': np.float32(0.10148831), 'xagusd_log_return': np.float32(0.11719922), 'xtiusd_log_return': np.float32(0.10586773), 'synth_vix_zscore': np.float32(0.12267917)}
[2026-05-18 10:35:58,960 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:35:58,961 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:35:59,375 INFO] src.backtester: Backtest [M15]: Sharpe=-5.684 | MaxDD=0.683 | WR=0.337 | Return=-49.4% | Trades=941
[2026-05-18 10:35:59,375 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:35:59,650 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 10:35:59,651 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12244581), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13487637), 'atr_normalized': np.float32(0.12451392), 'prev_log_return': np.float32(0.13719867), 'usdchf_log_return': np.float32(0.12031883), 'xagusd_log_return': np.float32(0.13344495), 'xtiusd_log_return': np.float32(0.10295968), 'synth_vix_zscore': np.float32(0.12424182)}
[2026-05-18 10:35:59,651 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:35:59,929 INFO] src.engine_xgb: XGB Train Acc: 0.4912 | Test Acc: 0.5132
[2026-05-18 10:35:59,930 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.104582004), 'gmm_vol_cluster': np.float32(0.12130446), 'rsi_slope': np.float32(0.11324477), 'atr_normalized': np.float32(0.10463056), 'prev_log_return': np.float32(0.11801352), 'usdchf_log_return': np.float32(0.10367951), 'xagusd_log_return': np.float32(0.11297917), 'xtiusd_log_return': np.float32(0.11025572), 'synth_vix_zscore': np.float32(0.1113103)}
[2026-05-18 10:35:59,930 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:36:00,256 INFO] src.engine_xgb: XGB Train Acc: 0.4947 | Test Acc: 0.5016
[2026-05-18 10:36:00,257 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12125396), 'gmm_vol_cluster': np.float32(0.082370624), 'rsi_slope': np.float32(0.117622614), 'atr_normalized': np.float32(0.113460355), 'prev_log_return': np.float32(0.112587556), 'usdchf_log_return': np.float32(0.10890119), 'xagusd_log_return': np.float32(0.1166039), 'xtiusd_log_return': np.float32(0.11196913), 'synth_vix_zscore': np.float32(0.11523064)}
[2026-05-18 10:36:00,257 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:36:00,259 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:36:00,665 INFO] src.backtester: Backtest [M15]: Sharpe=-6.567 | MaxDD=0.958 | WR=0.334 | Return=-61.6% | Trades=1103
[2026-05-18 10:36:00,666 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:36:00,935 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:36:00,936 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14801928), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1427861), 'atr_normalized': np.float32(0.11899088), 'prev_log_return': np.float32(0.13527903), 'usdchf_log_return': np.float32(0.11543816), 'xagusd_log_return': np.float32(0.111368336), 'xtiusd_log_return': np.float32(0.108912714), 'synth_vix_zscore': np.float32(0.119205505)}
[2026-05-18 10:36:00,937 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:36:01,277 INFO] src.engine_xgb: XGB Train Acc: 0.4877 | Test Acc: 0.4652
[2026-05-18 10:36:01,277 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.106552035), 'gmm_vol_cluster': np.float32(0.12368192), 'rsi_slope': np.float32(0.11925393), 'atr_normalized': np.float32(0.10429952), 'prev_log_return': np.float32(0.11483678), 'usdchf_log_return': np.float32(0.10508246), 'xagusd_log_return': np.float32(0.10454474), 'xtiusd_log_return': np.float32(0.109723106), 'synth_vix_zscore': np.float32(0.11202556)}
[2026-05-18 10:36:01,278 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:36:01,579 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 10:36:01,579 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.109377), 'gmm_vol_cluster': np.float32(0.103499144), 'rsi_slope': np.float32(0.12659435), 'atr_normalized': np.float32(0.10751157), 'prev_log_return': np.float32(0.116337955), 'usdchf_log_return': np.float32(0.10453843), 'xagusd_log_return': np.float32(0.109669186), 'xtiusd_log_return': np.float32(0.10841809), 'synth_vix_zscore': np.float32(0.11405423)}
[2026-05-18 10:36:01,580 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:36:01,581 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:36:01,722 INFO] src.backtester: Backtest [M15]: Sharpe=-5.964 | MaxDD=0.477 | WR=0.391 | Return=-37.1% | Trades=667
[2026-05-18 10:36:01,722 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 24%|█████████████████▉ | 17/70 [27:52<1:28:34, 100.26s/it][2026-05-18 10:37:02,864 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:37:02,864 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:37:02,864 INFO] src.engine_hmm: Bull 0.9557 0.0108 0.0006 0.0329
[2026-05-18 10:37:02,865 INFO] src.engine_hmm: Bear 0.0332 0.9655 0.0004 0.0009
[2026-05-18 10:37:02,865 INFO] src.engine_hmm: Chop_Low 0.0013 0.0007 0.9741 0.0239
[2026-05-18 10:37:02,865 INFO] src.engine_hmm: Chop_High 0.0240 0.0017 0.0259 0.9484
[2026-05-18 10:37:02,865 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:37:02,865 INFO] src.engine_hmm: Bull: return=0.054339, vol=0.384642, rsi_slope=0.001498
[2026-05-18 10:37:02,865 INFO] src.engine_hmm: Bear: return=-0.156846, vol=1.916414, rsi_slope=0.008209
[2026-05-18 10:37:02,865 INFO] src.engine_hmm: Chop_Low: return=-0.017934, vol=-0.671737, rsi_slope=-0.000115
[2026-05-18 10:37:02,865 INFO] src.engine_hmm: Chop_High: return=0.024972, vol=-0.247961, rsi_slope=-0.003769
[2026-05-18 10:37:02,867 INFO] src.engine_hmm: Total regime transitions: 9538
[2026-05-18 10:37:02,867 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:37:02,867 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:37:02,868 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:37:02,868 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:37:02,868 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:37:02,868 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:37:02,868 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:37:02,869 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:37:02,869 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:37:02,869 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:37:03,018 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:37:03,036 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:37:03,208 INFO] src.engine_xgb: XGB Train Acc: 0.5569 | Test Acc: 0.5167
[2026-05-18 10:37:03,209 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.2152857), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.10799147), 'atr_normalized': np.float32(0.11591936), 'prev_log_return': np.float32(0.12633094), 'usdchf_log_return': np.float32(0.10211281), 'xagusd_log_return': np.float32(0.10097376), 'xtiusd_log_return': np.float32(0.1153574), 'synth_vix_zscore': np.float32(0.11602851)}
[2026-05-18 10:37:03,209 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:37:03,356 INFO] src.engine_xgb: XGB Train Acc: 0.5790 | Test Acc: 0.5135
[2026-05-18 10:37:03,356 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.108187154), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15971504), 'atr_normalized': np.float32(0.11950814), 'prev_log_return': np.float32(0.12637413), 'usdchf_log_return': np.float32(0.12410095), 'xagusd_log_return': np.float32(0.113228075), 'xtiusd_log_return': np.float32(0.12591058), 'synth_vix_zscore': np.float32(0.12297586)}
[2026-05-18 10:37:03,357 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:37:03,489 INFO] src.engine_xgb: XGB Train Acc: 0.5412 | Test Acc: 0.4925
[2026-05-18 10:37:03,490 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.097823285), 'gmm_vol_cluster': np.float32(0.12993999), 'rsi_slope': np.float32(0.10749616), 'atr_normalized': np.float32(0.1089475), 'prev_log_return': np.float32(0.1220197), 'usdchf_log_return': np.float32(0.10629603), 'xagusd_log_return': np.float32(0.11296396), 'xtiusd_log_return': np.float32(0.117716014), 'synth_vix_zscore': np.float32(0.09679739)}
[2026-05-18 10:37:03,490 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:37:03,491 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:37:03,820 INFO] src.backtester: Backtest [M15]: Sharpe=0.000 | MaxDD=0.000 | WR=0.000 | Return=0.0% | Trades=0
[2026-05-18 10:37:03,821 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:37:04,122 INFO] src.engine_xgb: XGB Train Acc: 0.5323 | Test Acc: 0.4761
[2026-05-18 10:37:04,122 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13347542), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1194299), 'atr_normalized': np.float32(0.12301558), 'prev_log_return': np.float32(0.13590346), 'usdchf_log_return': np.float32(0.12328209), 'xagusd_log_return': np.float32(0.11927665), 'xtiusd_log_return': np.float32(0.121730015), 'synth_vix_zscore': np.float32(0.123886846)}
[2026-05-18 10:37:04,123 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:37:04,499 INFO] src.engine_xgb: XGB Train Acc: 0.5708 | Test Acc: 0.5032
[2026-05-18 10:37:04,500 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10793072), 'gmm_vol_cluster': np.float32(0.12826861), 'rsi_slope': np.float32(0.13458177), 'atr_normalized': np.float32(0.10042892), 'prev_log_return': np.float32(0.1141249), 'usdchf_log_return': np.float32(0.102340326), 'xagusd_log_return': np.float32(0.104218364), 'xtiusd_log_return': np.float32(0.10332092), 'synth_vix_zscore': np.float32(0.10478553)}
[2026-05-18 10:37:04,500 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:37:04,735 INFO] src.engine_xgb: XGB Train Acc: 0.5547 | Test Acc: 0.5113
[2026-05-18 10:37:04,736 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.106923535), 'gmm_vol_cluster': np.float32(0.11415052), 'rsi_slope': np.float32(0.12364914), 'atr_normalized': np.float32(0.10391604), 'prev_log_return': np.float32(0.12050375), 'usdchf_log_return': np.float32(0.100162566), 'xagusd_log_return': np.float32(0.106350206), 'xtiusd_log_return': np.float32(0.100214235), 'synth_vix_zscore': np.float32(0.12413007)}
[2026-05-18 10:37:04,736 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:37:04,738 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:37:05,075 INFO] src.backtester: Backtest [M15]: Sharpe=-2.707 | MaxDD=0.050 | WR=0.416 | Return=-4.9% | Trades=77
[2026-05-18 10:37:05,076 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:37:05,350 INFO] src.engine_xgb: XGB Train Acc: 0.4984 | Test Acc: 0.4871
[2026-05-18 10:37:05,350 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.125249), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14604588), 'atr_normalized': np.float32(0.11406324), 'prev_log_return': np.float32(0.15154794), 'usdchf_log_return': np.float32(0.11106451), 'xagusd_log_return': np.float32(0.13097742), 'xtiusd_log_return': np.float32(0.10715884), 'synth_vix_zscore': np.float32(0.11389312)}
[2026-05-18 10:37:05,351 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:37:05,677 INFO] src.engine_xgb: XGB Train Acc: 0.5570 | Test Acc: 0.5092
[2026-05-18 10:37:05,678 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09508397), 'gmm_vol_cluster': np.float32(0.070720926), 'rsi_slope': np.float32(0.1438982), 'atr_normalized': np.float32(0.11139195), 'prev_log_return': np.float32(0.13071327), 'usdchf_log_return': np.float32(0.10292332), 'xagusd_log_return': np.float32(0.12121249), 'xtiusd_log_return': np.float32(0.11209517), 'synth_vix_zscore': np.float32(0.111960724)}
[2026-05-18 10:37:05,678 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:37:06,324 INFO] src.engine_xgb: XGB Train Acc: 0.5667 | Test Acc: 0.5155
[2026-05-18 10:37:06,325 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10807622), 'gmm_vol_cluster': np.float32(0.108025536), 'rsi_slope': np.float32(0.12782294), 'atr_normalized': np.float32(0.10601961), 'prev_log_return': np.float32(0.11071901), 'usdchf_log_return': np.float32(0.10704725), 'xagusd_log_return': np.float32(0.10987355), 'xtiusd_log_return': np.float32(0.10562308), 'synth_vix_zscore': np.float32(0.11679289)}
[2026-05-18 10:37:06,325 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:37:06,327 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:37:06,685 INFO] src.backtester: Backtest [M15]: Sharpe=-2.305 | MaxDD=0.108 | WR=0.349 | Return=-10.1% | Trades=129
[2026-05-18 10:37:06,685 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:37:06,967 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:37:06,968 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10541278), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14847182), 'atr_normalized': np.float32(0.12647039), 'prev_log_return': np.float32(0.16010104), 'usdchf_log_return': np.float32(0.12345055), 'xagusd_log_return': np.float32(0.10977473), 'xtiusd_log_return': np.float32(0.11607942), 'synth_vix_zscore': np.float32(0.11023934)}
[2026-05-18 10:37:06,968 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:37:07,425 INFO] src.engine_xgb: XGB Train Acc: 0.5486 | Test Acc: 0.5042
[2026-05-18 10:37:07,425 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10757992), 'gmm_vol_cluster': np.float32(0.09663034), 'rsi_slope': np.float32(0.14498515), 'atr_normalized': np.float32(0.10496599), 'prev_log_return': np.float32(0.12467758), 'usdchf_log_return': np.float32(0.10244857), 'xagusd_log_return': np.float32(0.10255193), 'xtiusd_log_return': np.float32(0.1060793), 'synth_vix_zscore': np.float32(0.1100812)}
[2026-05-18 10:37:07,426 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:37:07,853 INFO] src.engine_xgb: XGB Train Acc: 0.5442 | Test Acc: 0.5037
[2026-05-18 10:37:07,854 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1189722), 'gmm_vol_cluster': np.float32(0.10821898), 'rsi_slope': np.float32(0.1427975), 'atr_normalized': np.float32(0.10394183), 'prev_log_return': np.float32(0.11718267), 'usdchf_log_return': np.float32(0.09950023), 'xagusd_log_return': np.float32(0.09367604), 'xtiusd_log_return': np.float32(0.09643502), 'synth_vix_zscore': np.float32(0.119275495)}
[2026-05-18 10:37:07,854 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:37:07,856 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:37:07,959 INFO] src.backtester: Backtest [M15]: Sharpe=0.000 | MaxDD=0.000 | WR=0.000 | Return=0.0% | Trades=0
[2026-05-18 10:37:07,960 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 26%|███████████████████▎ | 18/70 [28:59<1:18:02, 90.05s/it][2026-05-18 10:38:02,837 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:38:02,837 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:38:02,837 INFO] src.engine_hmm: Bull 0.9558 0.0104 0.0007 0.0330
[2026-05-18 10:38:02,838 INFO] src.engine_hmm: Bear 0.0357 0.9637 0.0001 0.0005
[2026-05-18 10:38:02,838 INFO] src.engine_hmm: Chop_Low 0.0012 0.0008 0.9735 0.0245
[2026-05-18 10:38:02,838 INFO] src.engine_hmm: Chop_High 0.0237 0.0020 0.0262 0.9481
[2026-05-18 10:38:02,838 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:38:02,838 INFO] src.engine_hmm: Bull: return=0.058493, vol=0.390540, rsi_slope=0.002696
[2026-05-18 10:38:02,838 INFO] src.engine_hmm: Bear: return=-0.168456, vol=1.969706, rsi_slope=0.007698
[2026-05-18 10:38:02,839 INFO] src.engine_hmm: Chop_Low: return=-0.011309, vol=-0.672732, rsi_slope=-0.000870
[2026-05-18 10:38:02,839 INFO] src.engine_hmm: Chop_High: return=0.016100, vol=-0.248142, rsi_slope=-0.003707
[2026-05-18 10:38:02,840 INFO] src.engine_hmm: Total regime transitions: 9618
[2026-05-18 10:38:02,841 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:38:02,841 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:38:02,841 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:38:02,841 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:30:00: Bear -> Bull
[2026-05-18 10:38:02,841 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:38:02,842 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:38:02,842 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:38:02,842 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:38:02,842 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:38:02,842 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:38:02,987 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:38:03,006 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:38:03,108 INFO] src.engine_xgb: XGB Train Acc: 0.4958 | Test Acc: 0.4757
[2026-05-18 10:38:03,109 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16668314), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12181408), 'atr_normalized': np.float32(0.12198474), 'prev_log_return': np.float32(0.1412483), 'usdchf_log_return': np.float32(0.080935255), 'xagusd_log_return': np.float32(0.091253296), 'xtiusd_log_return': np.float32(0.13018425), 'synth_vix_zscore': np.float32(0.145897)}
[2026-05-18 10:38:03,109 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:38:03,184 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4829
[2026-05-18 10:38:03,184 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10667206), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.24937154), 'atr_normalized': np.float32(0.105587624), 'prev_log_return': np.float32(0.11855717), 'usdchf_log_return': np.float32(0.10486434), 'xagusd_log_return': np.float32(0.12828518), 'xtiusd_log_return': np.float32(0.07562327), 'synth_vix_zscore': np.float32(0.11103881)}
[2026-05-18 10:38:03,185 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:38:03,263 INFO] src.engine_xgb: XGB Train Acc: 0.5052 | Test Acc: 0.5103
[2026-05-18 10:38:03,264 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15115121), 'gmm_vol_cluster': np.float32(0.08328), 'rsi_slope': np.float32(0.10057552), 'atr_normalized': np.float32(0.09944652), 'prev_log_return': np.float32(0.1696242), 'usdchf_log_return': np.float32(0.10374149), 'xagusd_log_return': np.float32(0.11612414), 'xtiusd_log_return': np.float32(0.08250031), 'synth_vix_zscore': np.float32(0.093556605)}
[2026-05-18 10:38:03,264 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:38:03,265 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:38:03,642 INFO] src.backtester: Backtest [M15]: Sharpe=-12.408 | MaxDD=1.684 | WR=0.340 | Return=-81.4% | Trades=2202
[2026-05-18 10:38:03,642 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:38:03,837 INFO] src.engine_xgb: XGB Train Acc: 0.5083 | Test Acc: 0.5430
[2026-05-18 10:38:03,837 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12702207), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13909277), 'atr_normalized': np.float32(0.1179117), 'prev_log_return': np.float32(0.16004665), 'usdchf_log_return': np.float32(0.1034289), 'xagusd_log_return': np.float32(0.11269505), 'xtiusd_log_return': np.float32(0.12794116), 'synth_vix_zscore': np.float32(0.11186171)}
[2026-05-18 10:38:03,838 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:38:03,960 INFO] src.engine_xgb: XGB Train Acc: 0.5129 | Test Acc: 0.5423
[2026-05-18 10:38:03,960 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.094542176), 'gmm_vol_cluster': np.float32(0.096166894), 'rsi_slope': np.float32(0.17878681), 'atr_normalized': np.float32(0.09512526), 'prev_log_return': np.float32(0.15755513), 'usdchf_log_return': np.float32(0.0766617), 'xagusd_log_return': np.float32(0.12262342), 'xtiusd_log_return': np.float32(0.07635923), 'synth_vix_zscore': np.float32(0.10217944)}
[2026-05-18 10:38:03,961 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:38:04,096 INFO] src.engine_xgb: XGB Train Acc: 0.5066 | Test Acc: 0.4994
[2026-05-18 10:38:04,097 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.116022296), 'gmm_vol_cluster': np.float32(0.08452787), 'rsi_slope': np.float32(0.14064544), 'atr_normalized': np.float32(0.09189337), 'prev_log_return': np.float32(0.15741885), 'usdchf_log_return': np.float32(0.08132093), 'xagusd_log_return': np.float32(0.10870927), 'xtiusd_log_return': np.float32(0.08526128), 'synth_vix_zscore': np.float32(0.13420065)}
[2026-05-18 10:38:04,097 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:38:04,098 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:38:04,508 INFO] src.backtester: Backtest [M15]: Sharpe=-15.109 | MaxDD=2.164 | WR=0.328 | Return=-88.5% | Trades=2706
[2026-05-18 10:38:04,508 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:38:04,749 INFO] src.engine_xgb: XGB Train Acc: 0.5045 | Test Acc: 0.5131
[2026-05-18 10:38:04,749 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0973655), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.18250108), 'atr_normalized': np.float32(0.09170917), 'prev_log_return': np.float32(0.17591126), 'usdchf_log_return': np.float32(0.118046656), 'xagusd_log_return': np.float32(0.13151035), 'xtiusd_log_return': np.float32(0.11389046), 'synth_vix_zscore': np.float32(0.089065574)}
[2026-05-18 10:38:04,750 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:38:04,903 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4869
[2026-05-18 10:38:04,903 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.091510914), 'gmm_vol_cluster': np.float32(0.071616456), 'rsi_slope': np.float32(0.19105686), 'atr_normalized': np.float32(0.09569738), 'prev_log_return': np.float32(0.13191232), 'usdchf_log_return': np.float32(0.07234268), 'xagusd_log_return': np.float32(0.14635114), 'xtiusd_log_return': np.float32(0.10443867), 'synth_vix_zscore': np.float32(0.09507359)}
[2026-05-18 10:38:04,904 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:38:05,082 INFO] src.engine_xgb: XGB Train Acc: 0.5053 | Test Acc: 0.4984
[2026-05-18 10:38:05,083 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11411844), 'gmm_vol_cluster': np.float32(0.06201085), 'rsi_slope': np.float32(0.19017895), 'atr_normalized': np.float32(0.08590235), 'prev_log_return': np.float32(0.123076625), 'usdchf_log_return': np.float32(0.09641277), 'xagusd_log_return': np.float32(0.113780096), 'xtiusd_log_return': np.float32(0.07176702), 'synth_vix_zscore': np.float32(0.14275295)}
[2026-05-18 10:38:05,083 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:38:05,085 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:38:05,490 INFO] src.backtester: Backtest [M15]: Sharpe=-14.757 | MaxDD=2.133 | WR=0.336 | Return=-88.0% | Trades=2570
[2026-05-18 10:38:05,490 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:38:05,732 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5433
[2026-05-18 10:38:05,732 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10563416), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.18652782), 'atr_normalized': np.float32(0.10848611), 'prev_log_return': np.float32(0.18275452), 'usdchf_log_return': np.float32(0.0991778), 'xagusd_log_return': np.float32(0.10897781), 'xtiusd_log_return': np.float32(0.11347348), 'synth_vix_zscore': np.float32(0.094968416)}
[2026-05-18 10:38:05,733 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:38:05,944 INFO] src.engine_xgb: XGB Train Acc: 0.5123 | Test Acc: 0.5348
[2026-05-18 10:38:05,944 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09349773), 'gmm_vol_cluster': np.float32(0.09814328), 'rsi_slope': np.float32(0.23368567), 'atr_normalized': np.float32(0.08278458), 'prev_log_return': np.float32(0.13246657), 'usdchf_log_return': np.float32(0.07796846), 'xagusd_log_return': np.float32(0.10633777), 'xtiusd_log_return': np.float32(0.0862774), 'synth_vix_zscore': np.float32(0.088838555)}
[2026-05-18 10:38:05,945 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:38:06,186 INFO] src.engine_xgb: XGB Train Acc: 0.5101 | Test Acc: 0.5252
[2026-05-18 10:38:06,186 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13868359), 'gmm_vol_cluster': np.float32(0.09082777), 'rsi_slope': np.float32(0.17364463), 'atr_normalized': np.float32(0.07521012), 'prev_log_return': np.float32(0.12506458), 'usdchf_log_return': np.float32(0.07675196), 'xagusd_log_return': np.float32(0.116697766), 'xtiusd_log_return': np.float32(0.06516603), 'synth_vix_zscore': np.float32(0.13795362)}
[2026-05-18 10:38:06,186 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:38:06,188 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:38:06,335 INFO] src.backtester: Backtest [M15]: Sharpe=-14.322 | MaxDD=0.441 | WR=0.363 | Return=-35.7% | Trades=540
[2026-05-18 10:38:06,335 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 27%|████████████████████▎ | 19/70 [29:57<1:08:26, 80.53s/it][2026-05-18 10:39:07,385 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:39:07,385 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:39:07,385 INFO] src.engine_hmm: Bull 0.9557 0.0108 0.0006 0.0329
[2026-05-18 10:39:07,386 INFO] src.engine_hmm: Bear 0.0332 0.9655 0.0004 0.0009
[2026-05-18 10:39:07,386 INFO] src.engine_hmm: Chop_Low 0.0013 0.0007 0.9741 0.0239
[2026-05-18 10:39:07,386 INFO] src.engine_hmm: Chop_High 0.0240 0.0017 0.0259 0.9484
[2026-05-18 10:39:07,386 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:39:07,386 INFO] src.engine_hmm: Bull: return=0.054335, vol=0.384693, rsi_slope=0.001500
[2026-05-18 10:39:07,386 INFO] src.engine_hmm: Bear: return=-0.156840, vol=1.916648, rsi_slope=0.008206
[2026-05-18 10:39:07,387 INFO] src.engine_hmm: Chop_Low: return=-0.017923, vol=-0.671734, rsi_slope=-0.000116
[2026-05-18 10:39:07,387 INFO] src.engine_hmm: Chop_High: return=0.024952, vol=-0.247946, rsi_slope=-0.003768
[2026-05-18 10:39:07,388 INFO] src.engine_hmm: Total regime transitions: 9538
[2026-05-18 10:39:07,389 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:39:07,389 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:39:07,389 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:39:07,389 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:39:07,389 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:39:07,390 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:39:07,390 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:39:07,390 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:39:07,390 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:39:07,390 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:39:07,551 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:39:07,569 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:39:07,678 INFO] src.engine_xgb: XGB Train Acc: 0.4958 | Test Acc: 0.4757
[2026-05-18 10:39:07,678 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15129007), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12109455), 'atr_normalized': np.float32(0.1261975), 'prev_log_return': np.float32(0.14807357), 'usdchf_log_return': np.float32(0.09455153), 'xagusd_log_return': np.float32(0.08097783), 'xtiusd_log_return': np.float32(0.1211811), 'synth_vix_zscore': np.float32(0.15663385)}
[2026-05-18 10:39:07,678 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:39:07,750 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4829
[2026-05-18 10:39:07,750 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.102007), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.27690232), 'atr_normalized': np.float32(0.09709442), 'prev_log_return': np.float32(0.11980716), 'usdchf_log_return': np.float32(0.09179275), 'xagusd_log_return': np.float32(0.10316167), 'xtiusd_log_return': np.float32(0.09047068), 'synth_vix_zscore': np.float32(0.11876393)}
[2026-05-18 10:39:07,751 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:39:07,958 INFO] src.engine_xgb: XGB Train Acc: 0.5171 | Test Acc: 0.5169
[2026-05-18 10:39:07,958 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11565957), 'gmm_vol_cluster': np.float32(0.108811185), 'rsi_slope': np.float32(0.11516996), 'atr_normalized': np.float32(0.113523796), 'prev_log_return': np.float32(0.1279556), 'usdchf_log_return': np.float32(0.10381521), 'xagusd_log_return': np.float32(0.10804006), 'xtiusd_log_return': np.float32(0.10281798), 'synth_vix_zscore': np.float32(0.104206696)}
[2026-05-18 10:39:07,959 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:39:07,960 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:39:08,320 INFO] src.backtester: Backtest [M15]: Sharpe=-9.675 | MaxDD=1.114 | WR=0.342 | Return=-67.1% | Trades=1493
[2026-05-18 10:39:08,321 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:39:08,583 INFO] src.engine_xgb: XGB Train Acc: 0.5083 | Test Acc: 0.5430
[2026-05-18 10:39:08,584 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.113791764), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12481539), 'atr_normalized': np.float32(0.13792682), 'prev_log_return': np.float32(0.1691664), 'usdchf_log_return': np.float32(0.10871356), 'xagusd_log_return': np.float32(0.10393602), 'xtiusd_log_return': np.float32(0.11821295), 'synth_vix_zscore': np.float32(0.123437054)}
[2026-05-18 10:39:08,584 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:39:08,779 INFO] src.engine_xgb: XGB Train Acc: 0.5129 | Test Acc: 0.5423
[2026-05-18 10:39:08,779 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10314104), 'gmm_vol_cluster': np.float32(0.12804672), 'rsi_slope': np.float32(0.16312638), 'atr_normalized': np.float32(0.097455025), 'prev_log_return': np.float32(0.13377528), 'usdchf_log_return': np.float32(0.089011714), 'xagusd_log_return': np.float32(0.100771815), 'xtiusd_log_return': np.float32(0.09586192), 'synth_vix_zscore': np.float32(0.088810146)}
[2026-05-18 10:39:08,780 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:39:08,955 INFO] src.engine_xgb: XGB Train Acc: 0.5066 | Test Acc: 0.4994
[2026-05-18 10:39:08,956 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08419154), 'gmm_vol_cluster': np.float32(0.06733278), 'rsi_slope': np.float32(0.15913378), 'atr_normalized': np.float32(0.09124832), 'prev_log_return': np.float32(0.14847368), 'usdchf_log_return': np.float32(0.08182807), 'xagusd_log_return': np.float32(0.1141318), 'xtiusd_log_return': np.float32(0.07819525), 'synth_vix_zscore': np.float32(0.17546476)}
[2026-05-18 10:39:08,956 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:39:08,958 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:39:09,317 INFO] src.backtester: Backtest [M15]: Sharpe=-10.857 | MaxDD=1.083 | WR=0.315 | Return=-66.1% | Trades=1297
[2026-05-18 10:39:09,317 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:39:09,552 INFO] src.engine_xgb: XGB Train Acc: 0.5045 | Test Acc: 0.5131
[2026-05-18 10:39:09,552 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09394161), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15445092), 'atr_normalized': np.float32(0.08597417), 'prev_log_return': np.float32(0.17747048), 'usdchf_log_return': np.float32(0.114573404), 'xagusd_log_return': np.float32(0.17924565), 'xtiusd_log_return': np.float32(0.091957875), 'synth_vix_zscore': np.float32(0.102385886)}
[2026-05-18 10:39:09,553 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:39:09,760 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4869
[2026-05-18 10:39:09,760 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.081999056), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.21888353), 'atr_normalized': np.float32(0.103282616), 'prev_log_return': np.float32(0.15878904), 'usdchf_log_return': np.float32(0.0877616), 'xagusd_log_return': np.float32(0.15435947), 'xtiusd_log_return': np.float32(0.10715161), 'synth_vix_zscore': np.float32(0.08777305)}
[2026-05-18 10:39:09,761 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:39:10,012 INFO] src.engine_xgb: XGB Train Acc: 0.5053 | Test Acc: 0.4984
[2026-05-18 10:39:10,012 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11013932), 'gmm_vol_cluster': np.float32(0.06584065), 'rsi_slope': np.float32(0.16825785), 'atr_normalized': np.float32(0.09542463), 'prev_log_return': np.float32(0.12874673), 'usdchf_log_return': np.float32(0.0996669), 'xagusd_log_return': np.float32(0.11072719), 'xtiusd_log_return': np.float32(0.08659144), 'synth_vix_zscore': np.float32(0.13460532)}
[2026-05-18 10:39:10,013 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:39:10,014 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:39:10,373 INFO] src.backtester: Backtest [M15]: Sharpe=-10.087 | MaxDD=1.040 | WR=0.347 | Return=-64.6% | Trades=1292
[2026-05-18 10:39:10,373 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:39:10,665 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5433
[2026-05-18 10:39:10,666 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10050566), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.19159962), 'atr_normalized': np.float32(0.124153614), 'prev_log_return': np.float32(0.1699555), 'usdchf_log_return': np.float32(0.111217804), 'xagusd_log_return': np.float32(0.11157102), 'xtiusd_log_return': np.float32(0.09589248), 'synth_vix_zscore': np.float32(0.09510429)}
[2026-05-18 10:39:10,666 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:39:11,102 INFO] src.engine_xgb: XGB Train Acc: 0.5123 | Test Acc: 0.5348
[2026-05-18 10:39:11,102 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1056756), 'gmm_vol_cluster': np.float32(0.076161414), 'rsi_slope': np.float32(0.17913362), 'atr_normalized': np.float32(0.100803986), 'prev_log_return': np.float32(0.1377905), 'usdchf_log_return': np.float32(0.0958502), 'xagusd_log_return': np.float32(0.10111465), 'xtiusd_log_return': np.float32(0.097410105), 'synth_vix_zscore': np.float32(0.10605988)}
[2026-05-18 10:39:11,103 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:39:11,565 INFO] src.engine_xgb: XGB Train Acc: 0.5103 | Test Acc: 0.5252
[2026-05-18 10:39:11,566 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11374656), 'gmm_vol_cluster': np.float32(0.08233918), 'rsi_slope': np.float32(0.16705267), 'atr_normalized': np.float32(0.096691884), 'prev_log_return': np.float32(0.13254812), 'usdchf_log_return': np.float32(0.09134456), 'xagusd_log_return': np.float32(0.10418255), 'xtiusd_log_return': np.float32(0.0824544), 'synth_vix_zscore': np.float32(0.12964012)}
[2026-05-18 10:39:11,566 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:39:11,567 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:39:11,693 INFO] src.backtester: Backtest [M15]: Sharpe=-10.188 | MaxDD=0.246 | WR=0.388 | Return=-21.6% | Trades=330
[2026-05-18 10:39:11,694 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[ 20/70] Best Score: -0.500 | ETA: 1h 17m RAM: 66%
Best trial: 4. Best value: -0.5: 29%|█████████████████████▍ | 20/70 [31:02<1:03:18, 75.97s/it][2026-05-18 10:40:46,012 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:40:46,012 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:40:46,012 INFO] src.engine_hmm: Bull 0.9551 0.0115 0.0007 0.0328
[2026-05-18 10:40:46,013 INFO] src.engine_hmm: Bear 0.0305 0.9676 0.0004 0.0015
[2026-05-18 10:40:46,013 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0237
[2026-05-18 10:40:46,013 INFO] src.engine_hmm: Chop_High 0.0247 0.0016 0.0262 0.9475
[2026-05-18 10:40:46,013 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:40:46,014 INFO] src.engine_hmm: Bull: return=0.059159, vol=0.363428, rsi_slope=-0.000340
[2026-05-18 10:40:46,014 INFO] src.engine_hmm: Bear: return=-0.144339, vol=1.805674, rsi_slope=0.010411
[2026-05-18 10:40:46,014 INFO] src.engine_hmm: Chop_Low: return=-0.024985, vol=-0.671424, rsi_slope=0.000747
[2026-05-18 10:40:46,014 INFO] src.engine_hmm: Chop_High: return=0.029553, vol=-0.251886, rsi_slope=-0.004278
[2026-05-18 10:40:46,016 INFO] src.engine_hmm: Total regime transitions: 9557
[2026-05-18 10:40:46,017 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:40:46,017 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:15:00: Bull -> Chop_High
[2026-05-18 10:40:46,017 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:40:46,018 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:40:46,018 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:40:46,018 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:40:46,018 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:40:46,018 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:40:46,018 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:40:46,018 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:40:46,176 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:40:46,192 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:40:46,326 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:40:46,326 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.20222689), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.099924654), 'atr_normalized': np.float32(0.12279633), 'prev_log_return': np.float32(0.13801354), 'usdchf_log_return': np.float32(0.09349441), 'xagusd_log_return': np.float32(0.09183791), 'xtiusd_log_return': np.float32(0.1039005), 'synth_vix_zscore': np.float32(0.14780568)}
[2026-05-18 10:40:46,327 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:40:46,540 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.5171
[2026-05-18 10:40:46,540 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10165162), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.18820488), 'atr_normalized': np.float32(0.11086234), 'prev_log_return': np.float32(0.12342232), 'usdchf_log_return': np.float32(0.116666645), 'xagusd_log_return': np.float32(0.11450565), 'xtiusd_log_return': np.float32(0.11409553), 'synth_vix_zscore': np.float32(0.13059095)}
[2026-05-18 10:40:46,541 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:40:47,018 INFO] src.engine_xgb: XGB Train Acc: 0.4960 | Test Acc: 0.4883
[2026-05-18 10:40:47,019 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10716058), 'gmm_vol_cluster': np.float32(0.09858652), 'rsi_slope': np.float32(0.11751191), 'atr_normalized': np.float32(0.110892095), 'prev_log_return': np.float32(0.13294262), 'usdchf_log_return': np.float32(0.109837525), 'xagusd_log_return': np.float32(0.10979019), 'xtiusd_log_return': np.float32(0.108874485), 'synth_vix_zscore': np.float32(0.10440414)}
[2026-05-18 10:40:47,019 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:40:47,020 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:40:47,464 INFO] src.backtester: Backtest [M15]: Sharpe=-4.413 | MaxDD=0.691 | WR=0.341 | Return=-49.9% | Trades=942
[2026-05-18 10:40:47,464 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:40:47,828 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 10:40:47,829 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13336712), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1252172), 'atr_normalized': np.float32(0.122821055), 'prev_log_return': np.float32(0.14108233), 'usdchf_log_return': np.float32(0.119952984), 'xagusd_log_return': np.float32(0.109598085), 'xtiusd_log_return': np.float32(0.12351355), 'synth_vix_zscore': np.float32(0.12444775)}
[2026-05-18 10:40:47,829 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:40:48,673 INFO] src.engine_xgb: XGB Train Acc: 0.4911 | Test Acc: 0.4588
[2026-05-18 10:40:48,673 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10315242), 'gmm_vol_cluster': np.float32(0.11729435), 'rsi_slope': np.float32(0.1438386), 'atr_normalized': np.float32(0.09951896), 'prev_log_return': np.float32(0.123721056), 'usdchf_log_return': np.float32(0.099003926), 'xagusd_log_return': np.float32(0.10426344), 'xtiusd_log_return': np.float32(0.10223391), 'synth_vix_zscore': np.float32(0.10697334)}
[2026-05-18 10:40:48,674 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:40:49,037 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 10:40:49,038 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.07860256), 'gmm_vol_cluster': np.float32(0.08532382), 'rsi_slope': np.float32(0.1460332), 'atr_normalized': np.float32(0.10553719), 'prev_log_return': np.float32(0.1449963), 'usdchf_log_return': np.float32(0.09491479), 'xagusd_log_return': np.float32(0.11166601), 'xtiusd_log_return': np.float32(0.099648245), 'synth_vix_zscore': np.float32(0.13327788)}
[2026-05-18 10:40:49,038 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:40:49,040 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:40:49,485 INFO] src.backtester: Backtest [M15]: Sharpe=-6.381 | MaxDD=0.728 | WR=0.306 | Return=-51.7% | Trades=837
[2026-05-18 10:40:49,486 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:40:49,776 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 10:40:49,777 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12536618), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15539564), 'atr_normalized': np.float32(0.11090276), 'prev_log_return': np.float32(0.15179875), 'usdchf_log_return': np.float32(0.10955467), 'xagusd_log_return': np.float32(0.14144485), 'xtiusd_log_return': np.float32(0.088204555), 'synth_vix_zscore': np.float32(0.11733258)}
[2026-05-18 10:40:49,777 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:40:50,312 INFO] src.engine_xgb: XGB Train Acc: 0.4911 | Test Acc: 0.5129
[2026-05-18 10:40:50,313 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08517782), 'gmm_vol_cluster': np.float32(0.075751446), 'rsi_slope': np.float32(0.1603035), 'atr_normalized': np.float32(0.11574777), 'prev_log_return': np.float32(0.13452925), 'usdchf_log_return': np.float32(0.098004654), 'xagusd_log_return': np.float32(0.12435913), 'xtiusd_log_return': np.float32(0.10511638), 'synth_vix_zscore': np.float32(0.10101003)}
[2026-05-18 10:40:50,313 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:40:51,243 INFO] src.engine_xgb: XGB Train Acc: 0.4947 | Test Acc: 0.5016
[2026-05-18 10:40:51,244 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1334948), 'gmm_vol_cluster': np.float32(0.09415825), 'rsi_slope': np.float32(0.12646171), 'atr_normalized': np.float32(0.099743076), 'prev_log_return': np.float32(0.12136013), 'usdchf_log_return': np.float32(0.100118086), 'xagusd_log_return': np.float32(0.102722235), 'xtiusd_log_return': np.float32(0.0972657), 'synth_vix_zscore': np.float32(0.12467601)}
[2026-05-18 10:40:51,244 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:40:51,246 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:40:51,713 INFO] src.backtester: Backtest [M15]: Sharpe=-6.722 | MaxDD=0.888 | WR=0.311 | Return=-58.8% | Trades=1012
[2026-05-18 10:40:51,713 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:40:52,026 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:40:52,026 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12965406), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15751727), 'atr_normalized': np.float32(0.11931897), 'prev_log_return': np.float32(0.15371595), 'usdchf_log_return': np.float32(0.11736914), 'xagusd_log_return': np.float32(0.11247627), 'xtiusd_log_return': np.float32(0.09186191), 'synth_vix_zscore': np.float32(0.11808649)}
[2026-05-18 10:40:52,028 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:40:52,782 INFO] src.engine_xgb: XGB Train Acc: 0.4877 | Test Acc: 0.4652
[2026-05-18 10:40:52,782 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10673564), 'gmm_vol_cluster': np.float32(0.10641537), 'rsi_slope': np.float32(0.16277681), 'atr_normalized': np.float32(0.09863555), 'prev_log_return': np.float32(0.12511058), 'usdchf_log_return': np.float32(0.097571105), 'xagusd_log_return': np.float32(0.099873856), 'xtiusd_log_return': np.float32(0.09844931), 'synth_vix_zscore': np.float32(0.10443173)}
[2026-05-18 10:40:52,783 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:40:53,681 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 10:40:53,681 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15677743), 'gmm_vol_cluster': np.float32(0.08833618), 'rsi_slope': np.float32(0.14162935), 'atr_normalized': np.float32(0.09777351), 'prev_log_return': np.float32(0.11160076), 'usdchf_log_return': np.float32(0.09695913), 'xagusd_log_return': np.float32(0.09481397), 'xtiusd_log_return': np.float32(0.09120796), 'synth_vix_zscore': np.float32(0.120901786)}
[2026-05-18 10:40:53,683 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:40:53,685 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:40:53,835 INFO] src.backtester: Backtest [M15]: Sharpe=-5.254 | MaxDD=0.425 | WR=0.385 | Return=-30.4% | Trades=577
[2026-05-18 10:40:53,835 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 30%|██████████████████████▌ | 21/70 [32:46<1:08:46, 84.22s/it][2026-05-18 10:42:23,998 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:42:23,998 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:42:23,998 INFO] src.engine_hmm: Bull 0.9557 0.0109 0.0006 0.0328
[2026-05-18 10:42:23,998 INFO] src.engine_hmm: Bear 0.0320 0.9665 0.0003 0.0012
[2026-05-18 10:42:23,998 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0236
[2026-05-18 10:42:23,998 INFO] src.engine_hmm: Chop_High 0.0242 0.0016 0.0260 0.9482
[2026-05-18 10:42:23,998 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:42:23,998 INFO] src.engine_hmm: Bull: return=0.052404, vol=0.383183, rsi_slope=0.000826
[2026-05-18 10:42:23,998 INFO] src.engine_hmm: Bear: return=-0.152678, vol=1.882434, rsi_slope=0.009302
[2026-05-18 10:42:23,999 INFO] src.engine_hmm: Chop_Low: return=-0.019605, vol=-0.670213, rsi_slope=0.000257
[2026-05-18 10:42:23,999 INFO] src.engine_hmm: Chop_High: return=0.028626, vol=-0.246095, rsi_slope=-0.004055
[2026-05-18 10:42:24,001 INFO] src.engine_hmm: Total regime transitions: 9494
[2026-05-18 10:42:24,001 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:42:24,001 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:42:24,001 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:42:24,001 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:42:24,003 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:42:24,003 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:42:24,003 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:42:24,003 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:42:24,004 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:42:24,004 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:42:24,157 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:42:24,176 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:42:24,308 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:42:24,308 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.22964111), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.100744866), 'atr_normalized': np.float32(0.118049614), 'prev_log_return': np.float32(0.12135674), 'usdchf_log_return': np.float32(0.11260973), 'xagusd_log_return': np.float32(0.107690684), 'xtiusd_log_return': np.float32(0.09542236), 'synth_vix_zscore': np.float32(0.114484884)}
[2026-05-18 10:42:24,309 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:42:24,435 INFO] src.engine_xgb: XGB Train Acc: 0.5020 | Test Acc: 0.5160
[2026-05-18 10:42:24,436 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.120980844), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1588091), 'atr_normalized': np.float32(0.11214025), 'prev_log_return': np.float32(0.113077566), 'usdchf_log_return': np.float32(0.117199324), 'xagusd_log_return': np.float32(0.11480232), 'xtiusd_log_return': np.float32(0.12904717), 'synth_vix_zscore': np.float32(0.1339434)}
[2026-05-18 10:42:24,436 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:42:24,650 INFO] src.engine_xgb: XGB Train Acc: 0.5332 | Test Acc: 0.5016
[2026-05-18 10:42:24,651 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.098830454), 'gmm_vol_cluster': np.float32(0.11077115), 'rsi_slope': np.float32(0.11581988), 'atr_normalized': np.float32(0.11431878), 'prev_log_return': np.float32(0.1143668), 'usdchf_log_return': np.float32(0.10566898), 'xagusd_log_return': np.float32(0.109805115), 'xtiusd_log_return': np.float32(0.115426734), 'synth_vix_zscore': np.float32(0.11499219)}
[2026-05-18 10:42:24,652 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:42:24,653 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:42:25,008 INFO] src.backtester: Backtest [M15]: Sharpe=-3.732 | MaxDD=0.536 | WR=0.356 | Return=-41.4% | Trades=750
[2026-05-18 10:42:25,009 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:42:25,233 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 10:42:25,233 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1089235), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13561401), 'atr_normalized': np.float32(0.1254896), 'prev_log_return': np.float32(0.14739561), 'usdchf_log_return': np.float32(0.12614007), 'xagusd_log_return': np.float32(0.10992734), 'xtiusd_log_return': np.float32(0.12395226), 'synth_vix_zscore': np.float32(0.12255765)}
[2026-05-18 10:42:25,234 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:42:25,416 INFO] src.engine_xgb: XGB Train Acc: 0.4901 | Test Acc: 0.4585
[2026-05-18 10:42:25,417 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.099213384), 'gmm_vol_cluster': np.float32(0.09924998), 'rsi_slope': np.float32(0.13482109), 'atr_normalized': np.float32(0.104009196), 'prev_log_return': np.float32(0.12339278), 'usdchf_log_return': np.float32(0.10097686), 'xagusd_log_return': np.float32(0.114047974), 'xtiusd_log_return': np.float32(0.10150439), 'synth_vix_zscore': np.float32(0.12278437)}
[2026-05-18 10:42:25,417 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:42:25,576 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 10:42:25,576 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.067019686), 'gmm_vol_cluster': np.float32(0.08505872), 'rsi_slope': np.float32(0.15109354), 'atr_normalized': np.float32(0.09979906), 'prev_log_return': np.float32(0.13415281), 'usdchf_log_return': np.float32(0.10294849), 'xagusd_log_return': np.float32(0.12818742), 'xtiusd_log_return': np.float32(0.11039599), 'synth_vix_zscore': np.float32(0.12134437)}
[2026-05-18 10:42:25,577 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:42:25,578 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:42:25,889 INFO] src.backtester: Backtest [M15]: Sharpe=-1.369 | MaxDD=0.011 | WR=0.333 | Return=-1.0% | Trades=6
[2026-05-18 10:42:25,890 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:42:26,149 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 10:42:26,150 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12185815), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14115682), 'atr_normalized': np.float32(0.11906993), 'prev_log_return': np.float32(0.13807938), 'usdchf_log_return': np.float32(0.12203878), 'xagusd_log_return': np.float32(0.12794559), 'xtiusd_log_return': np.float32(0.115101375), 'synth_vix_zscore': np.float32(0.11475006)}
[2026-05-18 10:42:26,150 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:42:26,358 INFO] src.engine_xgb: XGB Train Acc: 0.4921 | Test Acc: 0.5132
[2026-05-18 10:42:26,359 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1089503), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14874099), 'atr_normalized': np.float32(0.116245314), 'prev_log_return': np.float32(0.15156505), 'usdchf_log_return': np.float32(0.10746087), 'xagusd_log_return': np.float32(0.1281708), 'xtiusd_log_return': np.float32(0.12353861), 'synth_vix_zscore': np.float32(0.11532808)}
[2026-05-18 10:42:26,359 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:42:26,692 INFO] src.engine_xgb: XGB Train Acc: 0.4988 | Test Acc: 0.5006
[2026-05-18 10:42:26,693 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11616307), 'gmm_vol_cluster': np.float32(0.0907565), 'rsi_slope': np.float32(0.12397363), 'atr_normalized': np.float32(0.1018932), 'prev_log_return': np.float32(0.11814218), 'usdchf_log_return': np.float32(0.10946477), 'xagusd_log_return': np.float32(0.110796906), 'xtiusd_log_return': np.float32(0.10347725), 'synth_vix_zscore': np.float32(0.12533255)}
[2026-05-18 10:42:26,693 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:42:26,695 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:42:27,058 INFO] src.backtester: Backtest [M15]: Sharpe=-4.892 | MaxDD=0.473 | WR=0.289 | Return=-37.3% | Trades=498
[2026-05-18 10:42:27,058 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:42:27,360 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:42:27,360 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12881932), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14630476), 'atr_normalized': np.float32(0.11963152), 'prev_log_return': np.float32(0.14215375), 'usdchf_log_return': np.float32(0.13563322), 'xagusd_log_return': np.float32(0.10263634), 'xtiusd_log_return': np.float32(0.1092351), 'synth_vix_zscore': np.float32(0.11558595)}
[2026-05-18 10:42:27,361 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:42:27,769 INFO] src.engine_xgb: XGB Train Acc: 0.4986 | Test Acc: 0.4696
[2026-05-18 10:42:27,769 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10036879), 'gmm_vol_cluster': np.float32(0.112847865), 'rsi_slope': np.float32(0.13760486), 'atr_normalized': np.float32(0.10419329), 'prev_log_return': np.float32(0.118152894), 'usdchf_log_return': np.float32(0.102579616), 'xagusd_log_return': np.float32(0.10201132), 'xtiusd_log_return': np.float32(0.10763943), 'synth_vix_zscore': np.float32(0.11460193)}
[2026-05-18 10:42:27,770 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:42:28,077 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 10:42:28,078 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11004347), 'gmm_vol_cluster': np.float32(0.10421878), 'rsi_slope': np.float32(0.13357022), 'atr_normalized': np.float32(0.10736535), 'prev_log_return': np.float32(0.11020483), 'usdchf_log_return': np.float32(0.10753865), 'xagusd_log_return': np.float32(0.09892405), 'xtiusd_log_return': np.float32(0.10009293), 'synth_vix_zscore': np.float32(0.12804171)}
[2026-05-18 10:42:28,078 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:42:28,080 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:42:28,183 INFO] src.backtester: Backtest [M15]: Sharpe=-1.760 | MaxDD=0.086 | WR=0.361 | Return=-5.7% | Trades=97
[2026-05-18 10:42:28,183 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 31%|███████████████████████▌ | 22/70 [34:19<1:09:29, 86.87s/it][2026-05-18 10:43:44,434 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:43:44,435 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:43:44,435 INFO] src.engine_hmm: Bull 0.9557 0.0109 0.0006 0.0328
[2026-05-18 10:43:44,435 INFO] src.engine_hmm: Bear 0.0323 0.9663 0.0003 0.0011
[2026-05-18 10:43:44,435 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9743 0.0237
[2026-05-18 10:43:44,436 INFO] src.engine_hmm: Chop_High 0.0241 0.0017 0.0260 0.9482
[2026-05-18 10:43:44,436 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:43:44,436 INFO] src.engine_hmm: Bull: return=0.053584, vol=0.382873, rsi_slope=0.001079
[2026-05-18 10:43:44,436 INFO] src.engine_hmm: Bear: return=-0.154979, vol=1.889953, rsi_slope=0.008846
[2026-05-18 10:43:44,436 INFO] src.engine_hmm: Chop_Low: return=-0.019087, vol=-0.670748, rsi_slope=0.000131
[2026-05-18 10:43:44,436 INFO] src.engine_hmm: Chop_High: return=0.027493, vol=-0.246910, rsi_slope=-0.003958
[2026-05-18 10:43:44,438 INFO] src.engine_hmm: Total regime transitions: 9512
[2026-05-18 10:43:44,438 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:43:44,439 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:43:44,439 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:43:44,439 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:43:44,439 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:43:44,440 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:43:44,440 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:43:44,440 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:43:44,441 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:43:44,441 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:43:44,603 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:43:44,622 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:43:44,771 INFO] src.engine_xgb: XGB Train Acc: 0.5049 | Test Acc: 0.5261
[2026-05-18 10:43:44,772 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.21830675), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.10410087), 'atr_normalized': np.float32(0.1134508), 'prev_log_return': np.float32(0.11834382), 'usdchf_log_return': np.float32(0.10480161), 'xagusd_log_return': np.float32(0.097257845), 'xtiusd_log_return': np.float32(0.115787), 'synth_vix_zscore': np.float32(0.12795125)}
[2026-05-18 10:43:44,772 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:43:44,896 INFO] src.engine_xgb: XGB Train Acc: 0.4984 | Test Acc: 0.5185
[2026-05-18 10:43:44,896 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12719633), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15439798), 'atr_normalized': np.float32(0.10858596), 'prev_log_return': np.float32(0.121543445), 'usdchf_log_return': np.float32(0.1230224), 'xagusd_log_return': np.float32(0.12102102), 'xtiusd_log_return': np.float32(0.12037432), 'synth_vix_zscore': np.float32(0.12385857)}
[2026-05-18 10:43:44,897 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:43:45,051 INFO] src.engine_xgb: XGB Train Acc: 0.5058 | Test Acc: 0.4883
[2026-05-18 10:43:45,052 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10603134), 'gmm_vol_cluster': np.float32(0.122645564), 'rsi_slope': np.float32(0.11400086), 'atr_normalized': np.float32(0.11025468), 'prev_log_return': np.float32(0.11268897), 'usdchf_log_return': np.float32(0.10319209), 'xagusd_log_return': np.float32(0.10951152), 'xtiusd_log_return': np.float32(0.11785617), 'synth_vix_zscore': np.float32(0.103818834)}
[2026-05-18 10:43:45,053 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:43:45,054 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:43:45,422 INFO] src.backtester: Backtest [M15]: Sharpe=-4.039 | MaxDD=0.646 | WR=0.353 | Return=-47.4% | Trades=956
[2026-05-18 10:43:45,423 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:43:45,642 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 10:43:45,643 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13505222), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12568697), 'atr_normalized': np.float32(0.13412677), 'prev_log_return': np.float32(0.12901042), 'usdchf_log_return': np.float32(0.11581486), 'xagusd_log_return': np.float32(0.118838444), 'xtiusd_log_return': np.float32(0.12312704), 'synth_vix_zscore': np.float32(0.11834326)}
[2026-05-18 10:43:45,643 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:43:46,045 INFO] src.engine_xgb: XGB Train Acc: 0.5362 | Test Acc: 0.4793
[2026-05-18 10:43:46,045 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.102188215), 'gmm_vol_cluster': np.float32(0.13210364), 'rsi_slope': np.float32(0.11636009), 'atr_normalized': np.float32(0.104968935), 'prev_log_return': np.float32(0.10900907), 'usdchf_log_return': np.float32(0.10762018), 'xagusd_log_return': np.float32(0.109293364), 'xtiusd_log_return': np.float32(0.10783156), 'synth_vix_zscore': np.float32(0.110624894)}
[2026-05-18 10:43:46,046 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:43:46,206 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 10:43:46,206 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.076248124), 'gmm_vol_cluster': np.float32(0.09845614), 'rsi_slope': np.float32(0.12698433), 'atr_normalized': np.float32(0.1017107), 'prev_log_return': np.float32(0.1380905), 'usdchf_log_return': np.float32(0.10021043), 'xagusd_log_return': np.float32(0.11631034), 'xtiusd_log_return': np.float32(0.11321542), 'synth_vix_zscore': np.float32(0.128774)}
[2026-05-18 10:43:46,207 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:43:46,208 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:43:46,616 INFO] src.backtester: Backtest [M15]: Sharpe=-5.760 | MaxDD=0.694 | WR=0.341 | Return=-49.9% | Trades=965
[2026-05-18 10:43:46,616 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:43:46,885 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 10:43:46,885 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11008353), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14018223), 'atr_normalized': np.float32(0.12440125), 'prev_log_return': np.float32(0.1366732), 'usdchf_log_return': np.float32(0.11517857), 'xagusd_log_return': np.float32(0.12717542), 'xtiusd_log_return': np.float32(0.12476137), 'synth_vix_zscore': np.float32(0.12154435)}
[2026-05-18 10:43:46,886 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:43:47,099 INFO] src.engine_xgb: XGB Train Acc: 0.4910 | Test Acc: 0.5131
[2026-05-18 10:43:47,100 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09317307), 'gmm_vol_cluster': np.float32(0.12120582), 'rsi_slope': np.float32(0.12728833), 'atr_normalized': np.float32(0.10357543), 'prev_log_return': np.float32(0.1260908), 'usdchf_log_return': np.float32(0.0996231), 'xagusd_log_return': np.float32(0.11782293), 'xtiusd_log_return': np.float32(0.10334419), 'synth_vix_zscore': np.float32(0.10787636)}
[2026-05-18 10:43:47,100 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:43:47,419 INFO] src.engine_xgb: XGB Train Acc: 0.4996 | Test Acc: 0.5023
[2026-05-18 10:43:47,419 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10238526), 'gmm_vol_cluster': np.float32(0.1046574), 'rsi_slope': np.float32(0.11703656), 'atr_normalized': np.float32(0.10594079), 'prev_log_return': np.float32(0.120975055), 'usdchf_log_return': np.float32(0.110273376), 'xagusd_log_return': np.float32(0.10725183), 'xtiusd_log_return': np.float32(0.10931778), 'synth_vix_zscore': np.float32(0.12216196)}
[2026-05-18 10:43:47,420 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:43:47,421 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:43:47,801 INFO] src.backtester: Backtest [M15]: Sharpe=-6.220 | MaxDD=0.822 | WR=0.321 | Return=-55.9% | Trades=951
[2026-05-18 10:43:47,802 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:43:48,090 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:43:48,090 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14510466), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13372499), 'atr_normalized': np.float32(0.11917948), 'prev_log_return': np.float32(0.14666973), 'usdchf_log_return': np.float32(0.12291075), 'xagusd_log_return': np.float32(0.107368685), 'xtiusd_log_return': np.float32(0.114637084), 'synth_vix_zscore': np.float32(0.11040462)}
[2026-05-18 10:43:48,091 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:43:48,432 INFO] src.engine_xgb: XGB Train Acc: 0.4878 | Test Acc: 0.4652
[2026-05-18 10:43:48,433 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.107524656), 'gmm_vol_cluster': np.float32(0.11696114), 'rsi_slope': np.float32(0.11856215), 'atr_normalized': np.float32(0.108283214), 'prev_log_return': np.float32(0.11506907), 'usdchf_log_return': np.float32(0.100932814), 'xagusd_log_return': np.float32(0.10774275), 'xtiusd_log_return': np.float32(0.114483625), 'synth_vix_zscore': np.float32(0.11044068)}
[2026-05-18 10:43:48,433 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:43:48,810 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 10:43:48,812 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10189858), 'gmm_vol_cluster': np.float32(0.110810496), 'rsi_slope': np.float32(0.12852517), 'atr_normalized': np.float32(0.10678715), 'prev_log_return': np.float32(0.11529334), 'usdchf_log_return': np.float32(0.111109406), 'xagusd_log_return': np.float32(0.102207206), 'xtiusd_log_return': np.float32(0.10457073), 'synth_vix_zscore': np.float32(0.118797965)}
[2026-05-18 10:43:48,812 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:43:48,813 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:43:48,949 INFO] src.backtester: Backtest [M15]: Sharpe=-4.859 | MaxDD=0.386 | WR=0.380 | Return=-28.8% | Trades=579
[2026-05-18 10:43:48,949 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 33%|████████████████████████▋ | 23/70 [35:40<1:06:36, 85.04s/it][2026-05-18 10:44:42,309 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:44:42,310 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:44:42,310 INFO] src.engine_hmm: Bull 0.9559 0.0106 0.0006 0.0329
[2026-05-18 10:44:42,310 INFO] src.engine_hmm: Bear 0.0343 0.9648 0.0003 0.0006
[2026-05-18 10:44:42,310 INFO] src.engine_hmm: Chop_Low 0.0013 0.0007 0.9740 0.0241
[2026-05-18 10:44:42,310 INFO] src.engine_hmm: Chop_High 0.0239 0.0018 0.0259 0.9485
[2026-05-18 10:44:42,311 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:44:42,311 INFO] src.engine_hmm: Bull: return=0.055034, vol=0.389375, rsi_slope=0.001915
[2026-05-18 10:44:42,311 INFO] src.engine_hmm: Bear: return=-0.161689, vol=1.952840, rsi_slope=0.007587
[2026-05-18 10:44:42,311 INFO] src.engine_hmm: Chop_Low: return=-0.015639, vol=-0.672081, rsi_slope=-0.000401
[2026-05-18 10:44:42,311 INFO] src.engine_hmm: Chop_High: return=0.021991, vol=-0.247480, rsi_slope=-0.003539
[2026-05-18 10:44:42,313 INFO] src.engine_hmm: Total regime transitions: 9560
[2026-05-18 10:44:42,314 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:44:42,314 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:44:42,314 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:44:42,315 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:44:42,315 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:44:42,315 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:44:42,315 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:44:42,316 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:44:42,316 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:44:42,316 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:44:42,486 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:44:42,506 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:44:42,626 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:44:42,627 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.25715086), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.106453635), 'atr_normalized': np.float32(0.108774915), 'prev_log_return': np.float32(0.11988258), 'usdchf_log_return': np.float32(0.102927126), 'xagusd_log_return': np.float32(0.09046087), 'xtiusd_log_return': np.float32(0.10178685), 'synth_vix_zscore': np.float32(0.1125631)}
[2026-05-18 10:44:42,627 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:44:42,778 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.5171
[2026-05-18 10:44:42,779 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.113157876), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16247162), 'atr_normalized': np.float32(0.11171019), 'prev_log_return': np.float32(0.119045235), 'usdchf_log_return': np.float32(0.1290021), 'xagusd_log_return': np.float32(0.11791873), 'xtiusd_log_return': np.float32(0.12670994), 'synth_vix_zscore': np.float32(0.11998425)}
[2026-05-18 10:44:42,779 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:44:42,987 INFO] src.engine_xgb: XGB Train Acc: 0.4948 | Test Acc: 0.4897
[2026-05-18 10:44:42,988 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09294666), 'gmm_vol_cluster': np.float32(0.12986912), 'rsi_slope': np.float32(0.116757065), 'atr_normalized': np.float32(0.10996732), 'prev_log_return': np.float32(0.116952635), 'usdchf_log_return': np.float32(0.10760933), 'xagusd_log_return': np.float32(0.108505026), 'xtiusd_log_return': np.float32(0.110532254), 'synth_vix_zscore': np.float32(0.10686054)}
[2026-05-18 10:44:42,988 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:44:42,989 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:44:43,405 INFO] src.backtester: Backtest [M15]: Sharpe=-4.728 | MaxDD=0.812 | WR=0.362 | Return=-55.4% | Trades=1022
[2026-05-18 10:44:43,405 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:44:43,626 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 10:44:43,626 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16472912), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13696654), 'atr_normalized': np.float32(0.12482617), 'prev_log_return': np.float32(0.12005776), 'usdchf_log_return': np.float32(0.10773316), 'xagusd_log_return': np.float32(0.11064713), 'xtiusd_log_return': np.float32(0.11531533), 'synth_vix_zscore': np.float32(0.11972482)}
[2026-05-18 10:44:43,627 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:44:43,840 INFO] src.engine_xgb: XGB Train Acc: 0.4871 | Test Acc: 0.4577
[2026-05-18 10:44:43,841 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.112803526), 'gmm_vol_cluster': np.float32(0.14966233), 'rsi_slope': np.float32(0.12619187), 'atr_normalized': np.float32(0.09428368), 'prev_log_return': np.float32(0.115982026), 'usdchf_log_return': np.float32(0.099444665), 'xagusd_log_return': np.float32(0.09755538), 'xtiusd_log_return': np.float32(0.10250829), 'synth_vix_zscore': np.float32(0.10156825)}
[2026-05-18 10:44:43,841 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:44:43,993 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 10:44:43,994 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09369839), 'gmm_vol_cluster': np.float32(0.111184366), 'rsi_slope': np.float32(0.1257405), 'atr_normalized': np.float32(0.09875985), 'prev_log_return': np.float32(0.13078889), 'usdchf_log_return': np.float32(0.10373705), 'xagusd_log_return': np.float32(0.108513124), 'xtiusd_log_return': np.float32(0.09871692), 'synth_vix_zscore': np.float32(0.12886097)}
[2026-05-18 10:44:43,994 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:44:43,996 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:44:44,432 INFO] src.backtester: Backtest [M15]: Sharpe=-5.407 | MaxDD=0.646 | WR=0.345 | Return=-47.5% | Trades=882
[2026-05-18 10:44:44,433 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:44:44,678 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 10:44:44,678 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09797692), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13465016), 'atr_normalized': np.float32(0.12869252), 'prev_log_return': np.float32(0.15779603), 'usdchf_log_return': np.float32(0.12573577), 'xagusd_log_return': np.float32(0.11714202), 'xtiusd_log_return': np.float32(0.1163417), 'synth_vix_zscore': np.float32(0.1216649)}
[2026-05-18 10:44:44,679 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:44:45,097 INFO] src.engine_xgb: XGB Train Acc: 0.4911 | Test Acc: 0.5131
[2026-05-18 10:44:45,098 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10800025), 'gmm_vol_cluster': np.float32(0.105002485), 'rsi_slope': np.float32(0.120548986), 'atr_normalized': np.float32(0.10585631), 'prev_log_return': np.float32(0.123947926), 'usdchf_log_return': np.float32(0.10454395), 'xagusd_log_return': np.float32(0.11170561), 'xtiusd_log_return': np.float32(0.11037797), 'synth_vix_zscore': np.float32(0.11001649)}
[2026-05-18 10:44:45,098 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:44:45,379 INFO] src.engine_xgb: XGB Train Acc: 0.4947 | Test Acc: 0.5016
[2026-05-18 10:44:45,379 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12337682), 'gmm_vol_cluster': np.float32(0.08638267), 'rsi_slope': np.float32(0.1225136), 'atr_normalized': np.float32(0.107776694), 'prev_log_return': np.float32(0.1263012), 'usdchf_log_return': np.float32(0.09749741), 'xagusd_log_return': np.float32(0.105735816), 'xtiusd_log_return': np.float32(0.10633887), 'synth_vix_zscore': np.float32(0.12407692)}
[2026-05-18 10:44:45,380 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:44:45,381 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:44:45,782 INFO] src.backtester: Backtest [M15]: Sharpe=-5.879 | MaxDD=0.835 | WR=0.340 | Return=-56.6% | Trades=1022
[2026-05-18 10:44:45,783 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:44:46,051 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:44:46,051 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.116652094), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14827228), 'atr_normalized': np.float32(0.12690492), 'prev_log_return': np.float32(0.13680887), 'usdchf_log_return': np.float32(0.1297862), 'xagusd_log_return': np.float32(0.118687324), 'xtiusd_log_return': np.float32(0.11005629), 'synth_vix_zscore': np.float32(0.11283207)}
[2026-05-18 10:44:46,052 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:44:46,322 INFO] src.engine_xgb: XGB Train Acc: 0.4877 | Test Acc: 0.4652
[2026-05-18 10:44:46,322 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10934887), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15531227), 'atr_normalized': np.float32(0.12240779), 'prev_log_return': np.float32(0.14000352), 'usdchf_log_return': np.float32(0.10962807), 'xagusd_log_return': np.float32(0.118332416), 'xtiusd_log_return': np.float32(0.11081531), 'synth_vix_zscore': np.float32(0.13415177)}
[2026-05-18 10:44:46,323 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:44:46,646 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 10:44:46,647 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11747858), 'gmm_vol_cluster': np.float32(0.1149344), 'rsi_slope': np.float32(0.1267534), 'atr_normalized': np.float32(0.10831991), 'prev_log_return': np.float32(0.11036388), 'usdchf_log_return': np.float32(0.1064981), 'xagusd_log_return': np.float32(0.09661304), 'xtiusd_log_return': np.float32(0.09452567), 'synth_vix_zscore': np.float32(0.12451307)}
[2026-05-18 10:44:46,648 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:44:46,649 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:44:46,792 INFO] src.backtester: Backtest [M15]: Sharpe=-5.308 | MaxDD=0.423 | WR=0.397 | Return=-33.6% | Trades=633
[2026-05-18 10:44:46,792 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 34%|██████████████████████████▍ | 24/70 [36:37<58:57, 76.89s/it][2026-05-18 10:46:19,030 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:46:19,031 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:46:19,031 INFO] src.engine_hmm: Bull 0.9554 0.0115 0.0006 0.0325
[2026-05-18 10:46:19,031 INFO] src.engine_hmm: Bear 0.0300 0.9681 0.0004 0.0015
[2026-05-18 10:46:19,032 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9741 0.0240
[2026-05-18 10:46:19,032 INFO] src.engine_hmm: Chop_High 0.0248 0.0016 0.0260 0.9476
[2026-05-18 10:46:19,032 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:46:19,032 INFO] src.engine_hmm: Bull: return=0.091366, vol=0.349992, rsi_slope=-0.001481
[2026-05-18 10:46:19,032 INFO] src.engine_hmm: Bear: return=-0.131563, vol=1.773322, rsi_slope=0.010845
[2026-05-18 10:46:19,032 INFO] src.engine_hmm: Chop_Low: return=-0.047259, vol=-0.674304, rsi_slope=0.001623
[2026-05-18 10:46:19,033 INFO] src.engine_hmm: Chop_High: return=0.021126, vol=-0.259720, rsi_slope=-0.004467
[2026-05-18 10:46:19,035 INFO] src.engine_hmm: Total regime transitions: 9527
[2026-05-18 10:46:19,035 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:46:19,035 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 23:15:00: Bull -> Chop_High
[2026-05-18 10:46:19,035 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:46:19,035 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:46:19,035 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:46:19,036 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:46:19,036 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:46:19,036 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:46:19,036 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:46:19,036 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:30:00: Chop_High -> Bull
[2026-05-18 10:46:19,199 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:46:19,218 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:46:19,337 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:46:19,337 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.20043665), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.10000599), 'atr_normalized': np.float32(0.12107377), 'prev_log_return': np.float32(0.12446831), 'usdchf_log_return': np.float32(0.11805554), 'xagusd_log_return': np.float32(0.10805471), 'xtiusd_log_return': np.float32(0.107139684), 'synth_vix_zscore': np.float32(0.12076537)}
[2026-05-18 10:46:19,338 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:46:19,492 INFO] src.engine_xgb: XGB Train Acc: 0.5056 | Test Acc: 0.5196
[2026-05-18 10:46:19,493 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.108212754), 'gmm_vol_cluster': np.float32(0.069430776), 'rsi_slope': np.float32(0.15000834), 'atr_normalized': np.float32(0.10717831), 'prev_log_return': np.float32(0.11608657), 'usdchf_log_return': np.float32(0.11371737), 'xagusd_log_return': np.float32(0.10964498), 'xtiusd_log_return': np.float32(0.110811174), 'synth_vix_zscore': np.float32(0.11490976)}
[2026-05-18 10:46:19,493 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:46:19,757 INFO] src.engine_xgb: XGB Train Acc: 0.5109 | Test Acc: 0.4883
[2026-05-18 10:46:19,757 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11377002), 'gmm_vol_cluster': np.float32(0.1078756), 'rsi_slope': np.float32(0.1141894), 'atr_normalized': np.float32(0.11234006), 'prev_log_return': np.float32(0.11722504), 'usdchf_log_return': np.float32(0.10432213), 'xagusd_log_return': np.float32(0.1085266), 'xtiusd_log_return': np.float32(0.11419029), 'synth_vix_zscore': np.float32(0.107560895)}
[2026-05-18 10:46:19,758 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:46:19,759 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:46:20,132 INFO] src.backtester: Backtest [M15]: Sharpe=-3.434 | MaxDD=0.484 | WR=0.353 | Return=-38.1% | Trades=708
[2026-05-18 10:46:20,133 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:46:20,521 INFO] src.engine_xgb: XGB Train Acc: 0.4927 | Test Acc: 0.4577
[2026-05-18 10:46:20,522 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1420663), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13432324), 'atr_normalized': np.float32(0.124366425), 'prev_log_return': np.float32(0.12615605), 'usdchf_log_return': np.float32(0.115330376), 'xagusd_log_return': np.float32(0.11273839), 'xtiusd_log_return': np.float32(0.12313331), 'synth_vix_zscore': np.float32(0.12188594)}
[2026-05-18 10:46:20,522 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:46:20,951 INFO] src.engine_xgb: XGB Train Acc: 0.5193 | Test Acc: 0.4711
[2026-05-18 10:46:20,951 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10708743), 'gmm_vol_cluster': np.float32(0.1460691), 'rsi_slope': np.float32(0.121783935), 'atr_normalized': np.float32(0.102015704), 'prev_log_return': np.float32(0.11137562), 'usdchf_log_return': np.float32(0.09800028), 'xagusd_log_return': np.float32(0.10381489), 'xtiusd_log_return': np.float32(0.10277091), 'synth_vix_zscore': np.float32(0.107082196)}
[2026-05-18 10:46:20,952 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:46:21,136 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 10:46:21,137 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09643114), 'gmm_vol_cluster': np.float32(0.10069642), 'rsi_slope': np.float32(0.14313197), 'atr_normalized': np.float32(0.10025406), 'prev_log_return': np.float32(0.13343683), 'usdchf_log_return': np.float32(0.10240494), 'xagusd_log_return': np.float32(0.109191164), 'xtiusd_log_return': np.float32(0.08986874), 'synth_vix_zscore': np.float32(0.124584705)}
[2026-05-18 10:46:21,137 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:46:21,139 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:46:21,480 INFO] src.backtester: Backtest [M15]: Sharpe=-2.525 | MaxDD=0.033 | WR=0.304 | Return=-3.1% | Trades=46
[2026-05-18 10:46:21,481 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:46:21,855 INFO] src.engine_xgb: XGB Train Acc: 0.4956 | Test Acc: 0.4869
[2026-05-18 10:46:21,855 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1443284), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13334496), 'atr_normalized': np.float32(0.116245665), 'prev_log_return': np.float32(0.13673963), 'usdchf_log_return': np.float32(0.11849761), 'xagusd_log_return': np.float32(0.12660635), 'xtiusd_log_return': np.float32(0.108547166), 'synth_vix_zscore': np.float32(0.115690276)}
[2026-05-18 10:46:21,856 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:46:22,089 INFO] src.engine_xgb: XGB Train Acc: 0.4910 | Test Acc: 0.5131
[2026-05-18 10:46:22,090 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11166569), 'gmm_vol_cluster': np.float32(0.061584488), 'rsi_slope': np.float32(0.14006163), 'atr_normalized': np.float32(0.10843488), 'prev_log_return': np.float32(0.13584477), 'usdchf_log_return': np.float32(0.10400473), 'xagusd_log_return': np.float32(0.12111676), 'xtiusd_log_return': np.float32(0.109386995), 'synth_vix_zscore': np.float32(0.10790006)}
[2026-05-18 10:46:22,090 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:46:22,615 INFO] src.engine_xgb: XGB Train Acc: 0.5008 | Test Acc: 0.5010
[2026-05-18 10:46:22,616 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11753445), 'gmm_vol_cluster': np.float32(0.09161407), 'rsi_slope': np.float32(0.1227761), 'atr_normalized': np.float32(0.10671899), 'prev_log_return': np.float32(0.1200661), 'usdchf_log_return': np.float32(0.10754017), 'xagusd_log_return': np.float32(0.11128024), 'xtiusd_log_return': np.float32(0.10322416), 'synth_vix_zscore': np.float32(0.11924575)}
[2026-05-18 10:46:22,617 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:46:22,618 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:46:22,974 INFO] src.backtester: Backtest [M15]: Sharpe=-5.024 | MaxDD=0.516 | WR=0.300 | Return=-40.2% | Trades=610
[2026-05-18 10:46:22,974 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:46:23,285 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:46:23,286 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11648114), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15191546), 'atr_normalized': np.float32(0.114402846), 'prev_log_return': np.float32(0.14299744), 'usdchf_log_return': np.float32(0.1185437), 'xagusd_log_return': np.float32(0.12144174), 'xtiusd_log_return': np.float32(0.12183735), 'synth_vix_zscore': np.float32(0.11238027)}
[2026-05-18 10:46:23,286 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:46:23,986 INFO] src.engine_xgb: XGB Train Acc: 0.5029 | Test Acc: 0.4720
[2026-05-18 10:46:23,987 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1065284), 'gmm_vol_cluster': np.float32(0.12619331), 'rsi_slope': np.float32(0.12253257), 'atr_normalized': np.float32(0.1046384), 'prev_log_return': np.float32(0.11547925), 'usdchf_log_return': np.float32(0.10394234), 'xagusd_log_return': np.float32(0.10547271), 'xtiusd_log_return': np.float32(0.105875164), 'synth_vix_zscore': np.float32(0.10933785)}
[2026-05-18 10:46:23,987 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:46:24,354 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 10:46:24,354 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13466772), 'gmm_vol_cluster': np.float32(0.08741696), 'rsi_slope': np.float32(0.13780661), 'atr_normalized': np.float32(0.103552796), 'prev_log_return': np.float32(0.11446569), 'usdchf_log_return': np.float32(0.10146294), 'xagusd_log_return': np.float32(0.09714098), 'xtiusd_log_return': np.float32(0.105027914), 'synth_vix_zscore': np.float32(0.11845832)}
[2026-05-18 10:46:24,355 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:46:24,357 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:46:24,458 INFO] src.backtester: Backtest [M15]: Sharpe=-2.936 | MaxDD=0.061 | WR=0.290 | Return=-5.7% | Trades=31
[2026-05-18 10:46:24,459 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[ 25/70] Best Score: -0.500 | ETA: 1h 8m RAM: 59%
Best trial: 4. Best value: -0.5: 36%|██████████████████████████▊ | 25/70 [38:15<1:02:20, 83.11s/it][2026-05-18 10:46:42,086 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:46:42,087 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:46:42,087 INFO] src.engine_hmm: Bull 0.9565 0.0000 0.0000 0.0435
[2026-05-18 10:46:42,087 INFO] src.engine_hmm: Bear 0.0000 0.9701 0.0002 0.0297
[2026-05-18 10:46:42,088 INFO] src.engine_hmm: Chop_Low 0.0000 0.0011 0.9784 0.0205
[2026-05-18 10:46:42,088 INFO] src.engine_hmm: Chop_High 0.0000 0.0142 0.0228 0.9631
[2026-05-18 10:46:42,088 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:46:42,088 INFO] src.engine_hmm: Bull: return=29.308109, vol=51.587724, rsi_slope=0.482719
[2026-05-18 10:46:42,088 INFO] src.engine_hmm: Bear: return=-0.050841, vol=1.295208, rsi_slope=0.006501
[2026-05-18 10:46:42,089 INFO] src.engine_hmm: Chop_Low: return=-0.005819, vol=-0.614073, rsi_slope=-0.002497
[2026-05-18 10:46:42,089 INFO] src.engine_hmm: Chop_High: return=0.025510, vol=-0.024214, rsi_slope=-0.000793
[2026-05-18 10:46:42,090 INFO] src.engine_hmm: Total regime transitions: 7029
[2026-05-18 10:46:42,091 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 15:30:00: Chop_High -> Bear
[2026-05-18 10:46:42,091 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 19:00:00: Bear -> Chop_High
[2026-05-18 10:46:42,092 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 02:15:00: Chop_High -> Chop_Low
[2026-05-18 10:46:42,092 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 07:00:00: Chop_Low -> Chop_High
[2026-05-18 10:46:42,093 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:46:42,093 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 22:15:00: Bear -> Chop_High
[2026-05-18 10:46:42,093 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:46:42,094 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:45:00: Chop_Low -> Chop_High
[2026-05-18 10:46:42,095 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 17:00:00: Chop_High -> Bear
[2026-05-18 10:46:42,095 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 20:30:00: Bear -> Chop_High
[2026-05-18 10:46:42,274 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:46:42,289 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:46:42,433 WARNING] src.engine_xgb: hmm_state importance=0: XGBoost ignores the HMM regime. The regime-aligned filter gates signals on a feature XGB deems uninformative — likely caused by heavy regularisation or n_states=2. Consider re-optimising with n_states>=3 or lower reg_alpha/gamma.
[2026-05-18 10:46:42,433 INFO] src.engine_xgb: XGB Train Acc: 0.5391 | Test Acc: 0.4854
[2026-05-18 10:46:42,433 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13881126), 'atr_normalized': np.float32(0.14736897), 'prev_log_return': np.float32(0.15368177), 'usdchf_log_return': np.float32(0.12452106), 'xagusd_log_return': np.float32(0.13339913), 'xtiusd_log_return': np.float32(0.14315316), 'synth_vix_zscore': np.float32(0.1590646)}
[2026-05-18 10:46:42,434 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:46:42,530 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4829
[2026-05-18 10:46:42,531 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12661867), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.18317388), 'atr_normalized': np.float32(0.11397818), 'prev_log_return': np.float32(0.12128585), 'usdchf_log_return': np.float32(0.10825536), 'xagusd_log_return': np.float32(0.106180176), 'xtiusd_log_return': np.float32(0.11853045), 'synth_vix_zscore': np.float32(0.12197744)}
[2026-05-18 10:46:42,531 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:46:42,731 INFO] src.engine_xgb: XGB Train Acc: 0.5631 | Test Acc: 0.5232
[2026-05-18 10:46:42,731 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10800949), 'gmm_vol_cluster': np.float32(0.11236419), 'rsi_slope': np.float32(0.118145615), 'atr_normalized': np.float32(0.10867134), 'prev_log_return': np.float32(0.1161368), 'usdchf_log_return': np.float32(0.108223915), 'xagusd_log_return': np.float32(0.1084511), 'xtiusd_log_return': np.float32(0.11711113), 'synth_vix_zscore': np.float32(0.102886446)}
[2026-05-18 10:46:42,732 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:46:42,733 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:46:43,058 INFO] src.backtester: Backtest [M15]: Sharpe=-0.697 | MaxDD=0.017 | WR=0.278 | Return=-1.2% | Trades=18
[2026-05-18 10:46:43,059 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:46:43,393 INFO] src.engine_xgb: XGB Train Acc: 0.5226 | Test Acc: 0.5412
[2026-05-18 10:46:43,394 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1741232), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12395866), 'atr_normalized': np.float32(0.12184852), 'prev_log_return': np.float32(0.13114044), 'usdchf_log_return': np.float32(0.10382399), 'xagusd_log_return': np.float32(0.11426665), 'xtiusd_log_return': np.float32(0.1161569), 'synth_vix_zscore': np.float32(0.11468167)}
[2026-05-18 10:46:43,394 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:46:43,652 INFO] src.engine_xgb: XGB Train Acc: 0.5261 | Test Acc: 0.5446
[2026-05-18 10:46:43,653 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12829286), 'gmm_vol_cluster': np.float32(0.10421947), 'rsi_slope': np.float32(0.13255282), 'atr_normalized': np.float32(0.09955204), 'prev_log_return': np.float32(0.12077947), 'usdchf_log_return': np.float32(0.0971778), 'xagusd_log_return': np.float32(0.10439127), 'xtiusd_log_return': np.float32(0.101354524), 'synth_vix_zscore': np.float32(0.111679785)}
[2026-05-18 10:46:43,653 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:46:43,819 INFO] src.engine_xgb: XGB Train Acc: 0.5066 | Test Acc: 0.4994
[2026-05-18 10:46:43,819 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.099449344), 'gmm_vol_cluster': np.float32(0.0821319), 'rsi_slope': np.float32(0.13650966), 'atr_normalized': np.float32(0.102057874), 'prev_log_return': np.float32(0.13911705), 'usdchf_log_return': np.float32(0.098389864), 'xagusd_log_return': np.float32(0.114704005), 'xtiusd_log_return': np.float32(0.093318336), 'synth_vix_zscore': np.float32(0.13432208)}
[2026-05-18 10:46:43,820 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:46:43,821 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:46:44,156 INFO] src.backtester: Backtest [M15]: Sharpe=0.000 | MaxDD=0.000 | WR=0.000 | Return=0.0% | Trades=0
[2026-05-18 10:46:44,156 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:46:44,495 INFO] src.engine_xgb: XGB Train Acc: 0.5045 | Test Acc: 0.5131
[2026-05-18 10:46:44,496 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13869885), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13381109), 'atr_normalized': np.float32(0.124024026), 'prev_log_return': np.float32(0.14700553), 'usdchf_log_return': np.float32(0.114812195), 'xagusd_log_return': np.float32(0.121901065), 'xtiusd_log_return': np.float32(0.10156254), 'synth_vix_zscore': np.float32(0.11818467)}
[2026-05-18 10:46:44,496 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:46:44,756 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4869
[2026-05-18 10:46:44,757 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10691352), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15625285), 'atr_normalized': np.float32(0.120081194), 'prev_log_return': np.float32(0.14733395), 'usdchf_log_return': np.float32(0.11051427), 'xagusd_log_return': np.float32(0.12375677), 'xtiusd_log_return': np.float32(0.11474981), 'synth_vix_zscore': np.float32(0.120397635)}
[2026-05-18 10:46:44,758 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:46:45,129 INFO] src.engine_xgb: XGB Train Acc: 0.5144 | Test Acc: 0.5005
[2026-05-18 10:46:45,129 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13475202), 'gmm_vol_cluster': np.float32(0.10831508), 'rsi_slope': np.float32(0.1209273), 'atr_normalized': np.float32(0.097157136), 'prev_log_return': np.float32(0.11711348), 'usdchf_log_return': np.float32(0.10299166), 'xagusd_log_return': np.float32(0.108116314), 'xtiusd_log_return': np.float32(0.0973337), 'synth_vix_zscore': np.float32(0.11329322)}
[2026-05-18 10:46:45,129 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:46:45,131 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:46:45,468 INFO] src.backtester: Backtest [M15]: Sharpe=0.000 | MaxDD=0.000 | WR=0.000 | Return=0.0% | Trades=0
[2026-05-18 10:46:45,469 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:46:45,777 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5433
[2026-05-18 10:46:45,778 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13258721), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13965747), 'atr_normalized': np.float32(0.114559375), 'prev_log_return': np.float32(0.14692675), 'usdchf_log_return': np.float32(0.123855725), 'xagusd_log_return': np.float32(0.1137415), 'xtiusd_log_return': np.float32(0.11251787), 'synth_vix_zscore': np.float32(0.116154075)}
[2026-05-18 10:46:45,778 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:46:46,226 INFO] src.engine_xgb: XGB Train Acc: 0.5219 | Test Acc: 0.5333
[2026-05-18 10:46:46,226 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.104679115), 'gmm_vol_cluster': np.float32(0.13283291), 'rsi_slope': np.float32(0.13284299), 'atr_normalized': np.float32(0.10173018), 'prev_log_return': np.float32(0.112464845), 'usdchf_log_return': np.float32(0.10210253), 'xagusd_log_return': np.float32(0.09969894), 'xtiusd_log_return': np.float32(0.10632129), 'synth_vix_zscore': np.float32(0.10732717)}
[2026-05-18 10:46:46,227 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:46:46,573 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5253
[2026-05-18 10:46:46,574 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09136743), 'gmm_vol_cluster': np.float32(0.091220185), 'rsi_slope': np.float32(0.14253889), 'atr_normalized': np.float32(0.10672474), 'prev_log_return': np.float32(0.11565442), 'usdchf_log_return': np.float32(0.11059344), 'xagusd_log_return': np.float32(0.10413177), 'xtiusd_log_return': np.float32(0.102702335), 'synth_vix_zscore': np.float32(0.1350668)}
[2026-05-18 10:46:46,574 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:46:46,576 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:46:46,675 INFO] src.backtester: Backtest [M15]: Sharpe=0.000 | MaxDD=0.000 | WR=0.000 | Return=0.0% | Trades=0
[2026-05-18 10:46:46,676 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 37%|████████████████████████████▌ | 26/70 [38:37<47:33, 64.85s/it][2026-05-18 10:48:18,671 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:48:18,671 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:48:18,672 INFO] src.engine_hmm: Bull 0.9554 0.0112 0.0006 0.0328
[2026-05-18 10:48:18,672 INFO] src.engine_hmm: Bear 0.0313 0.9670 0.0004 0.0013
[2026-05-18 10:48:18,672 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0236
[2026-05-18 10:48:18,672 INFO] src.engine_hmm: Chop_High 0.0245 0.0016 0.0261 0.9479
[2026-05-18 10:48:18,672 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:48:18,672 INFO] src.engine_hmm: Bull: return=0.056279, vol=0.374748, rsi_slope=0.000143
[2026-05-18 10:48:18,672 INFO] src.engine_hmm: Bear: return=-0.147511, vol=1.847189, rsi_slope=0.010232
[2026-05-18 10:48:18,673 INFO] src.engine_hmm: Chop_Low: return=-0.023156, vol=-0.670597, rsi_slope=0.000533
[2026-05-18 10:48:18,673 INFO] src.engine_hmm: Chop_High: return=0.029063, vol=-0.248538, rsi_slope=-0.004225
[2026-05-18 10:48:18,674 INFO] src.engine_hmm: Total regime transitions: 9505
[2026-05-18 10:48:18,675 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:48:18,675 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:15:00: Bull -> Chop_High
[2026-05-18 10:48:18,675 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:48:18,675 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:48:18,675 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:48:18,676 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:48:18,676 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:48:18,676 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:48:18,676 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:48:18,676 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:48:18,849 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:48:18,866 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:48:18,995 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:48:18,995 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.26434973), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.09844666), 'atr_normalized': np.float32(0.09982378), 'prev_log_return': np.float32(0.12239599), 'usdchf_log_return': np.float32(0.10579995), 'xagusd_log_return': np.float32(0.09139013), 'xtiusd_log_return': np.float32(0.10552851), 'synth_vix_zscore': np.float32(0.11226522)}
[2026-05-18 10:48:18,996 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:48:19,099 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.5171
[2026-05-18 10:48:19,099 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11111814), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16538148), 'atr_normalized': np.float32(0.118892714), 'prev_log_return': np.float32(0.12794189), 'usdchf_log_return': np.float32(0.11170622), 'xagusd_log_return': np.float32(0.11623888), 'xtiusd_log_return': np.float32(0.12583046), 'synth_vix_zscore': np.float32(0.122890264)}
[2026-05-18 10:48:19,099 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:48:19,226 INFO] src.engine_xgb: XGB Train Acc: 0.4948 | Test Acc: 0.4893
[2026-05-18 10:48:19,227 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09624823), 'gmm_vol_cluster': np.float32(0.12020278), 'rsi_slope': np.float32(0.106526926), 'atr_normalized': np.float32(0.11089446), 'prev_log_return': np.float32(0.124203674), 'usdchf_log_return': np.float32(0.10568079), 'xagusd_log_return': np.float32(0.11603357), 'xtiusd_log_return': np.float32(0.11192818), 'synth_vix_zscore': np.float32(0.108281314)}
[2026-05-18 10:48:19,227 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:48:19,228 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:48:19,616 INFO] src.backtester: Backtest [M15]: Sharpe=-4.664 | MaxDD=0.799 | WR=0.366 | Return=-54.9% | Trades=1071
[2026-05-18 10:48:19,616 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:48:19,839 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 10:48:19,839 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13511816), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12515953), 'atr_normalized': np.float32(0.12444851), 'prev_log_return': np.float32(0.12473039), 'usdchf_log_return': np.float32(0.12118774), 'xagusd_log_return': np.float32(0.11120475), 'xtiusd_log_return': np.float32(0.12982847), 'synth_vix_zscore': np.float32(0.12832245)}
[2026-05-18 10:48:19,840 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:48:20,026 INFO] src.engine_xgb: XGB Train Acc: 0.4878 | Test Acc: 0.4585
[2026-05-18 10:48:20,026 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10878176), 'gmm_vol_cluster': np.float32(0.15004712), 'rsi_slope': np.float32(0.117561504), 'atr_normalized': np.float32(0.10461382), 'prev_log_return': np.float32(0.11214918), 'usdchf_log_return': np.float32(0.10089581), 'xagusd_log_return': np.float32(0.099465854), 'xtiusd_log_return': np.float32(0.10080758), 'synth_vix_zscore': np.float32(0.105677344)}
[2026-05-18 10:48:20,027 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:48:20,228 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 10:48:20,228 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09039922), 'gmm_vol_cluster': np.float32(0.09367573), 'rsi_slope': np.float32(0.12692305), 'atr_normalized': np.float32(0.11535904), 'prev_log_return': np.float32(0.12609592), 'usdchf_log_return': np.float32(0.1011319), 'xagusd_log_return': np.float32(0.10656661), 'xtiusd_log_return': np.float32(0.10959212), 'synth_vix_zscore': np.float32(0.13025644)}
[2026-05-18 10:48:20,229 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:48:20,230 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:48:20,783 INFO] src.backtester: Backtest [M15]: Sharpe=-5.692 | MaxDD=0.684 | WR=0.337 | Return=-49.4% | Trades=940
[2026-05-18 10:48:20,783 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:48:21,095 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 10:48:21,095 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14980261), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12841442), 'atr_normalized': np.float32(0.11235691), 'prev_log_return': np.float32(0.12803717), 'usdchf_log_return': np.float32(0.12263702), 'xagusd_log_return': np.float32(0.12331872), 'xtiusd_log_return': np.float32(0.11289691), 'synth_vix_zscore': np.float32(0.12253631)}
[2026-05-18 10:48:21,096 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:48:21,322 INFO] src.engine_xgb: XGB Train Acc: 0.4910 | Test Acc: 0.5131
[2026-05-18 10:48:21,323 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10748251), 'gmm_vol_cluster': np.float32(0.12985224), 'rsi_slope': np.float32(0.12032734), 'atr_normalized': np.float32(0.10857055), 'prev_log_return': np.float32(0.12175203), 'usdchf_log_return': np.float32(0.09819562), 'xagusd_log_return': np.float32(0.10503354), 'xtiusd_log_return': np.float32(0.108353496), 'synth_vix_zscore': np.float32(0.10043271)}
[2026-05-18 10:48:21,323 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:48:21,562 INFO] src.engine_xgb: XGB Train Acc: 0.4947 | Test Acc: 0.5016
[2026-05-18 10:48:21,562 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.120112784), 'gmm_vol_cluster': np.float32(0.13151295), 'rsi_slope': np.float32(0.11363894), 'atr_normalized': np.float32(0.102454074), 'prev_log_return': np.float32(0.11112155), 'usdchf_log_return': np.float32(0.10443717), 'xagusd_log_return': np.float32(0.10127605), 'xtiusd_log_return': np.float32(0.10412486), 'synth_vix_zscore': np.float32(0.11132158)}
[2026-05-18 10:48:21,563 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:48:21,564 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:48:21,956 INFO] src.backtester: Backtest [M15]: Sharpe=-6.605 | MaxDD=0.947 | WR=0.339 | Return=-61.2% | Trades=1108
[2026-05-18 10:48:21,956 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:48:22,232 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:48:22,233 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14159557), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13232255), 'atr_normalized': np.float32(0.13009752), 'prev_log_return': np.float32(0.13894942), 'usdchf_log_return': np.float32(0.11551189), 'xagusd_log_return': np.float32(0.10327577), 'xtiusd_log_return': np.float32(0.11832057), 'synth_vix_zscore': np.float32(0.11992674)}
[2026-05-18 10:48:22,234 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:48:22,567 INFO] src.engine_xgb: XGB Train Acc: 0.4878 | Test Acc: 0.4653
[2026-05-18 10:48:22,567 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10205037), 'gmm_vol_cluster': np.float32(0.10923146), 'rsi_slope': np.float32(0.119374305), 'atr_normalized': np.float32(0.10829268), 'prev_log_return': np.float32(0.11813013), 'usdchf_log_return': np.float32(0.103853896), 'xagusd_log_return': np.float32(0.10821837), 'xtiusd_log_return': np.float32(0.11459013), 'synth_vix_zscore': np.float32(0.11625863)}
[2026-05-18 10:48:22,568 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:48:22,939 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 10:48:22,941 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10450707), 'gmm_vol_cluster': np.float32(0.102612376), 'rsi_slope': np.float32(0.12743026), 'atr_normalized': np.float32(0.11146098), 'prev_log_return': np.float32(0.1141227), 'usdchf_log_return': np.float32(0.10920813), 'xagusd_log_return': np.float32(0.108556345), 'xtiusd_log_return': np.float32(0.11181549), 'synth_vix_zscore': np.float32(0.11028667)}
[2026-05-18 10:48:22,941 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:48:22,943 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:48:23,089 INFO] src.backtester: Backtest [M15]: Sharpe=-5.008 | MaxDD=0.439 | WR=0.389 | Return=-32.1% | Trades=655
[2026-05-18 10:48:23,090 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 39%|█████████████████████████████▋ | 27/70 [40:14<53:15, 74.31s/it][2026-05-18 10:49:54,896 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:49:54,896 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:49:54,896 INFO] src.engine_hmm: Bull 0.9555 0.0111 0.0006 0.0327
[2026-05-18 10:49:54,897 INFO] src.engine_hmm: Bear 0.0314 0.9670 0.0004 0.0013
[2026-05-18 10:49:54,897 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0236
[2026-05-18 10:49:54,897 INFO] src.engine_hmm: Chop_High 0.0244 0.0016 0.0260 0.9480
[2026-05-18 10:49:54,897 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:49:54,897 INFO] src.engine_hmm: Bull: return=0.055745, vol=0.376935, rsi_slope=0.000246
[2026-05-18 10:49:54,898 INFO] src.engine_hmm: Bear: return=-0.148789, vol=1.854680, rsi_slope=0.010137
[2026-05-18 10:49:54,898 INFO] src.engine_hmm: Chop_Low: return=-0.022703, vol=-0.670444, rsi_slope=0.000498
[2026-05-18 10:49:54,898 INFO] src.engine_hmm: Chop_High: return=0.029095, vol=-0.247867, rsi_slope=-0.004211
[2026-05-18 10:49:54,899 INFO] src.engine_hmm: Total regime transitions: 9496
[2026-05-18 10:49:54,900 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:49:54,900 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:49:54,900 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:49:54,900 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:49:54,901 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:49:54,901 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:49:54,901 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:49:54,901 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:49:54,901 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:49:54,902 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:49:55,059 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:49:55,078 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:49:55,192 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:49:55,193 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13745928), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11822972), 'atr_normalized': np.float32(0.12548852), 'prev_log_return': np.float32(0.13555555), 'usdchf_log_return': np.float32(0.11394291), 'xagusd_log_return': np.float32(0.10975466), 'xtiusd_log_return': np.float32(0.12147762), 'synth_vix_zscore': np.float32(0.13809177)}
[2026-05-18 10:49:55,193 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:49:55,275 INFO] src.engine_xgb: XGB Train Acc: 0.5135 | Test Acc: 0.5067
[2026-05-18 10:49:55,275 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11112529), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1621194), 'atr_normalized': np.float32(0.12961087), 'prev_log_return': np.float32(0.11803589), 'usdchf_log_return': np.float32(0.11494523), 'xagusd_log_return': np.float32(0.11895588), 'xtiusd_log_return': np.float32(0.120444216), 'synth_vix_zscore': np.float32(0.12476321)}
[2026-05-18 10:49:55,276 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:49:55,422 INFO] src.engine_xgb: XGB Train Acc: 0.5708 | Test Acc: 0.5141
[2026-05-18 10:49:55,423 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11486685), 'gmm_vol_cluster': np.float32(0.105498455), 'rsi_slope': np.float32(0.112214394), 'atr_normalized': np.float32(0.11138527), 'prev_log_return': np.float32(0.11813374), 'usdchf_log_return': np.float32(0.107983716), 'xagusd_log_return': np.float32(0.120080225), 'xtiusd_log_return': np.float32(0.10619909), 'synth_vix_zscore': np.float32(0.10363816)}
[2026-05-18 10:49:55,423 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:49:55,425 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:49:55,752 INFO] src.backtester: Backtest [M15]: Sharpe=-4.604 | MaxDD=0.451 | WR=0.358 | Return=-36.3% | Trades=632
[2026-05-18 10:49:55,753 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:49:55,989 INFO] src.engine_xgb: XGB Train Acc: 0.5203 | Test Acc: 0.4809
[2026-05-18 10:49:55,990 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14306088), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13341084), 'atr_normalized': np.float32(0.12101563), 'prev_log_return': np.float32(0.12996314), 'usdchf_log_return': np.float32(0.12250011), 'xagusd_log_return': np.float32(0.116288684), 'xtiusd_log_return': np.float32(0.11393532), 'synth_vix_zscore': np.float32(0.119825356)}
[2026-05-18 10:49:55,990 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:49:56,158 INFO] src.engine_xgb: XGB Train Acc: 0.5510 | Test Acc: 0.5018
[2026-05-18 10:49:56,158 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.099404596), 'gmm_vol_cluster': np.float32(0.17924711), 'rsi_slope': np.float32(0.115758404), 'atr_normalized': np.float32(0.097430095), 'prev_log_return': np.float32(0.10757864), 'usdchf_log_return': np.float32(0.10522748), 'xagusd_log_return': np.float32(0.09558817), 'xtiusd_log_return': np.float32(0.09992219), 'synth_vix_zscore': np.float32(0.09984338)}
[2026-05-18 10:49:56,159 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:49:56,315 INFO] src.engine_xgb: XGB Train Acc: 0.5280 | Test Acc: 0.5055
[2026-05-18 10:49:56,316 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08021554), 'gmm_vol_cluster': np.float32(0.08929641), 'rsi_slope': np.float32(0.13855271), 'atr_normalized': np.float32(0.107592806), 'prev_log_return': np.float32(0.12471189), 'usdchf_log_return': np.float32(0.097082816), 'xagusd_log_return': np.float32(0.11972827), 'xtiusd_log_return': np.float32(0.111522645), 'synth_vix_zscore': np.float32(0.13129695)}
[2026-05-18 10:49:56,316 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:49:56,317 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:49:56,629 INFO] src.backtester: Backtest [M15]: Sharpe=0.407 | MaxDD=0.000 | WR=1.000 | Return=0.0% | Trades=1
[2026-05-18 10:49:56,629 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:49:56,880 INFO] src.engine_xgb: XGB Train Acc: 0.4973 | Test Acc: 0.4872
[2026-05-18 10:49:56,880 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09051572), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14048128), 'atr_normalized': np.float32(0.11998053), 'prev_log_return': np.float32(0.15169875), 'usdchf_log_return': np.float32(0.122811586), 'xagusd_log_return': np.float32(0.13796124), 'xtiusd_log_return': np.float32(0.10863046), 'synth_vix_zscore': np.float32(0.1279204)}
[2026-05-18 10:49:56,881 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:49:57,062 INFO] src.engine_xgb: XGB Train Acc: 0.5139 | Test Acc: 0.4868
[2026-05-18 10:49:57,062 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.123502985), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15321536), 'atr_normalized': np.float32(0.119218625), 'prev_log_return': np.float32(0.13617125), 'usdchf_log_return': np.float32(0.102952756), 'xagusd_log_return': np.float32(0.12879257), 'xtiusd_log_return': np.float32(0.12010065), 'synth_vix_zscore': np.float32(0.11604586)}
[2026-05-18 10:49:57,063 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:49:57,356 INFO] src.engine_xgb: XGB Train Acc: 0.5505 | Test Acc: 0.5183
[2026-05-18 10:49:57,356 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13309062), 'gmm_vol_cluster': np.float32(0.10377165), 'rsi_slope': np.float32(0.11594375), 'atr_normalized': np.float32(0.10792517), 'prev_log_return': np.float32(0.115751155), 'usdchf_log_return': np.float32(0.10435413), 'xagusd_log_return': np.float32(0.1110845), 'xtiusd_log_return': np.float32(0.095229134), 'synth_vix_zscore': np.float32(0.11284983)}
[2026-05-18 10:49:57,357 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:49:57,358 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:49:57,670 INFO] src.backtester: Backtest [M15]: Sharpe=-1.635 | MaxDD=0.042 | WR=0.286 | Return=-3.7% | Trades=28
[2026-05-18 10:49:57,671 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:49:57,978 INFO] src.engine_xgb: XGB Train Acc: 0.4962 | Test Acc: 0.4643
[2026-05-18 10:49:57,978 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13616027), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14341213), 'atr_normalized': np.float32(0.11987281), 'prev_log_return': np.float32(0.13977495), 'usdchf_log_return': np.float32(0.1193147), 'xagusd_log_return': np.float32(0.110144384), 'xtiusd_log_return': np.float32(0.11814754), 'synth_vix_zscore': np.float32(0.113173254)}
[2026-05-18 10:49:57,979 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:49:58,270 INFO] src.engine_xgb: XGB Train Acc: 0.5404 | Test Acc: 0.5046
[2026-05-18 10:49:58,271 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0987083), 'gmm_vol_cluster': np.float32(0.15160689), 'rsi_slope': np.float32(0.12092179), 'atr_normalized': np.float32(0.10133286), 'prev_log_return': np.float32(0.117859386), 'usdchf_log_return': np.float32(0.101349175), 'xagusd_log_return': np.float32(0.104729585), 'xtiusd_log_return': np.float32(0.09650744), 'synth_vix_zscore': np.float32(0.10698457)}
[2026-05-18 10:49:58,271 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:49:58,603 INFO] src.engine_xgb: XGB Train Acc: 0.5448 | Test Acc: 0.5058
[2026-05-18 10:49:58,603 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10671537), 'gmm_vol_cluster': np.float32(0.11553091), 'rsi_slope': np.float32(0.12189357), 'atr_normalized': np.float32(0.10815345), 'prev_log_return': np.float32(0.1138177), 'usdchf_log_return': np.float32(0.10438577), 'xagusd_log_return': np.float32(0.10949703), 'xtiusd_log_return': np.float32(0.101882696), 'synth_vix_zscore': np.float32(0.11812345)}
[2026-05-18 10:49:58,604 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:49:58,605 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:49:58,704 INFO] src.backtester: Backtest [M15]: Sharpe=0.652 | MaxDD=0.004 | WR=0.500 | Return=0.3% | Trades=2
[2026-05-18 10:49:58,705 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 40%|██████████████████████████████▊ | 28/70 [41:51<56:45, 81.08s/it][2026-05-18 10:51:33,091 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:51:33,092 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:51:33,092 INFO] src.engine_hmm: Bull 0.9552 0.0114 0.0007 0.0328
[2026-05-18 10:51:33,092 INFO] src.engine_hmm: Bear 0.0309 0.9673 0.0004 0.0014
[2026-05-18 10:51:33,092 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0237
[2026-05-18 10:51:33,092 INFO] src.engine_hmm: Chop_High 0.0246 0.0016 0.0261 0.9477
[2026-05-18 10:51:33,092 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:51:33,093 INFO] src.engine_hmm: Bull: return=0.056901, vol=0.368762, rsi_slope=-0.000089
[2026-05-18 10:51:33,093 INFO] src.engine_hmm: Bear: return=-0.145623, vol=1.825977, rsi_slope=0.010278
[2026-05-18 10:51:33,093 INFO] src.engine_hmm: Chop_Low: return=-0.023294, vol=-0.671082, rsi_slope=0.000626
[2026-05-18 10:51:33,093 INFO] src.engine_hmm: Chop_High: return=0.029098, vol=-0.250349, rsi_slope=-0.004230
[2026-05-18 10:51:33,095 INFO] src.engine_hmm: Total regime transitions: 9540
[2026-05-18 10:51:33,095 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:51:33,095 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:15:00: Bull -> Chop_High
[2026-05-18 10:51:33,095 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:51:33,096 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:51:33,096 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:51:33,096 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:51:33,096 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:51:33,096 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:51:33,097 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:51:33,097 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:51:33,259 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:51:33,276 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:51:33,455 INFO] src.engine_xgb: XGB Train Acc: 0.4958 | Test Acc: 0.4757
[2026-05-18 10:51:33,457 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.20729245), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11298372), 'atr_normalized': np.float32(0.117610745), 'prev_log_return': np.float32(0.1247761), 'usdchf_log_return': np.float32(0.09821485), 'xagusd_log_return': np.float32(0.10318579), 'xtiusd_log_return': np.float32(0.11984812), 'synth_vix_zscore': np.float32(0.116088174)}
[2026-05-18 10:51:33,457 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:51:33,664 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4829
[2026-05-18 10:51:33,665 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12036558), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16415672), 'atr_normalized': np.float32(0.11410167), 'prev_log_return': np.float32(0.12264135), 'usdchf_log_return': np.float32(0.12713093), 'xagusd_log_return': np.float32(0.11128068), 'xtiusd_log_return': np.float32(0.11604822), 'synth_vix_zscore': np.float32(0.124274805)}
[2026-05-18 10:51:33,665 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:51:33,968 INFO] src.engine_xgb: XGB Train Acc: 0.5052 | Test Acc: 0.5103
[2026-05-18 10:51:33,968 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10922914), 'gmm_vol_cluster': np.float32(0.11516313), 'rsi_slope': np.float32(0.10916624), 'atr_normalized': np.float32(0.11328656), 'prev_log_return': np.float32(0.12135383), 'usdchf_log_return': np.float32(0.10391182), 'xagusd_log_return': np.float32(0.10913005), 'xtiusd_log_return': np.float32(0.111591354), 'synth_vix_zscore': np.float32(0.107167825)}
[2026-05-18 10:51:33,969 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:51:33,970 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:51:34,403 INFO] src.backtester: Backtest [M15]: Sharpe=-12.811 | MaxDD=1.723 | WR=0.330 | Return=-82.1% | Trades=2179
[2026-05-18 10:51:34,403 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:51:34,701 INFO] src.engine_xgb: XGB Train Acc: 0.5083 | Test Acc: 0.5430
[2026-05-18 10:51:34,702 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15259601), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12287337), 'atr_normalized': np.float32(0.11513466), 'prev_log_return': np.float32(0.13819367), 'usdchf_log_return': np.float32(0.1177931), 'xagusd_log_return': np.float32(0.11139544), 'xtiusd_log_return': np.float32(0.119301856), 'synth_vix_zscore': np.float32(0.12271194)}
[2026-05-18 10:51:34,702 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:51:34,962 INFO] src.engine_xgb: XGB Train Acc: 0.5129 | Test Acc: 0.5423
[2026-05-18 10:51:34,963 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.102697425), 'gmm_vol_cluster': np.float32(0.13430586), 'rsi_slope': np.float32(0.12951359), 'atr_normalized': np.float32(0.10236955), 'prev_log_return': np.float32(0.12274163), 'usdchf_log_return': np.float32(0.0974099), 'xagusd_log_return': np.float32(0.10076004), 'xtiusd_log_return': np.float32(0.100824684), 'synth_vix_zscore': np.float32(0.10937731)}
[2026-05-18 10:51:34,963 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:51:35,148 INFO] src.engine_xgb: XGB Train Acc: 0.5066 | Test Acc: 0.4994
[2026-05-18 10:51:35,149 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09198377), 'gmm_vol_cluster': np.float32(0.11061885), 'rsi_slope': np.float32(0.12615027), 'atr_normalized': np.float32(0.105802536), 'prev_log_return': np.float32(0.12843381), 'usdchf_log_return': np.float32(0.10324675), 'xagusd_log_return': np.float32(0.10522161), 'xtiusd_log_return': np.float32(0.100631006), 'synth_vix_zscore': np.float32(0.12791142)}
[2026-05-18 10:51:35,149 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:51:35,151 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:51:35,581 INFO] src.backtester: Backtest [M15]: Sharpe=-15.214 | MaxDD=2.154 | WR=0.329 | Return=-88.4% | Trades=2645
[2026-05-18 10:51:35,581 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:51:35,883 INFO] src.engine_xgb: XGB Train Acc: 0.5045 | Test Acc: 0.5131
[2026-05-18 10:51:35,883 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15280348), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13873613), 'atr_normalized': np.float32(0.11306167), 'prev_log_return': np.float32(0.13321543), 'usdchf_log_return': np.float32(0.114019595), 'xagusd_log_return': np.float32(0.1271033), 'xtiusd_log_return': np.float32(0.11433641), 'synth_vix_zscore': np.float32(0.10672404)}
[2026-05-18 10:51:35,884 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:51:36,095 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4869
[2026-05-18 10:51:36,096 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10792626), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16587539), 'atr_normalized': np.float32(0.119034834), 'prev_log_return': np.float32(0.14046997), 'usdchf_log_return': np.float32(0.1127487), 'xagusd_log_return': np.float32(0.12515971), 'xtiusd_log_return': np.float32(0.112804085), 'synth_vix_zscore': np.float32(0.11598109)}
[2026-05-18 10:51:36,096 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:51:36,515 INFO] src.engine_xgb: XGB Train Acc: 0.5053 | Test Acc: 0.4984
[2026-05-18 10:51:36,515 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11549724), 'gmm_vol_cluster': np.float32(0.10995826), 'rsi_slope': np.float32(0.13018867), 'atr_normalized': np.float32(0.10043435), 'prev_log_return': np.float32(0.11318211), 'usdchf_log_return': np.float32(0.105193704), 'xagusd_log_return': np.float32(0.10527), 'xtiusd_log_return': np.float32(0.10167256), 'synth_vix_zscore': np.float32(0.11860314)}
[2026-05-18 10:51:36,516 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:51:36,517 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:51:36,944 INFO] src.backtester: Backtest [M15]: Sharpe=-14.858 | MaxDD=2.119 | WR=0.335 | Return=-87.8% | Trades=2542
[2026-05-18 10:51:36,944 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:51:37,341 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5433
[2026-05-18 10:51:37,341 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13923171), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13726847), 'atr_normalized': np.float32(0.11934923), 'prev_log_return': np.float32(0.13573813), 'usdchf_log_return': np.float32(0.124364294), 'xagusd_log_return': np.float32(0.11254828), 'xtiusd_log_return': np.float32(0.11122566), 'synth_vix_zscore': np.float32(0.12027421)}
[2026-05-18 10:51:37,342 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:51:38,262 INFO] src.engine_xgb: XGB Train Acc: 0.5123 | Test Acc: 0.5348
[2026-05-18 10:51:38,263 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.108499356), 'gmm_vol_cluster': np.float32(0.10654105), 'rsi_slope': np.float32(0.13077089), 'atr_normalized': np.float32(0.1036707), 'prev_log_return': np.float32(0.11775991), 'usdchf_log_return': np.float32(0.10734639), 'xagusd_log_return': np.float32(0.10781905), 'xtiusd_log_return': np.float32(0.10704655), 'synth_vix_zscore': np.float32(0.11054615)}
[2026-05-18 10:51:38,263 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:51:38,633 INFO] src.engine_xgb: XGB Train Acc: 0.5101 | Test Acc: 0.5252
[2026-05-18 10:51:38,634 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13231742), 'gmm_vol_cluster': np.float32(0.080372915), 'rsi_slope': np.float32(0.13382922), 'atr_normalized': np.float32(0.10810225), 'prev_log_return': np.float32(0.11694664), 'usdchf_log_return': np.float32(0.101591386), 'xagusd_log_return': np.float32(0.09902925), 'xtiusd_log_return': np.float32(0.10114084), 'synth_vix_zscore': np.float32(0.12667005)}
[2026-05-18 10:51:38,634 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:51:38,637 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:51:38,774 INFO] src.backtester: Backtest [M15]: Sharpe=-14.588 | MaxDD=0.429 | WR=0.360 | Return=-34.9% | Trades=500
[2026-05-18 10:51:38,775 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 41%|███████████████████████████████▉ | 29/70 [43:29<59:02, 86.40s/it][2026-05-18 10:53:05,726 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:53:05,726 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:53:05,726 INFO] src.engine_hmm: Bull 0.9557 0.0109 0.0006 0.0328
[2026-05-18 10:53:05,727 INFO] src.engine_hmm: Bear 0.0320 0.9666 0.0003 0.0012
[2026-05-18 10:53:05,727 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0236
[2026-05-18 10:53:05,727 INFO] src.engine_hmm: Chop_High 0.0242 0.0016 0.0260 0.9482
[2026-05-18 10:53:05,727 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:53:05,727 INFO] src.engine_hmm: Bull: return=0.052369, vol=0.383201, rsi_slope=0.000816
[2026-05-18 10:53:05,727 INFO] src.engine_hmm: Bear: return=-0.152578, vol=1.882148, rsi_slope=0.009319
[2026-05-18 10:53:05,728 INFO] src.engine_hmm: Chop_Low: return=-0.019624, vol=-0.670195, rsi_slope=0.000262
[2026-05-18 10:53:05,728 INFO] src.engine_hmm: Chop_High: return=0.028655, vol=-0.246066, rsi_slope=-0.004059
[2026-05-18 10:53:05,729 INFO] src.engine_hmm: Total regime transitions: 9496
[2026-05-18 10:53:05,730 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:53:05,730 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:53:05,730 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:53:05,730 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:53:05,731 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:53:05,731 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:53:05,731 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:53:05,731 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:53:05,731 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:53:05,732 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:53:05,882 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:53:05,902 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:53:06,029 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:53:06,029 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.18155266), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11022083), 'atr_normalized': np.float32(0.11987849), 'prev_log_return': np.float32(0.13309616), 'usdchf_log_return': np.float32(0.10237108), 'xagusd_log_return': np.float32(0.10966455), 'xtiusd_log_return': np.float32(0.1228177), 'synth_vix_zscore': np.float32(0.12039853)}
[2026-05-18 10:53:06,030 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:53:06,146 INFO] src.engine_xgb: XGB Train Acc: 0.5067 | Test Acc: 0.5164
[2026-05-18 10:53:06,146 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12093426), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15881453), 'atr_normalized': np.float32(0.11722528), 'prev_log_return': np.float32(0.121457994), 'usdchf_log_return': np.float32(0.12630825), 'xagusd_log_return': np.float32(0.113243826), 'xtiusd_log_return': np.float32(0.11975398), 'synth_vix_zscore': np.float32(0.122261874)}
[2026-05-18 10:53:06,147 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:53:06,300 INFO] src.engine_xgb: XGB Train Acc: 0.5114 | Test Acc: 0.4932
[2026-05-18 10:53:06,300 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10561373), 'gmm_vol_cluster': np.float32(0.10714766), 'rsi_slope': np.float32(0.10994002), 'atr_normalized': np.float32(0.11441126), 'prev_log_return': np.float32(0.12448467), 'usdchf_log_return': np.float32(0.10635434), 'xagusd_log_return': np.float32(0.119097225), 'xtiusd_log_return': np.float32(0.11168718), 'synth_vix_zscore': np.float32(0.10126394)}
[2026-05-18 10:53:06,301 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:53:06,302 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:53:06,636 INFO] src.backtester: Backtest [M15]: Sharpe=-3.071 | MaxDD=0.385 | WR=0.333 | Return=-31.7% | Trades=528
[2026-05-18 10:53:06,637 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:53:06,856 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 10:53:06,856 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.18445389), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12382027), 'atr_normalized': np.float32(0.11800642), 'prev_log_return': np.float32(0.12184691), 'usdchf_log_return': np.float32(0.10586853), 'xagusd_log_return': np.float32(0.10502716), 'xtiusd_log_return': np.float32(0.12176392), 'synth_vix_zscore': np.float32(0.11921296)}
[2026-05-18 10:53:06,857 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:53:07,088 INFO] src.engine_xgb: XGB Train Acc: 0.5021 | Test Acc: 0.4613
[2026-05-18 10:53:07,089 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.106140755), 'gmm_vol_cluster': np.float32(0.13520716), 'rsi_slope': np.float32(0.12622516), 'atr_normalized': np.float32(0.09389278), 'prev_log_return': np.float32(0.12082819), 'usdchf_log_return': np.float32(0.099588424), 'xagusd_log_return': np.float32(0.10472468), 'xtiusd_log_return': np.float32(0.106937975), 'synth_vix_zscore': np.float32(0.10645491)}
[2026-05-18 10:53:07,089 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:53:07,263 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 10:53:07,264 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08447091), 'gmm_vol_cluster': np.float32(0.08475574), 'rsi_slope': np.float32(0.14201382), 'atr_normalized': np.float32(0.099629775), 'prev_log_return': np.float32(0.14053671), 'usdchf_log_return': np.float32(0.112028845), 'xagusd_log_return': np.float32(0.11974446), 'xtiusd_log_return': np.float32(0.09315065), 'synth_vix_zscore': np.float32(0.12366911)}
[2026-05-18 10:53:07,265 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:53:07,266 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:53:07,586 INFO] src.backtester: Backtest [M15]: Sharpe=-0.857 | MaxDD=0.005 | WR=0.333 | Return=-0.5% | Trades=6
[2026-05-18 10:53:07,586 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:53:07,863 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 10:53:07,864 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11391257), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13738409), 'atr_normalized': np.float32(0.12481513), 'prev_log_return': np.float32(0.13953343), 'usdchf_log_return': np.float32(0.12062231), 'xagusd_log_return': np.float32(0.13512701), 'xtiusd_log_return': np.float32(0.103661984), 'synth_vix_zscore': np.float32(0.12494351)}
[2026-05-18 10:53:07,864 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:53:08,181 INFO] src.engine_xgb: XGB Train Acc: 0.5170 | Test Acc: 0.5202
[2026-05-18 10:53:08,181 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1063229), 'gmm_vol_cluster': np.float32(0.09845152), 'rsi_slope': np.float32(0.13606416), 'atr_normalized': np.float32(0.1101307), 'prev_log_return': np.float32(0.11818266), 'usdchf_log_return': np.float32(0.104841016), 'xagusd_log_return': np.float32(0.113496386), 'xtiusd_log_return': np.float32(0.10755695), 'synth_vix_zscore': np.float32(0.10495366)}
[2026-05-18 10:53:08,182 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:53:08,498 INFO] src.engine_xgb: XGB Train Acc: 0.5020 | Test Acc: 0.5016
[2026-05-18 10:53:08,498 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11995489), 'gmm_vol_cluster': np.float32(0.09708004), 'rsi_slope': np.float32(0.116653085), 'atr_normalized': np.float32(0.100743964), 'prev_log_return': np.float32(0.120360754), 'usdchf_log_return': np.float32(0.11066189), 'xagusd_log_return': np.float32(0.11365183), 'xtiusd_log_return': np.float32(0.10500488), 'synth_vix_zscore': np.float32(0.115888655)}
[2026-05-18 10:53:08,499 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:53:08,500 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:53:08,838 INFO] src.backtester: Backtest [M15]: Sharpe=-4.379 | MaxDD=0.358 | WR=0.292 | Return=-30.0% | Trades=353
[2026-05-18 10:53:08,838 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:53:09,119 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:53:09,119 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.120394185), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16923025), 'atr_normalized': np.float32(0.11799595), 'prev_log_return': np.float32(0.14428644), 'usdchf_log_return': np.float32(0.11966402), 'xagusd_log_return': np.float32(0.1075699), 'xtiusd_log_return': np.float32(0.11147861), 'synth_vix_zscore': np.float32(0.10938065)}
[2026-05-18 10:53:09,120 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:53:09,631 INFO] src.engine_xgb: XGB Train Acc: 0.5022 | Test Acc: 0.4731
[2026-05-18 10:53:09,631 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0980328), 'gmm_vol_cluster': np.float32(0.107857175), 'rsi_slope': np.float32(0.12802286), 'atr_normalized': np.float32(0.11013116), 'prev_log_return': np.float32(0.11880746), 'usdchf_log_return': np.float32(0.11284483), 'xagusd_log_return': np.float32(0.10433998), 'xtiusd_log_return': np.float32(0.10475755), 'synth_vix_zscore': np.float32(0.1152062)}
[2026-05-18 10:53:09,632 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:53:10,096 INFO] src.engine_xgb: XGB Train Acc: 0.5082 | Test Acc: 0.4824
[2026-05-18 10:53:10,096 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11037653), 'gmm_vol_cluster': np.float32(0.09002097), 'rsi_slope': np.float32(0.13800941), 'atr_normalized': np.float32(0.10632572), 'prev_log_return': np.float32(0.12077541), 'usdchf_log_return': np.float32(0.10463036), 'xagusd_log_return': np.float32(0.11149171), 'xtiusd_log_return': np.float32(0.10138062), 'synth_vix_zscore': np.float32(0.116989285)}
[2026-05-18 10:53:10,097 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:53:10,098 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:53:10,214 INFO] src.backtester: Backtest [M15]: Sharpe=-2.870 | MaxDD=0.136 | WR=0.352 | Return=-11.5% | Trades=250
[2026-05-18 10:53:10,214 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[ 30/70] Best Score: -0.500 | ETA: 1h 0m RAM: 59%
Best trial: 4. Best value: -0.5: 43%|█████████████████████████████████ | 30/70 [45:01<58:36, 87.92s/it][2026-05-18 10:54:23,361 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:54:23,361 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:54:23,361 INFO] src.engine_hmm: Bull 0.9557 0.0109 0.0006 0.0328
[2026-05-18 10:54:23,362 INFO] src.engine_hmm: Bear 0.0324 0.9662 0.0003 0.0011
[2026-05-18 10:54:23,362 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9743 0.0238
[2026-05-18 10:54:23,362 INFO] src.engine_hmm: Chop_High 0.0241 0.0017 0.0259 0.9483
[2026-05-18 10:54:23,362 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:54:23,362 INFO] src.engine_hmm: Bull: return=0.053844, vol=0.382612, rsi_slope=0.001153
[2026-05-18 10:54:23,363 INFO] src.engine_hmm: Bear: return=-0.155333, vol=1.892129, rsi_slope=0.008701
[2026-05-18 10:54:23,363 INFO] src.engine_hmm: Chop_Low: return=-0.018932, vol=-0.670964, rsi_slope=0.000098
[2026-05-18 10:54:23,363 INFO] src.engine_hmm: Chop_High: return=0.027112, vol=-0.247274, rsi_slope=-0.003931
[2026-05-18 10:54:23,365 INFO] src.engine_hmm: Total regime transitions: 9517
[2026-05-18 10:54:23,366 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:54:23,366 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:54:23,366 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:54:23,366 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:54:23,367 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:54:23,367 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:54:23,367 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:54:23,367 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:54:23,368 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:54:23,368 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:54:23,534 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:54:23,552 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:54:23,667 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:54:23,668 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.19525176), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11873579), 'atr_normalized': np.float32(0.11546681), 'prev_log_return': np.float32(0.13002193), 'usdchf_log_return': np.float32(0.09091161), 'xagusd_log_return': np.float32(0.10756942), 'xtiusd_log_return': np.float32(0.118392274), 'synth_vix_zscore': np.float32(0.123650394)}
[2026-05-18 10:54:23,668 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:54:23,776 INFO] src.engine_xgb: XGB Train Acc: 0.5024 | Test Acc: 0.5167
[2026-05-18 10:54:23,776 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1143464), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.17506702), 'atr_normalized': np.float32(0.1118596), 'prev_log_return': np.float32(0.13127021), 'usdchf_log_return': np.float32(0.12619607), 'xagusd_log_return': np.float32(0.11378931), 'xtiusd_log_return': np.float32(0.10588977), 'synth_vix_zscore': np.float32(0.1215816)}
[2026-05-18 10:54:23,776 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:54:23,985 INFO] src.engine_xgb: XGB Train Acc: 0.5282 | Test Acc: 0.5002
[2026-05-18 10:54:23,986 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11423266), 'gmm_vol_cluster': np.float32(0.10706967), 'rsi_slope': np.float32(0.116720945), 'atr_normalized': np.float32(0.117359206), 'prev_log_return': np.float32(0.11788506), 'usdchf_log_return': np.float32(0.10728104), 'xagusd_log_return': np.float32(0.09888199), 'xtiusd_log_return': np.float32(0.11023343), 'synth_vix_zscore': np.float32(0.11033599)}
[2026-05-18 10:54:23,987 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:54:23,987 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:54:24,408 INFO] src.backtester: Backtest [M15]: Sharpe=-3.506 | MaxDD=0.489 | WR=0.353 | Return=-38.5% | Trades=730
[2026-05-18 10:54:24,409 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:54:24,690 INFO] src.engine_xgb: XGB Train Acc: 0.4927 | Test Acc: 0.4586
[2026-05-18 10:54:24,690 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14466286), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1327095), 'atr_normalized': np.float32(0.11402573), 'prev_log_return': np.float32(0.14166488), 'usdchf_log_return': np.float32(0.11599657), 'xagusd_log_return': np.float32(0.10860345), 'xtiusd_log_return': np.float32(0.13845727), 'synth_vix_zscore': np.float32(0.10387975)}
[2026-05-18 10:54:24,690 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:54:24,868 INFO] src.engine_xgb: XGB Train Acc: 0.4871 | Test Acc: 0.4579
[2026-05-18 10:54:24,868 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.086108245), 'gmm_vol_cluster': np.float32(0.21327451), 'rsi_slope': np.float32(0.12296857), 'atr_normalized': np.float32(0.08459618), 'prev_log_return': np.float32(0.11372069), 'usdchf_log_return': np.float32(0.08433445), 'xagusd_log_return': np.float32(0.102281615), 'xtiusd_log_return': np.float32(0.08818471), 'synth_vix_zscore': np.float32(0.104531065)}
[2026-05-18 10:54:24,869 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:54:25,064 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 10:54:25,064 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.078264505), 'gmm_vol_cluster': np.float32(0.122160204), 'rsi_slope': np.float32(0.13490067), 'atr_normalized': np.float32(0.0927665), 'prev_log_return': np.float32(0.13982522), 'usdchf_log_return': np.float32(0.097213395), 'xagusd_log_return': np.float32(0.11044689), 'xtiusd_log_return': np.float32(0.09319842), 'synth_vix_zscore': np.float32(0.1312242)}
[2026-05-18 10:54:25,065 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:54:25,066 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:54:25,430 INFO] src.backtester: Backtest [M15]: Sharpe=-4.049 | MaxDD=0.356 | WR=0.326 | Return=-29.5% | Trades=482
[2026-05-18 10:54:25,430 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:54:25,686 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 10:54:25,686 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12372118), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15451123), 'atr_normalized': np.float32(0.119400725), 'prev_log_return': np.float32(0.15089522), 'usdchf_log_return': np.float32(0.12385143), 'xagusd_log_return': np.float32(0.12699005), 'xtiusd_log_return': np.float32(0.101817235), 'synth_vix_zscore': np.float32(0.09881292)}
[2026-05-18 10:54:25,687 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:54:25,941 INFO] src.engine_xgb: XGB Train Acc: 0.4932 | Test Acc: 0.5139
[2026-05-18 10:54:25,942 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0935613), 'gmm_vol_cluster': np.float32(0.088170014), 'rsi_slope': np.float32(0.13635275), 'atr_normalized': np.float32(0.10252062), 'prev_log_return': np.float32(0.13167715), 'usdchf_log_return': np.float32(0.10181718), 'xagusd_log_return': np.float32(0.12605627), 'xtiusd_log_return': np.float32(0.1100563), 'synth_vix_zscore': np.float32(0.10978837)}
[2026-05-18 10:54:25,942 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:54:26,225 INFO] src.engine_xgb: XGB Train Acc: 0.4947 | Test Acc: 0.5016
[2026-05-18 10:54:26,225 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.116712086), 'gmm_vol_cluster': np.float32(0.12541898), 'rsi_slope': np.float32(0.12340954), 'atr_normalized': np.float32(0.09403491), 'prev_log_return': np.float32(0.12351126), 'usdchf_log_return': np.float32(0.097199515), 'xagusd_log_return': np.float32(0.11193649), 'xtiusd_log_return': np.float32(0.0915468), 'synth_vix_zscore': np.float32(0.11623045)}
[2026-05-18 10:54:26,225 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:54:26,226 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:54:26,631 INFO] src.backtester: Backtest [M15]: Sharpe=-5.807 | MaxDD=0.659 | WR=0.303 | Return=-47.9% | Trades=699
[2026-05-18 10:54:26,632 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:54:26,926 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:54:26,927 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16302674), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1433269), 'atr_normalized': np.float32(0.11486847), 'prev_log_return': np.float32(0.15314405), 'usdchf_log_return': np.float32(0.113362156), 'xagusd_log_return': np.float32(0.10899113), 'xtiusd_log_return': np.float32(0.102777295), 'synth_vix_zscore': np.float32(0.100503206)}
[2026-05-18 10:54:26,927 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:54:27,220 INFO] src.engine_xgb: XGB Train Acc: 0.4879 | Test Acc: 0.4652
[2026-05-18 10:54:27,220 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11889807), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15296637), 'atr_normalized': np.float32(0.114273794), 'prev_log_return': np.float32(0.14272618), 'usdchf_log_return': np.float32(0.11114362), 'xagusd_log_return': np.float32(0.11643076), 'xtiusd_log_return': np.float32(0.109117284), 'synth_vix_zscore': np.float32(0.13444388)}
[2026-05-18 10:54:27,221 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:54:27,589 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 10:54:27,589 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09943279), 'gmm_vol_cluster': np.float32(0.11123746), 'rsi_slope': np.float32(0.12880789), 'atr_normalized': np.float32(0.10178724), 'prev_log_return': np.float32(0.12163504), 'usdchf_log_return': np.float32(0.10778099), 'xagusd_log_return': np.float32(0.10684228), 'xtiusd_log_return': np.float32(0.10024211), 'synth_vix_zscore': np.float32(0.12223424)}
[2026-05-18 10:54:27,590 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:54:27,591 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:54:27,730 INFO] src.backtester: Backtest [M15]: Sharpe=-4.143 | MaxDD=0.321 | WR=0.352 | Return=-21.6% | Trades=418
[2026-05-18 10:54:27,730 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 44%|██████████████████████████████████ | 31/70 [46:18<55:07, 84.80s/it][2026-05-18 10:55:57,533 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:55:57,534 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:55:57,534 INFO] src.engine_hmm: Bull 0.9557 0.0109 0.0006 0.0328
[2026-05-18 10:55:57,534 INFO] src.engine_hmm: Bear 0.0319 0.9666 0.0003 0.0012
[2026-05-18 10:55:57,534 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0236
[2026-05-18 10:55:57,534 INFO] src.engine_hmm: Chop_High 0.0242 0.0016 0.0260 0.9482
[2026-05-18 10:55:57,534 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:55:57,534 INFO] src.engine_hmm: Bull: return=0.052232, vol=0.383136, rsi_slope=0.000754
[2026-05-18 10:55:57,534 INFO] src.engine_hmm: Bear: return=-0.151923, vol=1.880266, rsi_slope=0.009419
[2026-05-18 10:55:57,534 INFO] src.engine_hmm: Chop_Low: return=-0.019787, vol=-0.670115, rsi_slope=0.000294
[2026-05-18 10:55:57,534 INFO] src.engine_hmm: Chop_High: return=0.028809, vol=-0.245976, rsi_slope=-0.004081
[2026-05-18 10:55:57,536 INFO] src.engine_hmm: Total regime transitions: 9496
[2026-05-18 10:55:57,537 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:55:57,537 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:55:57,537 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:55:57,537 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:55:57,538 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:55:57,538 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:55:57,538 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:55:57,538 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:55:57,539 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:55:57,539 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:55:57,713 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:55:57,728 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:55:57,846 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:55:57,847 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.19167341), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.114799894), 'atr_normalized': np.float32(0.116310015), 'prev_log_return': np.float32(0.13294968), 'usdchf_log_return': np.float32(0.11551505), 'xagusd_log_return': np.float32(0.10535182), 'xtiusd_log_return': np.float32(0.10323828), 'synth_vix_zscore': np.float32(0.12016192)}
[2026-05-18 10:55:57,847 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:55:57,955 INFO] src.engine_xgb: XGB Train Acc: 0.5119 | Test Acc: 0.5167
[2026-05-18 10:55:57,956 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1107291), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1771683), 'atr_normalized': np.float32(0.116564885), 'prev_log_return': np.float32(0.11671999), 'usdchf_log_return': np.float32(0.12008257), 'xagusd_log_return': np.float32(0.11696937), 'xtiusd_log_return': np.float32(0.120080814), 'synth_vix_zscore': np.float32(0.12168501)}
[2026-05-18 10:55:57,956 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:55:58,108 INFO] src.engine_xgb: XGB Train Acc: 0.5265 | Test Acc: 0.4893
[2026-05-18 10:55:58,109 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1061735), 'gmm_vol_cluster': np.float32(0.11722049), 'rsi_slope': np.float32(0.11526527), 'atr_normalized': np.float32(0.11270699), 'prev_log_return': np.float32(0.12204433), 'usdchf_log_return': np.float32(0.107854925), 'xagusd_log_return': np.float32(0.11304426), 'xtiusd_log_return': np.float32(0.10224132), 'synth_vix_zscore': np.float32(0.10344891)}
[2026-05-18 10:55:58,109 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:55:58,110 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:55:58,440 INFO] src.backtester: Backtest [M15]: Sharpe=-2.025 | MaxDD=0.178 | WR=0.354 | Return=-16.1% | Trades=285
[2026-05-18 10:55:58,441 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:55:58,668 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 10:55:58,668 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15553917), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13710636), 'atr_normalized': np.float32(0.11893794), 'prev_log_return': np.float32(0.13682556), 'usdchf_log_return': np.float32(0.110876836), 'xagusd_log_return': np.float32(0.11375906), 'xtiusd_log_return': np.float32(0.11182364), 'synth_vix_zscore': np.float32(0.115131505)}
[2026-05-18 10:55:58,669 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:55:58,889 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4746
[2026-05-18 10:55:58,890 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09525045), 'gmm_vol_cluster': np.float32(0.13460425), 'rsi_slope': np.float32(0.12540752), 'atr_normalized': np.float32(0.10313877), 'prev_log_return': np.float32(0.124280296), 'usdchf_log_return': np.float32(0.101389155), 'xagusd_log_return': np.float32(0.10302762), 'xtiusd_log_return': np.float32(0.10608903), 'synth_vix_zscore': np.float32(0.10681291)}
[2026-05-18 10:55:58,890 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:55:59,057 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 10:55:59,058 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0765415), 'gmm_vol_cluster': np.float32(0.09556954), 'rsi_slope': np.float32(0.13055414), 'atr_normalized': np.float32(0.09912001), 'prev_log_return': np.float32(0.13370718), 'usdchf_log_return': np.float32(0.10469313), 'xagusd_log_return': np.float32(0.12107472), 'xtiusd_log_return': np.float32(0.10692885), 'synth_vix_zscore': np.float32(0.13181092)}
[2026-05-18 10:55:59,058 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:55:59,060 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:55:59,371 INFO] src.backtester: Backtest [M15]: Sharpe=0.000 | MaxDD=0.000 | WR=0.000 | Return=0.0% | Trades=0
[2026-05-18 10:55:59,372 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:55:59,623 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 10:55:59,624 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10941401), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14332928), 'atr_normalized': np.float32(0.12733045), 'prev_log_return': np.float32(0.14600265), 'usdchf_log_return': np.float32(0.11886976), 'xagusd_log_return': np.float32(0.12832609), 'xtiusd_log_return': np.float32(0.09997272), 'synth_vix_zscore': np.float32(0.12675504)}
[2026-05-18 10:55:59,624 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:55:59,883 INFO] src.engine_xgb: XGB Train Acc: 0.5076 | Test Acc: 0.5115
[2026-05-18 10:55:59,883 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10708923), 'gmm_vol_cluster': np.float32(0.07809403), 'rsi_slope': np.float32(0.13512814), 'atr_normalized': np.float32(0.115937546), 'prev_log_return': np.float32(0.12341691), 'usdchf_log_return': np.float32(0.1018095), 'xagusd_log_return': np.float32(0.12392197), 'xtiusd_log_return': np.float32(0.114792556), 'synth_vix_zscore': np.float32(0.09981015)}
[2026-05-18 10:55:59,884 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:56:00,181 INFO] src.engine_xgb: XGB Train Acc: 0.5046 | Test Acc: 0.5016
[2026-05-18 10:56:00,181 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11147533), 'gmm_vol_cluster': np.float32(0.084799215), 'rsi_slope': np.float32(0.12715796), 'atr_normalized': np.float32(0.10657435), 'prev_log_return': np.float32(0.11443063), 'usdchf_log_return': np.float32(0.11066986), 'xagusd_log_return': np.float32(0.117270045), 'xtiusd_log_return': np.float32(0.103712805), 'synth_vix_zscore': np.float32(0.12390979)}
[2026-05-18 10:56:00,182 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:56:00,183 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:56:00,499 INFO] src.backtester: Backtest [M15]: Sharpe=-0.921 | MaxDD=0.024 | WR=0.353 | Return=-2.1% | Trades=34
[2026-05-18 10:56:00,499 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:56:00,817 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:56:00,818 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12919427), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14076565), 'atr_normalized': np.float32(0.11562476), 'prev_log_return': np.float32(0.14500742), 'usdchf_log_return': np.float32(0.115683325), 'xagusd_log_return': np.float32(0.11498312), 'xtiusd_log_return': np.float32(0.11752713), 'synth_vix_zscore': np.float32(0.12121426)}
[2026-05-18 10:56:00,819 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:56:01,225 INFO] src.engine_xgb: XGB Train Acc: 0.5095 | Test Acc: 0.4759
[2026-05-18 10:56:01,226 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10330071), 'gmm_vol_cluster': np.float32(0.096248165), 'rsi_slope': np.float32(0.131829), 'atr_normalized': np.float32(0.10837225), 'prev_log_return': np.float32(0.12247772), 'usdchf_log_return': np.float32(0.10778174), 'xagusd_log_return': np.float32(0.11154141), 'xtiusd_log_return': np.float32(0.10302121), 'synth_vix_zscore': np.float32(0.11542781)}
[2026-05-18 10:56:01,226 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:56:01,679 INFO] src.engine_xgb: XGB Train Acc: 0.5157 | Test Acc: 0.4853
[2026-05-18 10:56:01,679 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10486092), 'gmm_vol_cluster': np.float32(0.100691095), 'rsi_slope': np.float32(0.13116552), 'atr_normalized': np.float32(0.106113404), 'prev_log_return': np.float32(0.11733982), 'usdchf_log_return': np.float32(0.10646071), 'xagusd_log_return': np.float32(0.11097624), 'xtiusd_log_return': np.float32(0.10533363), 'synth_vix_zscore': np.float32(0.11705871)}
[2026-05-18 10:56:01,680 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:56:01,681 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:56:01,796 INFO] src.backtester: Backtest [M15]: Sharpe=-2.856 | MaxDD=0.103 | WR=0.366 | Return=-9.0% | Trades=134
[2026-05-18 10:56:01,796 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 46%|███████████████████████████████████▏ | 32/70 [47:52<55:27, 87.58s/it][2026-05-18 10:57:31,048 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:57:31,049 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:57:31,049 INFO] src.engine_hmm: Bull 0.9557 0.0109 0.0006 0.0328
[2026-05-18 10:57:31,049 INFO] src.engine_hmm: Bear 0.0319 0.9666 0.0003 0.0012
[2026-05-18 10:57:31,049 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0236
[2026-05-18 10:57:31,050 INFO] src.engine_hmm: Chop_High 0.0242 0.0016 0.0260 0.9482
[2026-05-18 10:57:31,050 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:57:31,050 INFO] src.engine_hmm: Bull: return=0.052283, vol=0.383187, rsi_slope=0.000786
[2026-05-18 10:57:31,050 INFO] src.engine_hmm: Bear: return=-0.152253, vol=1.881243, rsi_slope=0.009367
[2026-05-18 10:57:31,050 INFO] src.engine_hmm: Chop_Low: return=-0.019694, vol=-0.670153, rsi_slope=0.000278
[2026-05-18 10:57:31,050 INFO] src.engine_hmm: Chop_High: return=0.028733, vol=-0.246012, rsi_slope=-0.004070
[2026-05-18 10:57:31,053 INFO] src.engine_hmm: Total regime transitions: 9494
[2026-05-18 10:57:31,054 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:57:31,054 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:57:31,055 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:57:31,055 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:57:31,056 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:57:31,056 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:57:31,056 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:57:31,056 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:57:31,057 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:57:31,057 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:57:31,240 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:57:31,257 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:57:31,378 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:57:31,378 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.22707114), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.10281792), 'atr_normalized': np.float32(0.10933221), 'prev_log_return': np.float32(0.1251183), 'usdchf_log_return': np.float32(0.10714308), 'xagusd_log_return': np.float32(0.100210875), 'xtiusd_log_return': np.float32(0.11528279), 'synth_vix_zscore': np.float32(0.11302368)}
[2026-05-18 10:57:31,379 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:57:31,473 INFO] src.engine_xgb: XGB Train Acc: 0.5076 | Test Acc: 0.5103
[2026-05-18 10:57:31,474 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.118767686), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.17447959), 'atr_normalized': np.float32(0.13477217), 'prev_log_return': np.float32(0.111574836), 'usdchf_log_return': np.float32(0.12583503), 'xagusd_log_return': np.float32(0.10939857), 'xtiusd_log_return': np.float32(0.11311077), 'synth_vix_zscore': np.float32(0.112061344)}
[2026-05-18 10:57:31,474 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:57:31,594 INFO] src.engine_xgb: XGB Train Acc: 0.5163 | Test Acc: 0.4998
[2026-05-18 10:57:31,595 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11873172), 'gmm_vol_cluster': np.float32(0.12492803), 'rsi_slope': np.float32(0.10956397), 'atr_normalized': np.float32(0.10417838), 'prev_log_return': np.float32(0.12523413), 'usdchf_log_return': np.float32(0.10672798), 'xagusd_log_return': np.float32(0.10794752), 'xtiusd_log_return': np.float32(0.10103072), 'synth_vix_zscore': np.float32(0.10165754)}
[2026-05-18 10:57:31,595 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:57:31,597 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:57:31,932 INFO] src.backtester: Backtest [M15]: Sharpe=-1.002 | MaxDD=0.014 | WR=0.231 | Return=-1.3% | Trades=13
[2026-05-18 10:57:31,932 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:57:32,187 INFO] src.engine_xgb: XGB Train Acc: 0.4922 | Test Acc: 0.4570
[2026-05-18 10:57:32,188 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15060417), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13756336), 'atr_normalized': np.float32(0.12116204), 'prev_log_return': np.float32(0.14327908), 'usdchf_log_return': np.float32(0.114380985), 'xagusd_log_return': np.float32(0.111938655), 'xtiusd_log_return': np.float32(0.11107878), 'synth_vix_zscore': np.float32(0.10999292)}
[2026-05-18 10:57:32,189 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:57:32,399 INFO] src.engine_xgb: XGB Train Acc: 0.5344 | Test Acc: 0.4899
[2026-05-18 10:57:32,400 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0930709), 'gmm_vol_cluster': np.float32(0.20046471), 'rsi_slope': np.float32(0.11420545), 'atr_normalized': np.float32(0.093380764), 'prev_log_return': np.float32(0.10845658), 'usdchf_log_return': np.float32(0.09165965), 'xagusd_log_return': np.float32(0.10159163), 'xtiusd_log_return': np.float32(0.096361086), 'synth_vix_zscore': np.float32(0.10080921)}
[2026-05-18 10:57:32,401 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:57:32,610 INFO] src.engine_xgb: XGB Train Acc: 0.5152 | Test Acc: 0.5038
[2026-05-18 10:57:32,611 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0656003), 'gmm_vol_cluster': np.float32(0.10681331), 'rsi_slope': np.float32(0.12563044), 'atr_normalized': np.float32(0.10772834), 'prev_log_return': np.float32(0.13360387), 'usdchf_log_return': np.float32(0.10124369), 'xagusd_log_return': np.float32(0.12478895), 'xtiusd_log_return': np.float32(0.1118688), 'synth_vix_zscore': np.float32(0.12272235)}
[2026-05-18 10:57:32,611 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:57:32,612 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:57:32,941 INFO] src.backtester: Backtest [M15]: Sharpe=0.000 | MaxDD=0.000 | WR=0.000 | Return=0.0% | Trades=0
[2026-05-18 10:57:32,942 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:57:33,233 INFO] src.engine_xgb: XGB Train Acc: 0.4956 | Test Acc: 0.4868
[2026-05-18 10:57:33,233 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10598222), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14252363), 'atr_normalized': np.float32(0.13617025), 'prev_log_return': np.float32(0.14901008), 'usdchf_log_return': np.float32(0.115643546), 'xagusd_log_return': np.float32(0.11486005), 'xtiusd_log_return': np.float32(0.10791684), 'synth_vix_zscore': np.float32(0.12789339)}
[2026-05-18 10:57:33,234 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:57:33,489 INFO] src.engine_xgb: XGB Train Acc: 0.5136 | Test Acc: 0.5108
[2026-05-18 10:57:33,490 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10604858), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14601034), 'atr_normalized': np.float32(0.12654132), 'prev_log_return': np.float32(0.14393486), 'usdchf_log_return': np.float32(0.10872157), 'xagusd_log_return': np.float32(0.13104528), 'xtiusd_log_return': np.float32(0.12406285), 'synth_vix_zscore': np.float32(0.113635205)}
[2026-05-18 10:57:33,490 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:57:33,912 INFO] src.engine_xgb: XGB Train Acc: 0.5401 | Test Acc: 0.5106
[2026-05-18 10:57:33,912 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1207076), 'gmm_vol_cluster': np.float32(0.08395051), 'rsi_slope': np.float32(0.12548095), 'atr_normalized': np.float32(0.10146315), 'prev_log_return': np.float32(0.118102245), 'usdchf_log_return': np.float32(0.11204039), 'xagusd_log_return': np.float32(0.118150584), 'xtiusd_log_return': np.float32(0.10263548), 'synth_vix_zscore': np.float32(0.11746909)}
[2026-05-18 10:57:33,913 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:57:33,914 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:57:34,260 INFO] src.backtester: Backtest [M15]: Sharpe=-1.757 | MaxDD=0.072 | WR=0.346 | Return=-6.9% | Trades=78
[2026-05-18 10:57:34,260 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:57:34,545 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:57:34,546 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.124109045), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15423283), 'atr_normalized': np.float32(0.11022712), 'prev_log_return': np.float32(0.14976393), 'usdchf_log_return': np.float32(0.121601455), 'xagusd_log_return': np.float32(0.116413325), 'xtiusd_log_return': np.float32(0.113695584), 'synth_vix_zscore': np.float32(0.109956734)}
[2026-05-18 10:57:34,546 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:57:34,895 INFO] src.engine_xgb: XGB Train Acc: 0.5175 | Test Acc: 0.4822
[2026-05-18 10:57:34,896 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.095963806), 'gmm_vol_cluster': np.float32(0.14840876), 'rsi_slope': np.float32(0.12809657), 'atr_normalized': np.float32(0.10516983), 'prev_log_return': np.float32(0.1133426), 'usdchf_log_return': np.float32(0.09656366), 'xagusd_log_return': np.float32(0.09636896), 'xtiusd_log_return': np.float32(0.0988603), 'synth_vix_zscore': np.float32(0.11722546)}
[2026-05-18 10:57:34,896 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:57:35,214 INFO] src.engine_xgb: XGB Train Acc: 0.5108 | Test Acc: 0.4848
[2026-05-18 10:57:35,214 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.100693755), 'gmm_vol_cluster': np.float32(0.10088854), 'rsi_slope': np.float32(0.12634252), 'atr_normalized': np.float32(0.10229133), 'prev_log_return': np.float32(0.12153806), 'usdchf_log_return': np.float32(0.104556285), 'xagusd_log_return': np.float32(0.11383691), 'xtiusd_log_return': np.float32(0.102554634), 'synth_vix_zscore': np.float32(0.12729795)}
[2026-05-18 10:57:35,215 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:57:35,216 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:57:35,315 INFO] src.backtester: Backtest [M15]: Sharpe=-1.651 | MaxDD=0.003 | WR=0.000 | Return=-0.3% | Trades=1
[2026-05-18 10:57:35,316 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 47%|████████████████████████████████████▎ | 33/70 [49:26<55:06, 89.35s/it][2026-05-18 10:59:05,138 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 10:59:05,138 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 10:59:05,138 INFO] src.engine_hmm: Bull 0.9557 0.0109 0.0006 0.0328
[2026-05-18 10:59:05,138 INFO] src.engine_hmm: Bear 0.0319 0.9666 0.0003 0.0012
[2026-05-18 10:59:05,139 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0236
[2026-05-18 10:59:05,139 INFO] src.engine_hmm: Chop_High 0.0242 0.0016 0.0260 0.9482
[2026-05-18 10:59:05,139 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 10:59:05,139 INFO] src.engine_hmm: Bull: return=0.052251, vol=0.383142, rsi_slope=0.000764
[2026-05-18 10:59:05,139 INFO] src.engine_hmm: Bear: return=-0.152015, vol=1.880553, rsi_slope=0.009403
[2026-05-18 10:59:05,139 INFO] src.engine_hmm: Chop_Low: return=-0.019757, vol=-0.670127, rsi_slope=0.000289
[2026-05-18 10:59:05,139 INFO] src.engine_hmm: Chop_High: return=0.028780, vol=-0.245990, rsi_slope=-0.004077
[2026-05-18 10:59:05,141 INFO] src.engine_hmm: Total regime transitions: 9494
[2026-05-18 10:59:05,141 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 10:59:05,142 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 10:59:05,142 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 10:59:05,142 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 10:59:05,143 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 10:59:05,143 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 10:59:05,143 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 10:59:05,143 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 10:59:05,144 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 10:59:05,144 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 10:59:05,312 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:59:05,327 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:59:05,454 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 10:59:05,454 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16257863), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12844495), 'atr_normalized': np.float32(0.12571782), 'prev_log_return': np.float32(0.121268064), 'usdchf_log_return': np.float32(0.115356594), 'xagusd_log_return': np.float32(0.10278037), 'xtiusd_log_return': np.float32(0.12543733), 'synth_vix_zscore': np.float32(0.11841619)}
[2026-05-18 10:59:05,455 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 10:59:05,637 INFO] src.engine_xgb: XGB Train Acc: 0.4962 | Test Acc: 0.5175
[2026-05-18 10:59:05,638 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10671319), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.17345308), 'atr_normalized': np.float32(0.11853895), 'prev_log_return': np.float32(0.12664264), 'usdchf_log_return': np.float32(0.12262097), 'xagusd_log_return': np.float32(0.11791625), 'xtiusd_log_return': np.float32(0.10825833), 'synth_vix_zscore': np.float32(0.12585664)}
[2026-05-18 10:59:05,638 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 10:59:05,914 INFO] src.engine_xgb: XGB Train Acc: 0.4954 | Test Acc: 0.4893
[2026-05-18 10:59:05,914 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09449013), 'gmm_vol_cluster': np.float32(0.12305828), 'rsi_slope': np.float32(0.11174512), 'atr_normalized': np.float32(0.10862163), 'prev_log_return': np.float32(0.11743292), 'usdchf_log_return': np.float32(0.10850274), 'xagusd_log_return': np.float32(0.110310145), 'xtiusd_log_return': np.float32(0.11459911), 'synth_vix_zscore': np.float32(0.111239895)}
[2026-05-18 10:59:05,915 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 10:59:05,916 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:59:06,339 INFO] src.backtester: Backtest [M15]: Sharpe=-4.848 | MaxDD=0.813 | WR=0.366 | Return=-55.5% | Trades=1015
[2026-05-18 10:59:06,340 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:59:06,735 INFO] src.engine_xgb: XGB Train Acc: 0.4918 | Test Acc: 0.4574
[2026-05-18 10:59:06,735 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14666308), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1289299), 'atr_normalized': np.float32(0.12879153), 'prev_log_return': np.float32(0.12828912), 'usdchf_log_return': np.float32(0.1099511), 'xagusd_log_return': np.float32(0.109979436), 'xtiusd_log_return': np.float32(0.12605375), 'synth_vix_zscore': np.float32(0.121342055)}
[2026-05-18 10:59:06,736 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 10:59:07,120 INFO] src.engine_xgb: XGB Train Acc: 0.4882 | Test Acc: 0.4577
[2026-05-18 10:59:07,121 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10325204), 'gmm_vol_cluster': np.float32(0.15405369), 'rsi_slope': np.float32(0.116178304), 'atr_normalized': np.float32(0.095471665), 'prev_log_return': np.float32(0.11751365), 'usdchf_log_return': np.float32(0.09867032), 'xagusd_log_return': np.float32(0.10499179), 'xtiusd_log_return': np.float32(0.104189284), 'synth_vix_zscore': np.float32(0.10567923)}
[2026-05-18 10:59:07,122 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 10:59:07,395 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 10:59:07,396 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08791457), 'gmm_vol_cluster': np.float32(0.10579709), 'rsi_slope': np.float32(0.13341552), 'atr_normalized': np.float32(0.09814715), 'prev_log_return': np.float32(0.12910049), 'usdchf_log_return': np.float32(0.108824424), 'xagusd_log_return': np.float32(0.114053786), 'xtiusd_log_return': np.float32(0.09554491), 'synth_vix_zscore': np.float32(0.12720206)}
[2026-05-18 10:59:07,396 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 10:59:07,398 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:59:07,830 INFO] src.backtester: Backtest [M15]: Sharpe=-5.376 | MaxDD=0.648 | WR=0.344 | Return=-47.6% | Trades=906
[2026-05-18 10:59:07,830 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:59:08,103 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 10:59:08,104 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1424638), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.139651), 'atr_normalized': np.float32(0.119165145), 'prev_log_return': np.float32(0.13941537), 'usdchf_log_return': np.float32(0.11648674), 'xagusd_log_return': np.float32(0.12620212), 'xtiusd_log_return': np.float32(0.10164082), 'synth_vix_zscore': np.float32(0.11497505)}
[2026-05-18 10:59:08,104 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 10:59:08,490 INFO] src.engine_xgb: XGB Train Acc: 0.4910 | Test Acc: 0.5131
[2026-05-18 10:59:08,490 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.098244734), 'gmm_vol_cluster': np.float32(0.078616396), 'rsi_slope': np.float32(0.1413915), 'atr_normalized': np.float32(0.1092916), 'prev_log_return': np.float32(0.12851341), 'usdchf_log_return': np.float32(0.10338484), 'xagusd_log_return': np.float32(0.120015115), 'xtiusd_log_return': np.float32(0.11091202), 'synth_vix_zscore': np.float32(0.10963041)}
[2026-05-18 10:59:08,491 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 10:59:09,073 INFO] src.engine_xgb: XGB Train Acc: 0.4947 | Test Acc: 0.5015
[2026-05-18 10:59:09,074 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.113505095), 'gmm_vol_cluster': np.float32(0.09463868), 'rsi_slope': np.float32(0.12180533), 'atr_normalized': np.float32(0.107649736), 'prev_log_return': np.float32(0.11715184), 'usdchf_log_return': np.float32(0.10937151), 'xagusd_log_return': np.float32(0.10954548), 'xtiusd_log_return': np.float32(0.10951408), 'synth_vix_zscore': np.float32(0.11681827)}
[2026-05-18 10:59:09,075 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 10:59:09,076 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:59:09,497 INFO] src.backtester: Backtest [M15]: Sharpe=-6.205 | MaxDD=0.878 | WR=0.344 | Return=-58.3% | Trades=1045
[2026-05-18 10:59:09,497 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 10:59:09,757 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 10:59:09,757 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13057859), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.17703576), 'atr_normalized': np.float32(0.12079519), 'prev_log_return': np.float32(0.13735737), 'usdchf_log_return': np.float32(0.11655082), 'xagusd_log_return': np.float32(0.106846), 'xtiusd_log_return': np.float32(0.10265376), 'synth_vix_zscore': np.float32(0.10818261)}
[2026-05-18 10:59:09,758 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 10:59:10,202 INFO] src.engine_xgb: XGB Train Acc: 0.4877 | Test Acc: 0.4652
[2026-05-18 10:59:10,203 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10430117), 'gmm_vol_cluster': np.float32(0.10265316), 'rsi_slope': np.float32(0.13392332), 'atr_normalized': np.float32(0.10979668), 'prev_log_return': np.float32(0.124251686), 'usdchf_log_return': np.float32(0.10862021), 'xagusd_log_return': np.float32(0.098069966), 'xtiusd_log_return': np.float32(0.10340225), 'synth_vix_zscore': np.float32(0.11498157)}
[2026-05-18 10:59:10,203 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 10:59:10,683 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 10:59:10,684 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.118782304), 'gmm_vol_cluster': np.float32(0.093861334), 'rsi_slope': np.float32(0.13695161), 'atr_normalized': np.float32(0.1063417), 'prev_log_return': np.float32(0.11770253), 'usdchf_log_return': np.float32(0.10330084), 'xagusd_log_return': np.float32(0.10548255), 'xtiusd_log_return': np.float32(0.10076903), 'synth_vix_zscore': np.float32(0.11680809)}
[2026-05-18 10:59:10,684 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 10:59:10,685 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 10:59:10,833 INFO] src.backtester: Backtest [M15]: Sharpe=-5.988 | MaxDD=0.485 | WR=0.384 | Return=-37.3% | Trades=646
[2026-05-18 10:59:10,833 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 49%|█████████████████████████████████████▍ | 34/70 [51:01<54:43, 91.20s/it][2026-05-18 11:00:35,584 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:00:35,585 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:00:35,585 INFO] src.engine_hmm: Bull 0.9557 0.0109 0.0006 0.0328
[2026-05-18 11:00:35,585 INFO] src.engine_hmm: Bear 0.0321 0.9665 0.0003 0.0012
[2026-05-18 11:00:35,585 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0237
[2026-05-18 11:00:35,585 INFO] src.engine_hmm: Chop_High 0.0242 0.0016 0.0260 0.9482
[2026-05-18 11:00:35,586 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:00:35,586 INFO] src.engine_hmm: Bull: return=0.052786, vol=0.383244, rsi_slope=0.000908
[2026-05-18 11:00:35,586 INFO] src.engine_hmm: Bear: return=-0.153700, vol=1.885113, rsi_slope=0.009168
[2026-05-18 11:00:35,586 INFO] src.engine_hmm: Chop_Low: return=-0.019462, vol=-0.670340, rsi_slope=0.000215
[2026-05-18 11:00:35,586 INFO] src.engine_hmm: Chop_High: return=0.028374, vol=-0.246261, rsi_slope=-0.004026
[2026-05-18 11:00:35,588 INFO] src.engine_hmm: Total regime transitions: 9495
[2026-05-18 11:00:35,588 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 11:00:35,588 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 11:00:35,589 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 11:00:35,590 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 11:00:35,591 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 11:00:35,591 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 11:00:35,591 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 11:00:35,591 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 11:00:35,591 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 11:00:35,592 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 11:00:35,753 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:00:35,770 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:00:35,882 INFO] src.engine_xgb: XGB Train Acc: 0.4984 | Test Acc: 0.4782
[2026-05-18 11:00:35,882 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1888836), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11178013), 'atr_normalized': np.float32(0.12043806), 'prev_log_return': np.float32(0.12591916), 'usdchf_log_return': np.float32(0.111075975), 'xagusd_log_return': np.float32(0.10104056), 'xtiusd_log_return': np.float32(0.11336127), 'synth_vix_zscore': np.float32(0.12750131)}
[2026-05-18 11:00:35,883 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:00:35,960 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4829
[2026-05-18 11:00:35,960 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09998886), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1875657), 'atr_normalized': np.float32(0.13207471), 'prev_log_return': np.float32(0.115197), 'usdchf_log_return': np.float32(0.1194358), 'xagusd_log_return': np.float32(0.105982184), 'xtiusd_log_return': np.float32(0.12821993), 'synth_vix_zscore': np.float32(0.1115357)}
[2026-05-18 11:00:35,960 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:00:36,074 INFO] src.engine_xgb: XGB Train Acc: 0.5551 | Test Acc: 0.5218
[2026-05-18 11:00:36,075 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09690889), 'gmm_vol_cluster': np.float32(0.12331674), 'rsi_slope': np.float32(0.110012814), 'atr_normalized': np.float32(0.113221996), 'prev_log_return': np.float32(0.11868709), 'usdchf_log_return': np.float32(0.11438504), 'xagusd_log_return': np.float32(0.11318559), 'xtiusd_log_return': np.float32(0.09588355), 'synth_vix_zscore': np.float32(0.114398345)}
[2026-05-18 11:00:36,075 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:00:36,076 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:00:36,396 INFO] src.backtester: Backtest [M15]: Sharpe=-7.042 | MaxDD=0.673 | WR=0.355 | Return=-48.9% | Trades=963
[2026-05-18 11:00:36,396 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:00:36,665 INFO] src.engine_xgb: XGB Train Acc: 0.5499 | Test Acc: 0.5255
[2026-05-18 11:00:36,665 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13599612), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12433471), 'atr_normalized': np.float32(0.12701154), 'prev_log_return': np.float32(0.1325671), 'usdchf_log_return': np.float32(0.11778919), 'xagusd_log_return': np.float32(0.1127126), 'xtiusd_log_return': np.float32(0.12592009), 'synth_vix_zscore': np.float32(0.12366861)}
[2026-05-18 11:00:36,665 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:00:36,825 INFO] src.engine_xgb: XGB Train Acc: 0.5146 | Test Acc: 0.5417
[2026-05-18 11:00:36,826 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09068287), 'gmm_vol_cluster': np.float32(0.17800741), 'rsi_slope': np.float32(0.13135394), 'atr_normalized': np.float32(0.0938207), 'prev_log_return': np.float32(0.12152234), 'usdchf_log_return': np.float32(0.094478086), 'xagusd_log_return': np.float32(0.09529086), 'xtiusd_log_return': np.float32(0.093620054), 'synth_vix_zscore': np.float32(0.10122374)}
[2026-05-18 11:00:36,826 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:00:36,973 INFO] src.engine_xgb: XGB Train Acc: 0.5069 | Test Acc: 0.4997
[2026-05-18 11:00:36,974 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.07360565), 'gmm_vol_cluster': np.float32(0.06054883), 'rsi_slope': np.float32(0.1413515), 'atr_normalized': np.float32(0.11165644), 'prev_log_return': np.float32(0.14324999), 'usdchf_log_return': np.float32(0.10983725), 'xagusd_log_return': np.float32(0.13327505), 'xtiusd_log_return': np.float32(0.10480535), 'synth_vix_zscore': np.float32(0.121669896)}
[2026-05-18 11:00:36,975 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:00:36,976 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:00:37,291 INFO] src.backtester: Backtest [M15]: Sharpe=-1.500 | MaxDD=0.009 | WR=0.286 | Return=-0.9% | Trades=14
[2026-05-18 11:00:37,291 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:00:37,540 INFO] src.engine_xgb: XGB Train Acc: 0.5063 | Test Acc: 0.5116
[2026-05-18 11:00:37,541 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.101694964), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13964126), 'atr_normalized': np.float32(0.124489605), 'prev_log_return': np.float32(0.13568534), 'usdchf_log_return': np.float32(0.124194555), 'xagusd_log_return': np.float32(0.1463283), 'xtiusd_log_return': np.float32(0.10677999), 'synth_vix_zscore': np.float32(0.121185996)}
[2026-05-18 11:00:37,541 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:00:37,779 INFO] src.engine_xgb: XGB Train Acc: 0.5105 | Test Acc: 0.4871
[2026-05-18 11:00:37,780 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10538809), 'gmm_vol_cluster': np.float32(0.116049394), 'rsi_slope': np.float32(0.13225126), 'atr_normalized': np.float32(0.10337425), 'prev_log_return': np.float32(0.12286274), 'usdchf_log_return': np.float32(0.09918084), 'xagusd_log_return': np.float32(0.1139424), 'xtiusd_log_return': np.float32(0.101162784), 'synth_vix_zscore': np.float32(0.10578825)}
[2026-05-18 11:00:37,780 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:00:38,063 INFO] src.engine_xgb: XGB Train Acc: 0.5201 | Test Acc: 0.5047
[2026-05-18 11:00:38,063 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10300368), 'gmm_vol_cluster': np.float32(0.119607314), 'rsi_slope': np.float32(0.11718217), 'atr_normalized': np.float32(0.10716812), 'prev_log_return': np.float32(0.11191959), 'usdchf_log_return': np.float32(0.110816196), 'xagusd_log_return': np.float32(0.10511462), 'xtiusd_log_return': np.float32(0.09723642), 'synth_vix_zscore': np.float32(0.12795198)}
[2026-05-18 11:00:38,064 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:00:38,065 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:00:38,398 INFO] src.backtester: Backtest [M15]: Sharpe=-3.585 | MaxDD=0.108 | WR=0.316 | Return=-10.1% | Trades=98
[2026-05-18 11:00:38,398 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:00:38,715 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5433
[2026-05-18 11:00:38,716 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13285647), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15157887), 'atr_normalized': np.float32(0.121852815), 'prev_log_return': np.float32(0.14789058), 'usdchf_log_return': np.float32(0.12160289), 'xagusd_log_return': np.float32(0.10203214), 'xtiusd_log_return': np.float32(0.11219535), 'synth_vix_zscore': np.float32(0.10999088)}
[2026-05-18 11:00:38,716 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:00:39,094 INFO] src.engine_xgb: XGB Train Acc: 0.5323 | Test Acc: 0.5322
[2026-05-18 11:00:39,095 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11043053), 'gmm_vol_cluster': np.float32(0.10941172), 'rsi_slope': np.float32(0.12714395), 'atr_normalized': np.float32(0.099694364), 'prev_log_return': np.float32(0.11918223), 'usdchf_log_return': np.float32(0.10136691), 'xagusd_log_return': np.float32(0.10588772), 'xtiusd_log_return': np.float32(0.10864604), 'synth_vix_zscore': np.float32(0.11823657)}
[2026-05-18 11:00:39,096 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:00:39,414 INFO] src.engine_xgb: XGB Train Acc: 0.5310 | Test Acc: 0.5280
[2026-05-18 11:00:39,415 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12288175), 'gmm_vol_cluster': np.float32(0.11059251), 'rsi_slope': np.float32(0.119893454), 'atr_normalized': np.float32(0.09911213), 'prev_log_return': np.float32(0.1208273), 'usdchf_log_return': np.float32(0.10430115), 'xagusd_log_return': np.float32(0.10612969), 'xtiusd_log_return': np.float32(0.095532574), 'synth_vix_zscore': np.float32(0.120729476)}
[2026-05-18 11:00:39,416 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:00:39,417 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:00:39,520 INFO] src.backtester: Backtest [M15]: Sharpe=-5.281 | MaxDD=0.063 | WR=0.345 | Return=-6.0% | Trades=55
[2026-05-18 11:00:39,521 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[ 35/70] Best Score: -0.500 | ETA: 52m 30s RAM: 58%
Best trial: 4. Best value: -0.5: 50%|██████████████████████████████████████▌ | 35/70 [52:31<52:58, 90.82s/it][2026-05-18 11:02:13,892 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:02:13,892 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:02:13,892 INFO] src.engine_hmm: Bull 0.9552 0.0114 0.0007 0.0328
[2026-05-18 11:02:13,892 INFO] src.engine_hmm: Bear 0.0308 0.9674 0.0004 0.0014
[2026-05-18 11:02:13,892 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0237
[2026-05-18 11:02:13,893 INFO] src.engine_hmm: Chop_High 0.0246 0.0016 0.0261 0.9476
[2026-05-18 11:02:13,893 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:02:13,893 INFO] src.engine_hmm: Bull: return=0.057411, vol=0.367029, rsi_slope=-0.000146
[2026-05-18 11:02:13,893 INFO] src.engine_hmm: Bear: return=-0.145256, vol=1.820375, rsi_slope=0.010262
[2026-05-18 11:02:13,893 INFO] src.engine_hmm: Chop_Low: return=-0.023614, vol=-0.671244, rsi_slope=0.000667
[2026-05-18 11:02:13,893 INFO] src.engine_hmm: Chop_High: return=0.029153, vol=-0.250922, rsi_slope=-0.004242
[2026-05-18 11:02:13,895 INFO] src.engine_hmm: Total regime transitions: 9549
[2026-05-18 11:02:13,895 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 11:02:13,896 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:15:00: Bull -> Chop_High
[2026-05-18 11:02:13,896 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 11:02:13,896 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 11:02:13,896 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 11:02:13,896 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 11:02:13,897 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 11:02:13,897 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 11:02:13,897 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 11:02:13,897 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 11:02:14,056 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:02:14,073 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:02:14,188 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 11:02:14,188 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16524476), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11707578), 'atr_normalized': np.float32(0.12072905), 'prev_log_return': np.float32(0.12614521), 'usdchf_log_return': np.float32(0.1019895), 'xagusd_log_return': np.float32(0.10988559), 'xtiusd_log_return': np.float32(0.12340202), 'synth_vix_zscore': np.float32(0.13552804)}
[2026-05-18 11:02:14,189 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:02:14,304 INFO] src.engine_xgb: XGB Train Acc: 0.5238 | Test Acc: 0.5128
[2026-05-18 11:02:14,305 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11501525), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1650806), 'atr_normalized': np.float32(0.11919897), 'prev_log_return': np.float32(0.12502076), 'usdchf_log_return': np.float32(0.123273134), 'xagusd_log_return': np.float32(0.115836866), 'xtiusd_log_return': np.float32(0.11576932), 'synth_vix_zscore': np.float32(0.12080503)}
[2026-05-18 11:02:14,305 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:02:14,488 INFO] src.engine_xgb: XGB Train Acc: 0.5426 | Test Acc: 0.5016
[2026-05-18 11:02:14,489 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10449941), 'gmm_vol_cluster': np.float32(0.09681568), 'rsi_slope': np.float32(0.111319475), 'atr_normalized': np.float32(0.1118338), 'prev_log_return': np.float32(0.12815453), 'usdchf_log_return': np.float32(0.10819303), 'xagusd_log_return': np.float32(0.11204192), 'xtiusd_log_return': np.float32(0.11373309), 'synth_vix_zscore': np.float32(0.11340901)}
[2026-05-18 11:02:14,489 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:02:14,490 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:02:14,839 INFO] src.backtester: Backtest [M15]: Sharpe=-3.156 | MaxDD=0.362 | WR=0.348 | Return=-29.8% | Trades=465
[2026-05-18 11:02:14,839 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:02:15,063 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 11:02:15,063 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14201166), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13175595), 'atr_normalized': np.float32(0.12020507), 'prev_log_return': np.float32(0.14202777), 'usdchf_log_return': np.float32(0.10712461), 'xagusd_log_return': np.float32(0.12459748), 'xtiusd_log_return': np.float32(0.11648931), 'synth_vix_zscore': np.float32(0.11578817)}
[2026-05-18 11:02:15,064 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:02:15,267 INFO] src.engine_xgb: XGB Train Acc: 0.5143 | Test Acc: 0.4709
[2026-05-18 11:02:15,268 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09241696), 'gmm_vol_cluster': np.float32(0.18296747), 'rsi_slope': np.float32(0.119142115), 'atr_normalized': np.float32(0.09365014), 'prev_log_return': np.float32(0.10865508), 'usdchf_log_return': np.float32(0.09596087), 'xagusd_log_return': np.float32(0.10649877), 'xtiusd_log_return': np.float32(0.099873655), 'synth_vix_zscore': np.float32(0.10083489)}
[2026-05-18 11:02:15,268 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:02:15,421 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 11:02:15,422 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.093472674), 'gmm_vol_cluster': np.float32(0.08689233), 'rsi_slope': np.float32(0.12598442), 'atr_normalized': np.float32(0.10382576), 'prev_log_return': np.float32(0.1392608), 'usdchf_log_return': np.float32(0.10488742), 'xagusd_log_return': np.float32(0.11667328), 'xtiusd_log_return': np.float32(0.10435085), 'synth_vix_zscore': np.float32(0.12465238)}
[2026-05-18 11:02:15,422 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:02:15,424 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:02:15,737 INFO] src.backtester: Backtest [M15]: Sharpe=-0.411 | MaxDD=0.001 | WR=0.000 | Return=-0.1% | Trades=1
[2026-05-18 11:02:15,738 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:02:16,000 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 11:02:16,000 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14708254), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13676928), 'atr_normalized': np.float32(0.12773067), 'prev_log_return': np.float32(0.14733574), 'usdchf_log_return': np.float32(0.11494913), 'xagusd_log_return': np.float32(0.114943445), 'xtiusd_log_return': np.float32(0.0924299), 'synth_vix_zscore': np.float32(0.11875925)}
[2026-05-18 11:02:16,001 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:02:16,283 INFO] src.engine_xgb: XGB Train Acc: 0.5216 | Test Acc: 0.5174
[2026-05-18 11:02:16,284 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1056051), 'gmm_vol_cluster': np.float32(0.09436783), 'rsi_slope': np.float32(0.12930599), 'atr_normalized': np.float32(0.11553095), 'prev_log_return': np.float32(0.12271007), 'usdchf_log_return': np.float32(0.100207716), 'xagusd_log_return': np.float32(0.11752855), 'xtiusd_log_return': np.float32(0.111581296), 'synth_vix_zscore': np.float32(0.10316241)}
[2026-05-18 11:02:16,284 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:02:16,725 INFO] src.engine_xgb: XGB Train Acc: 0.5334 | Test Acc: 0.5078
[2026-05-18 11:02:16,726 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12865856), 'gmm_vol_cluster': np.float32(0.08371558), 'rsi_slope': np.float32(0.12085202), 'atr_normalized': np.float32(0.108195096), 'prev_log_return': np.float32(0.11492585), 'usdchf_log_return': np.float32(0.11090384), 'xagusd_log_return': np.float32(0.11249783), 'xtiusd_log_return': np.float32(0.102872215), 'synth_vix_zscore': np.float32(0.117379025)}
[2026-05-18 11:02:16,726 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:02:16,728 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:02:17,078 INFO] src.backtester: Backtest [M15]: Sharpe=-3.305 | MaxDD=0.242 | WR=0.319 | Return=-21.4% | Trades=282
[2026-05-18 11:02:17,078 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:02:17,352 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 11:02:17,352 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13689205), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1459197), 'atr_normalized': np.float32(0.116519034), 'prev_log_return': np.float32(0.13939176), 'usdchf_log_return': np.float32(0.11973711), 'xagusd_log_return': np.float32(0.1115645), 'xtiusd_log_return': np.float32(0.11459009), 'synth_vix_zscore': np.float32(0.115385704)}
[2026-05-18 11:02:17,353 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:02:17,637 INFO] src.engine_xgb: XGB Train Acc: 0.4908 | Test Acc: 0.4671
[2026-05-18 11:02:17,637 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09044636), 'gmm_vol_cluster': np.float32(0.12950239), 'rsi_slope': np.float32(0.13153093), 'atr_normalized': np.float32(0.107485116), 'prev_log_return': np.float32(0.120914616), 'usdchf_log_return': np.float32(0.10291856), 'xagusd_log_return': np.float32(0.0971164), 'xtiusd_log_return': np.float32(0.09963107), 'synth_vix_zscore': np.float32(0.12045456)}
[2026-05-18 11:02:17,638 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:02:18,104 INFO] src.engine_xgb: XGB Train Acc: 0.5173 | Test Acc: 0.4843
[2026-05-18 11:02:18,104 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12110868), 'gmm_vol_cluster': np.float32(0.10254326), 'rsi_slope': np.float32(0.12941143), 'atr_normalized': np.float32(0.10408155), 'prev_log_return': np.float32(0.11716935), 'usdchf_log_return': np.float32(0.10404811), 'xagusd_log_return': np.float32(0.106521875), 'xtiusd_log_return': np.float32(0.09669389), 'synth_vix_zscore': np.float32(0.11842185)}
[2026-05-18 11:02:18,105 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:02:18,106 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:02:18,216 INFO] src.backtester: Backtest [M15]: Sharpe=-0.885 | MaxDD=0.056 | WR=0.366 | Return=-2.8% | Trades=112
[2026-05-18 11:02:18,217 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 51%|███████████████████████████████████████▌ | 36/70 [54:09<52:36, 92.83s/it][2026-05-18 11:04:04,048 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:04:04,049 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:04:04,049 INFO] src.engine_hmm: Bull 0.9761 0.0061 0.0113 0.0064
[2026-05-18 11:04:04,050 INFO] src.engine_hmm: Bear 0.0053 0.9709 0.0150 0.0088
[2026-05-18 11:04:04,050 INFO] src.engine_hmm: Chop_Low 0.0091 0.0118 0.9782 0.0008
[2026-05-18 11:04:04,050 INFO] src.engine_hmm: Chop_High 0.0108 0.0159 0.0000 0.9732
[2026-05-18 11:04:04,051 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:04:04,051 INFO] src.engine_hmm: Bull: return=0.734212, vol=-0.123564, rsi_slope=-0.033551
[2026-05-18 11:04:04,051 INFO] src.engine_hmm: Bear: return=-0.579659, vol=-0.002429, rsi_slope=0.027075
[2026-05-18 11:04:04,052 INFO] src.engine_hmm: Chop_Low: return=-0.047408, vol=-0.622357, rsi_slope=0.000404
[2026-05-18 11:04:04,052 INFO] src.engine_hmm: Chop_High: return=-0.096007, vol=1.443664, rsi_slope=0.006913
[2026-05-18 11:04:04,055 INFO] src.engine_hmm: Total regime transitions: 5951
[2026-05-18 11:04:04,055 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 05:30:00: Bull -> Bear
[2026-05-18 11:04:04,056 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 07:15:00: Bear -> Bull
[2026-05-18 11:04:04,057 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 02:00:00: Bull -> Chop_Low
[2026-05-18 11:04:04,057 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 08:30:00: Chop_Low -> Bull
[2026-05-18 11:04:04,057 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 12:30:00: Bull -> Chop_Low
[2026-05-18 11:04:04,058 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 14:30:00: Chop_Low -> Bear
[2026-05-18 11:04:04,058 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Bear -> Chop_High
[2026-05-18 11:04:04,058 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 22:00:00: Chop_High -> Bear
[2026-05-18 11:04:04,059 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Bear -> Chop_Low
[2026-05-18 11:04:04,059 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_Low -> Bull
[2026-05-18 11:04:04,247 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:04:04,270 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:04:04,434 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 11:04:04,435 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.19077383), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.105777085), 'atr_normalized': np.float32(0.12403071), 'prev_log_return': np.float32(0.12220009), 'usdchf_log_return': np.float32(0.095053986), 'xagusd_log_return': np.float32(0.109894045), 'xtiusd_log_return': np.float32(0.12396045), 'synth_vix_zscore': np.float32(0.12830977)}
[2026-05-18 11:04:04,436 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:04:04,578 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.5171
[2026-05-18 11:04:04,579 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13823836), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15925877), 'atr_normalized': np.float32(0.11467167), 'prev_log_return': np.float32(0.11855009), 'usdchf_log_return': np.float32(0.12433218), 'xagusd_log_return': np.float32(0.11171113), 'xtiusd_log_return': np.float32(0.110860005), 'synth_vix_zscore': np.float32(0.122377835)}
[2026-05-18 11:04:04,579 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:04:04,688 INFO] src.engine_xgb: XGB Train Acc: 0.4948 | Test Acc: 0.4897
[2026-05-18 11:04:04,688 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12542228), 'gmm_vol_cluster': np.float32(0.13277023), 'rsi_slope': np.float32(0.11196442), 'atr_normalized': np.float32(0.12336189), 'prev_log_return': np.float32(0.116124205), 'usdchf_log_return': np.float32(0.09750904), 'xagusd_log_return': np.float32(0.09956617), 'xtiusd_log_return': np.float32(0.09529229), 'synth_vix_zscore': np.float32(0.0979894)}
[2026-05-18 11:04:04,688 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:04:04,689 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:04:05,233 INFO] src.backtester: Backtest [M15]: Sharpe=-13.804 | MaxDD=1.479 | WR=0.347 | Return=-77.2% | Trades=2041
[2026-05-18 11:04:05,233 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:04:05,529 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 11:04:05,529 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.24335673), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.110055774), 'atr_normalized': np.float32(0.12830395), 'prev_log_return': np.float32(0.12521094), 'usdchf_log_return': np.float32(0.09205655), 'xagusd_log_return': np.float32(0.08825139), 'xtiusd_log_return': np.float32(0.10127208), 'synth_vix_zscore': np.float32(0.11149257)}
[2026-05-18 11:04:05,530 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:04:05,880 INFO] src.engine_xgb: XGB Train Acc: 0.4874 | Test Acc: 0.4579
[2026-05-18 11:04:05,880 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12616146), 'gmm_vol_cluster': np.float32(0.13667174), 'rsi_slope': np.float32(0.115122706), 'atr_normalized': np.float32(0.09561634), 'prev_log_return': np.float32(0.119978964), 'usdchf_log_return': np.float32(0.10028367), 'xagusd_log_return': np.float32(0.10787878), 'xtiusd_log_return': np.float32(0.10164254), 'synth_vix_zscore': np.float32(0.096643716)}
[2026-05-18 11:04:05,881 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:04:06,057 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 11:04:06,057 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1447479), 'gmm_vol_cluster': np.float32(0.060401607), 'rsi_slope': np.float32(0.12672473), 'atr_normalized': np.float32(0.098000064), 'prev_log_return': np.float32(0.13141161), 'usdchf_log_return': np.float32(0.09532862), 'xagusd_log_return': np.float32(0.112548), 'xtiusd_log_return': np.float32(0.09156787), 'synth_vix_zscore': np.float32(0.13926958)}
[2026-05-18 11:04:06,058 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:04:06,059 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:04:06,624 INFO] src.backtester: Backtest [M15]: Sharpe=-15.886 | MaxDD=1.973 | WR=0.372 | Return=-86.1% | Trades=2741
[2026-05-18 11:04:06,625 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:04:06,946 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 11:04:06,947 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13495228), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13971137), 'atr_normalized': np.float32(0.10124436), 'prev_log_return': np.float32(0.13923776), 'usdchf_log_return': np.float32(0.12076443), 'xagusd_log_return': np.float32(0.14476033), 'xtiusd_log_return': np.float32(0.10244052), 'synth_vix_zscore': np.float32(0.11688894)}
[2026-05-18 11:04:06,947 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:04:07,203 INFO] src.engine_xgb: XGB Train Acc: 0.4910 | Test Acc: 0.5131
[2026-05-18 11:04:07,203 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.255416), 'gmm_vol_cluster': np.float32(0.09005575), 'rsi_slope': np.float32(0.113529585), 'atr_normalized': np.float32(0.080316864), 'prev_log_return': np.float32(0.10939561), 'usdchf_log_return': np.float32(0.08108705), 'xagusd_log_return': np.float32(0.102046594), 'xtiusd_log_return': np.float32(0.078004874), 'synth_vix_zscore': np.float32(0.09014761)}
[2026-05-18 11:04:07,204 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:04:07,687 INFO] src.engine_xgb: XGB Train Acc: 0.4947 | Test Acc: 0.5016
[2026-05-18 11:04:07,688 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.17354804), 'gmm_vol_cluster': np.float32(0.075352065), 'rsi_slope': np.float32(0.11408103), 'atr_normalized': np.float32(0.10607541), 'prev_log_return': np.float32(0.11392954), 'usdchf_log_return': np.float32(0.097318865), 'xagusd_log_return': np.float32(0.113136016), 'xtiusd_log_return': np.float32(0.0977148), 'synth_vix_zscore': np.float32(0.10884427)}
[2026-05-18 11:04:07,688 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:04:07,690 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:04:08,467 INFO] src.backtester: Backtest [M15]: Sharpe=-14.558 | MaxDD=1.641 | WR=0.346 | Return=-80.6% | Trades=2188
[2026-05-18 11:04:08,468 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:04:08,895 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 11:04:08,895 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13095488), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15377803), 'atr_normalized': np.float32(0.11522482), 'prev_log_return': np.float32(0.1520862), 'usdchf_log_return': np.float32(0.1225607), 'xagusd_log_return': np.float32(0.10832164), 'xtiusd_log_return': np.float32(0.107674874), 'synth_vix_zscore': np.float32(0.10939884)}
[2026-05-18 11:04:08,895 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:04:09,516 INFO] src.engine_xgb: XGB Train Acc: 0.4877 | Test Acc: 0.4652
[2026-05-18 11:04:09,517 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.19881049), 'gmm_vol_cluster': np.float32(0.13698037), 'rsi_slope': np.float32(0.11148359), 'atr_normalized': np.float32(0.0897501), 'prev_log_return': np.float32(0.10577772), 'usdchf_log_return': np.float32(0.086469494), 'xagusd_log_return': np.float32(0.08653724), 'xtiusd_log_return': np.float32(0.086207725), 'synth_vix_zscore': np.float32(0.09798325)}
[2026-05-18 11:04:09,518 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:04:09,831 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 11:04:09,831 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.25653434), 'gmm_vol_cluster': np.float32(0.07723859), 'rsi_slope': np.float32(0.10076405), 'atr_normalized': np.float32(0.095084436), 'prev_log_return': np.float32(0.1078989), 'usdchf_log_return': np.float32(0.079882875), 'xagusd_log_return': np.float32(0.08618612), 'xtiusd_log_return': np.float32(0.07342554), 'synth_vix_zscore': np.float32(0.122985125)}
[2026-05-18 11:04:09,832 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:04:09,832 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:04:09,959 INFO] src.backtester: Backtest [M15]: Sharpe=-9.992 | MaxDD=0.165 | WR=0.381 | Return=-14.9% | Trades=194
[2026-05-18 11:04:09,960 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 53%|████████████████████████████████████████▋ | 37/70 [56:01<54:10, 98.51s/it][2026-05-18 11:06:34,190 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:06:34,190 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:06:34,191 INFO] src.engine_hmm: Bull 0.9730 0.0080 0.0124 0.0065
[2026-05-18 11:06:34,191 INFO] src.engine_hmm: Bear 0.0068 0.9680 0.0158 0.0094
[2026-05-18 11:06:34,191 INFO] src.engine_hmm: Chop_Low 0.0101 0.0114 0.9777 0.0008
[2026-05-18 11:06:34,192 INFO] src.engine_hmm: Chop_High 0.0113 0.0168 0.0000 0.9719
[2026-05-18 11:06:34,192 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:06:34,192 INFO] src.engine_hmm: Bull: return=0.715169, vol=-0.129139, rsi_slope=-0.034605
[2026-05-18 11:06:34,192 INFO] src.engine_hmm: Bear: return=-0.575478, vol=0.028330, rsi_slope=0.027093
[2026-05-18 11:06:34,192 INFO] src.engine_hmm: Chop_Low: return=-0.062397, vol=-0.624883, rsi_slope=0.002316
[2026-05-18 11:06:34,193 INFO] src.engine_hmm: Chop_High: return=-0.071734, vol=1.470118, rsi_slope=0.006203
[2026-05-18 11:06:34,195 INFO] src.engine_hmm: Total regime transitions: 6374
[2026-05-18 11:06:34,195 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 05:30:00: Bull -> Bear
[2026-05-18 11:06:34,196 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 07:15:00: Bear -> Bull
[2026-05-18 11:06:34,196 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 01:30:00: Bull -> Chop_Low
[2026-05-18 11:06:34,196 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 08:30:00: Chop_Low -> Bull
[2026-05-18 11:06:34,196 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 12:30:00: Bull -> Chop_Low
[2026-05-18 11:06:34,197 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 14:15:00: Chop_Low -> Bear
[2026-05-18 11:06:34,197 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Bear -> Chop_High
[2026-05-18 11:06:34,197 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 22:00:00: Chop_High -> Bear
[2026-05-18 11:06:34,198 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 14:30:00: Bear -> Chop_Low
[2026-05-18 11:06:34,198 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 17:30:00: Chop_Low -> Bear
[2026-05-18 11:06:34,416 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:06:34,437 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:06:34,616 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 11:06:34,617 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.19426028), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.09870386), 'atr_normalized': np.float32(0.11786097), 'prev_log_return': np.float32(0.13423194), 'usdchf_log_return': np.float32(0.11339212), 'xagusd_log_return': np.float32(0.10482245), 'xtiusd_log_return': np.float32(0.11862898), 'synth_vix_zscore': np.float32(0.11809934)}
[2026-05-18 11:06:34,617 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:06:34,735 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.5171
[2026-05-18 11:06:34,736 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1415122), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.17863403), 'atr_normalized': np.float32(0.11955799), 'prev_log_return': np.float32(0.11478661), 'usdchf_log_return': np.float32(0.108148344), 'xagusd_log_return': np.float32(0.108373836), 'xtiusd_log_return': np.float32(0.11958818), 'synth_vix_zscore': np.float32(0.10939876)}
[2026-05-18 11:06:34,736 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:06:34,958 INFO] src.engine_xgb: XGB Train Acc: 0.5119 | Test Acc: 0.4914
[2026-05-18 11:06:34,959 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14191979), 'gmm_vol_cluster': np.float32(0.12179948), 'rsi_slope': np.float32(0.10564145), 'atr_normalized': np.float32(0.11143207), 'prev_log_return': np.float32(0.10637841), 'usdchf_log_return': np.float32(0.099918395), 'xagusd_log_return': np.float32(0.09886964), 'xtiusd_log_return': np.float32(0.11010171), 'synth_vix_zscore': np.float32(0.103939116)}
[2026-05-18 11:06:34,960 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:06:34,961 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:06:35,424 INFO] src.backtester: Backtest [M15]: Sharpe=-13.346 | MaxDD=1.332 | WR=0.341 | Return=-73.6% | Trades=1812
[2026-05-18 11:06:35,425 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:06:35,734 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 11:06:35,734 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.19756086), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13231747), 'atr_normalized': np.float32(0.11848414), 'prev_log_return': np.float32(0.12234081), 'usdchf_log_return': np.float32(0.104505576), 'xagusd_log_return': np.float32(0.10692283), 'xtiusd_log_return': np.float32(0.098149195), 'synth_vix_zscore': np.float32(0.11971916)}
[2026-05-18 11:06:35,735 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:06:36,274 INFO] src.engine_xgb: XGB Train Acc: 0.5256 | Test Acc: 0.4761
[2026-05-18 11:06:36,275 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12887684), 'gmm_vol_cluster': np.float32(0.1197912), 'rsi_slope': np.float32(0.11495786), 'atr_normalized': np.float32(0.1022866), 'prev_log_return': np.float32(0.11660616), 'usdchf_log_return': np.float32(0.10610124), 'xagusd_log_return': np.float32(0.105899125), 'xtiusd_log_return': np.float32(0.100652255), 'synth_vix_zscore': np.float32(0.104828686)}
[2026-05-18 11:06:36,275 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:06:36,452 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 11:06:36,452 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12741476), 'gmm_vol_cluster': np.float32(0.09637564), 'rsi_slope': np.float32(0.122483715), 'atr_normalized': np.float32(0.09862668), 'prev_log_return': np.float32(0.121986456), 'usdchf_log_return': np.float32(0.09274237), 'xagusd_log_return': np.float32(0.1133251), 'xtiusd_log_return': np.float32(0.09870019), 'synth_vix_zscore': np.float32(0.12834512)}
[2026-05-18 11:06:36,453 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:06:36,455 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:06:37,086 INFO] src.backtester: Backtest [M15]: Sharpe=-14.042 | MaxDD=1.662 | WR=0.386 | Return=-81.0% | Trades=2471
[2026-05-18 11:06:37,087 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:06:37,607 INFO] src.engine_xgb: XGB Train Acc: 0.4969 | Test Acc: 0.4872
[2026-05-18 11:06:37,608 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13569278), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13032578), 'atr_normalized': np.float32(0.12118335), 'prev_log_return': np.float32(0.13424976), 'usdchf_log_return': np.float32(0.11891651), 'xagusd_log_return': np.float32(0.119694486), 'xtiusd_log_return': np.float32(0.11757969), 'synth_vix_zscore': np.float32(0.12235767)}
[2026-05-18 11:06:37,609 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:06:37,799 INFO] src.engine_xgb: XGB Train Acc: 0.4910 | Test Acc: 0.5131
[2026-05-18 11:06:37,801 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.26358104), 'gmm_vol_cluster': np.float32(0.04989848), 'rsi_slope': np.float32(0.12808263), 'atr_normalized': np.float32(0.08735113), 'prev_log_return': np.float32(0.112706505), 'usdchf_log_return': np.float32(0.086614), 'xagusd_log_return': np.float32(0.09214829), 'xtiusd_log_return': np.float32(0.089470506), 'synth_vix_zscore': np.float32(0.090147436)}
[2026-05-18 11:06:37,801 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:06:38,272 INFO] src.engine_xgb: XGB Train Acc: 0.5021 | Test Acc: 0.5019
[2026-05-18 11:06:38,273 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14660925), 'gmm_vol_cluster': np.float32(0.10749425), 'rsi_slope': np.float32(0.11406368), 'atr_normalized': np.float32(0.10700883), 'prev_log_return': np.float32(0.10656467), 'usdchf_log_return': np.float32(0.10236391), 'xagusd_log_return': np.float32(0.10365237), 'xtiusd_log_return': np.float32(0.10165046), 'synth_vix_zscore': np.float32(0.11059255)}
[2026-05-18 11:06:38,274 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:06:38,275 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:06:38,763 INFO] src.backtester: Backtest [M15]: Sharpe=-11.381 | MaxDD=1.126 | WR=0.340 | Return=-67.5% | Trades=1589
[2026-05-18 11:06:38,763 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:06:39,136 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 11:06:39,137 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1207131), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14472438), 'atr_normalized': np.float32(0.11855648), 'prev_log_return': np.float32(0.13932122), 'usdchf_log_return': np.float32(0.11883287), 'xagusd_log_return': np.float32(0.116045125), 'xtiusd_log_return': np.float32(0.11401359), 'synth_vix_zscore': np.float32(0.12779328)}
[2026-05-18 11:06:39,138 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:06:39,890 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4749
[2026-05-18 11:06:39,891 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.17645727), 'gmm_vol_cluster': np.float32(0.13214797), 'rsi_slope': np.float32(0.110090554), 'atr_normalized': np.float32(0.09452366), 'prev_log_return': np.float32(0.10724347), 'usdchf_log_return': np.float32(0.091805466), 'xagusd_log_return': np.float32(0.092834204), 'xtiusd_log_return': np.float32(0.095575295), 'synth_vix_zscore': np.float32(0.099322096)}
[2026-05-18 11:06:39,892 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:06:40,508 INFO] src.engine_xgb: XGB Train Acc: 0.4963 | Test Acc: 0.4752
[2026-05-18 11:06:40,509 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16270998), 'gmm_vol_cluster': np.float32(0.10004309), 'rsi_slope': np.float32(0.12036026), 'atr_normalized': np.float32(0.10771492), 'prev_log_return': np.float32(0.10257427), 'usdchf_log_return': np.float32(0.0994105), 'xagusd_log_return': np.float32(0.09784013), 'xtiusd_log_return': np.float32(0.096257456), 'synth_vix_zscore': np.float32(0.113089375)}
[2026-05-18 11:06:40,509 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:06:40,511 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:06:40,658 INFO] src.backtester: Backtest [M15]: Sharpe=-8.612 | MaxDD=0.144 | WR=0.402 | Return=-12.8% | Trades=204
[2026-05-18 11:06:40,659 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 54%|████████████████████████████████████████▏ | 38/70 [58:31<1:00:52, 114.15s/it][2026-05-18 11:07:54,181 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:07:54,182 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:07:54,182 INFO] src.engine_hmm: Bull 0.9560 0.0104 0.0007 0.0329
[2026-05-18 11:07:54,183 INFO] src.engine_hmm: Bear 0.0351 0.9643 0.0001 0.0005
[2026-05-18 11:07:54,184 INFO] src.engine_hmm: Chop_Low 0.0013 0.0007 0.9738 0.0243
[2026-05-18 11:07:54,184 INFO] src.engine_hmm: Chop_High 0.0237 0.0018 0.0260 0.9484
[2026-05-18 11:07:54,185 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:07:54,185 INFO] src.engine_hmm: Bull: return=0.057012, vol=0.391306, rsi_slope=0.002235
[2026-05-18 11:07:54,187 INFO] src.engine_hmm: Bear: return=-0.165118, vol=1.972666, rsi_slope=0.007466
[2026-05-18 11:07:54,187 INFO] src.engine_hmm: Chop_Low: return=-0.014397, vol=-0.672537, rsi_slope=-0.000642
[2026-05-18 11:07:54,188 INFO] src.engine_hmm: Chop_High: return=0.019278, vol=-0.247759, rsi_slope=-0.003480
[2026-05-18 11:07:54,191 INFO] src.engine_hmm: Total regime transitions: 9584
[2026-05-18 11:07:54,192 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 11:07:54,193 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 11:07:54,193 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 11:07:54,194 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:30:00: Bear -> Bull
[2026-05-18 11:07:54,194 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 11:07:54,195 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 11:07:54,195 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 11:07:54,196 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 11:07:54,196 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 11:07:54,197 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 11:07:54,442 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:07:54,463 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:07:54,628 INFO] src.engine_xgb: XGB Train Acc: 0.5181 | Test Acc: 0.5117
[2026-05-18 11:07:54,628 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.27917776), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.088937275), 'atr_normalized': np.float32(0.093837604), 'prev_log_return': np.float32(0.11607016), 'usdchf_log_return': np.float32(0.10520825), 'xagusd_log_return': np.float32(0.093903065), 'xtiusd_log_return': np.float32(0.095790066), 'synth_vix_zscore': np.float32(0.12707587)}
[2026-05-18 11:07:54,629 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:07:54,742 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4829
[2026-05-18 11:07:54,743 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.115653485), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.19897363), 'atr_normalized': np.float32(0.10369119), 'prev_log_return': np.float32(0.101693325), 'usdchf_log_return': np.float32(0.12059957), 'xagusd_log_return': np.float32(0.10723425), 'xtiusd_log_return': np.float32(0.121411026), 'synth_vix_zscore': np.float32(0.13074349)}
[2026-05-18 11:07:54,743 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:07:54,998 INFO] src.engine_xgb: XGB Train Acc: 0.5754 | Test Acc: 0.5316
[2026-05-18 11:07:54,999 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.107751235), 'gmm_vol_cluster': np.float32(0.117364444), 'rsi_slope': np.float32(0.11327223), 'atr_normalized': np.float32(0.10589956), 'prev_log_return': np.float32(0.1279477), 'usdchf_log_return': np.float32(0.10505801), 'xagusd_log_return': np.float32(0.106393114), 'xtiusd_log_return': np.float32(0.112401865), 'synth_vix_zscore': np.float32(0.103911825)}
[2026-05-18 11:07:55,000 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:07:55,001 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:07:55,400 INFO] src.backtester: Backtest [M15]: Sharpe=-3.811 | MaxDD=0.339 | WR=0.383 | Return=-28.3% | Trades=562
[2026-05-18 11:07:55,401 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:07:55,735 INFO] src.engine_xgb: XGB Train Acc: 0.5347 | Test Acc: 0.5174
[2026-05-18 11:07:55,735 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15289676), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13453834), 'atr_normalized': np.float32(0.12097333), 'prev_log_return': np.float32(0.13784549), 'usdchf_log_return': np.float32(0.11128345), 'xagusd_log_return': np.float32(0.10201137), 'xtiusd_log_return': np.float32(0.11425421), 'synth_vix_zscore': np.float32(0.12619703)}
[2026-05-18 11:07:55,735 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:07:55,958 INFO] src.engine_xgb: XGB Train Acc: 0.5510 | Test Acc: 0.5284
[2026-05-18 11:07:55,958 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1118057), 'gmm_vol_cluster': np.float32(0.09883951), 'rsi_slope': np.float32(0.13857663), 'atr_normalized': np.float32(0.101213425), 'prev_log_return': np.float32(0.1250835), 'usdchf_log_return': np.float32(0.09327572), 'xagusd_log_return': np.float32(0.11054477), 'xtiusd_log_return': np.float32(0.110828124), 'synth_vix_zscore': np.float32(0.109832585)}
[2026-05-18 11:07:55,959 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:07:56,121 INFO] src.engine_xgb: XGB Train Acc: 0.5158 | Test Acc: 0.5031
[2026-05-18 11:07:56,122 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.114946775), 'gmm_vol_cluster': np.float32(0.07316975), 'rsi_slope': np.float32(0.14194115), 'atr_normalized': np.float32(0.09111417), 'prev_log_return': np.float32(0.13492236), 'usdchf_log_return': np.float32(0.097768374), 'xagusd_log_return': np.float32(0.12190186), 'xtiusd_log_return': np.float32(0.08975203), 'synth_vix_zscore': np.float32(0.1344835)}
[2026-05-18 11:07:56,123 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:07:56,124 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:07:56,558 INFO] src.backtester: Backtest [M15]: Sharpe=-0.198 | MaxDD=0.003 | WR=0.700 | Return=-0.1% | Trades=10
[2026-05-18 11:07:56,558 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:07:56,947 INFO] src.engine_xgb: XGB Train Acc: 0.5155 | Test Acc: 0.5122
[2026-05-18 11:07:56,947 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.129459), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14856175), 'atr_normalized': np.float32(0.1135418), 'prev_log_return': np.float32(0.1494645), 'usdchf_log_return': np.float32(0.111177444), 'xagusd_log_return': np.float32(0.13795356), 'xtiusd_log_return': np.float32(0.09186846), 'synth_vix_zscore': np.float32(0.117973484)}
[2026-05-18 11:07:56,948 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:07:57,155 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4869
[2026-05-18 11:07:57,156 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10894171), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16537865), 'atr_normalized': np.float32(0.11604451), 'prev_log_return': np.float32(0.14196262), 'usdchf_log_return': np.float32(0.098986685), 'xagusd_log_return': np.float32(0.14164239), 'xtiusd_log_return': np.float32(0.108896546), 'synth_vix_zscore': np.float32(0.11814688)}
[2026-05-18 11:07:57,157 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:07:57,660 INFO] src.engine_xgb: XGB Train Acc: 0.5496 | Test Acc: 0.5101
[2026-05-18 11:07:57,661 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.116323315), 'gmm_vol_cluster': np.float32(0.09698092), 'rsi_slope': np.float32(0.12882566), 'atr_normalized': np.float32(0.10356513), 'prev_log_return': np.float32(0.1151895), 'usdchf_log_return': np.float32(0.104702555), 'xagusd_log_return': np.float32(0.11011897), 'xtiusd_log_return': np.float32(0.10579089), 'synth_vix_zscore': np.float32(0.11850308)}
[2026-05-18 11:07:57,662 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:07:57,663 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:07:58,140 INFO] src.backtester: Backtest [M15]: Sharpe=-2.311 | MaxDD=0.086 | WR=0.359 | Return=-8.1% | Trades=117
[2026-05-18 11:07:58,141 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:07:58,445 INFO] src.engine_xgb: XGB Train Acc: 0.5123 | Test Acc: 0.5419
[2026-05-18 11:07:58,445 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12815958), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15879846), 'atr_normalized': np.float32(0.118081406), 'prev_log_return': np.float32(0.15272294), 'usdchf_log_return': np.float32(0.11225599), 'xagusd_log_return': np.float32(0.104402915), 'xtiusd_log_return': np.float32(0.11160975), 'synth_vix_zscore': np.float32(0.11396893)}
[2026-05-18 11:07:58,446 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:07:58,991 INFO] src.engine_xgb: XGB Train Acc: 0.5458 | Test Acc: 0.5251
[2026-05-18 11:07:58,991 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09731518), 'gmm_vol_cluster': np.float32(0.12938353), 'rsi_slope': np.float32(0.13973689), 'atr_normalized': np.float32(0.09655016), 'prev_log_return': np.float32(0.121749185), 'usdchf_log_return': np.float32(0.10128669), 'xagusd_log_return': np.float32(0.103000686), 'xtiusd_log_return': np.float32(0.10683997), 'synth_vix_zscore': np.float32(0.10413774)}
[2026-05-18 11:07:58,992 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:07:59,359 INFO] src.engine_xgb: XGB Train Acc: 0.5387 | Test Acc: 0.5213
[2026-05-18 11:07:59,359 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11461593), 'gmm_vol_cluster': np.float32(0.09446153), 'rsi_slope': np.float32(0.14462982), 'atr_normalized': np.float32(0.09935791), 'prev_log_return': np.float32(0.12832019), 'usdchf_log_return': np.float32(0.09629783), 'xagusd_log_return': np.float32(0.0926299), 'xtiusd_log_return': np.float32(0.09634547), 'synth_vix_zscore': np.float32(0.13334142)}
[2026-05-18 11:07:59,360 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:07:59,361 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:07:59,451 INFO] src.backtester: Backtest [M15]: Sharpe=0.000 | MaxDD=0.000 | WR=0.000 | Return=0.0% | Trades=0
[2026-05-18 11:07:59,452 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 56%|██████████████████████████████████████████▎ | 39/70 [59:50<53:30, 103.56s/it][2026-05-18 11:09:25,257 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:09:25,258 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:09:25,258 INFO] src.engine_hmm: Bull 0.9557 0.0105 0.0007 0.0331
[2026-05-18 11:09:25,259 INFO] src.engine_hmm: Bear 0.0359 0.9635 0.0001 0.0005
[2026-05-18 11:09:25,259 INFO] src.engine_hmm: Chop_Low 0.0012 0.0008 0.9735 0.0245
[2026-05-18 11:09:25,259 INFO] src.engine_hmm: Chop_High 0.0237 0.0021 0.0263 0.9480
[2026-05-18 11:09:25,260 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:09:25,260 INFO] src.engine_hmm: Bull: return=0.058397, vol=0.389022, rsi_slope=0.002846
[2026-05-18 11:09:25,260 INFO] src.engine_hmm: Bear: return=-0.168998, vol=1.963921, rsi_slope=0.007605
[2026-05-18 11:09:25,260 INFO] src.engine_hmm: Chop_Low: return=-0.010406, vol=-0.672894, rsi_slope=-0.000914
[2026-05-18 11:09:25,261 INFO] src.engine_hmm: Chop_High: return=0.015715, vol=-0.248671, rsi_slope=-0.003771
[2026-05-18 11:09:25,262 INFO] src.engine_hmm: Total regime transitions: 9671
[2026-05-18 11:09:25,263 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 11:09:25,263 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 11:09:25,263 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 11:09:25,264 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:30:00: Bear -> Bull
[2026-05-18 11:09:25,264 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 11:09:25,264 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 11:09:25,265 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 11:09:25,265 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 11:09:25,265 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 11:09:25,265 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 11:09:25,476 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:09:25,497 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:09:25,685 INFO] src.engine_xgb: XGB Train Acc: 0.5066 | Test Acc: 0.5243
[2026-05-18 11:09:25,686 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.20454994), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.10842024), 'atr_normalized': np.float32(0.10698186), 'prev_log_return': np.float32(0.13020486), 'usdchf_log_return': np.float32(0.09984856), 'xagusd_log_return': np.float32(0.10817423), 'xtiusd_log_return': np.float32(0.1067151), 'synth_vix_zscore': np.float32(0.13510518)}
[2026-05-18 11:09:25,687 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:09:25,805 INFO] src.engine_xgb: XGB Train Acc: 0.4996 | Test Acc: 0.5178
[2026-05-18 11:09:25,805 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13992633), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16629402), 'atr_normalized': np.float32(0.11064659), 'prev_log_return': np.float32(0.1103306), 'usdchf_log_return': np.float32(0.11584049), 'xagusd_log_return': np.float32(0.122370176), 'xtiusd_log_return': np.float32(0.11596421), 'synth_vix_zscore': np.float32(0.118627556)}
[2026-05-18 11:09:25,806 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:09:25,927 INFO] src.engine_xgb: XGB Train Acc: 0.5014 | Test Acc: 0.4907
[2026-05-18 11:09:25,927 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09961353), 'gmm_vol_cluster': np.float32(0.1073484), 'rsi_slope': np.float32(0.113855556), 'atr_normalized': np.float32(0.11729124), 'prev_log_return': np.float32(0.12215183), 'usdchf_log_return': np.float32(0.12058908), 'xagusd_log_return': np.float32(0.12124956), 'xtiusd_log_return': np.float32(0.094669364), 'synth_vix_zscore': np.float32(0.10323151)}
[2026-05-18 11:09:25,928 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:09:25,929 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:09:26,326 INFO] src.backtester: Backtest [M15]: Sharpe=-3.989 | MaxDD=0.639 | WR=0.346 | Return=-47.1% | Trades=924
[2026-05-18 11:09:26,327 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:09:26,586 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 11:09:26,586 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12827675), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13511707), 'atr_normalized': np.float32(0.13179132), 'prev_log_return': np.float32(0.12483183), 'usdchf_log_return': np.float32(0.123480335), 'xagusd_log_return': np.float32(0.113449976), 'xtiusd_log_return': np.float32(0.12296943), 'synth_vix_zscore': np.float32(0.1200832)}
[2026-05-18 11:09:26,587 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:09:26,821 INFO] src.engine_xgb: XGB Train Acc: 0.4995 | Test Acc: 0.4666
[2026-05-18 11:09:26,822 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11777875), 'gmm_vol_cluster': np.float32(0.1355132), 'rsi_slope': np.float32(0.12688243), 'atr_normalized': np.float32(0.09037111), 'prev_log_return': np.float32(0.11673598), 'usdchf_log_return': np.float32(0.09658463), 'xagusd_log_return': np.float32(0.10046738), 'xtiusd_log_return': np.float32(0.11382705), 'synth_vix_zscore': np.float32(0.10183953)}
[2026-05-18 11:09:26,823 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:09:26,989 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 11:09:26,989 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.105892844), 'gmm_vol_cluster': np.float32(0.06968948), 'rsi_slope': np.float32(0.1290589), 'atr_normalized': np.float32(0.10458351), 'prev_log_return': np.float32(0.14063501), 'usdchf_log_return': np.float32(0.10424683), 'xagusd_log_return': np.float32(0.10631866), 'xtiusd_log_return': np.float32(0.10691345), 'synth_vix_zscore': np.float32(0.13266136)}
[2026-05-18 11:09:26,990 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:09:26,991 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:09:27,458 INFO] src.backtester: Backtest [M15]: Sharpe=-5.607 | MaxDD=0.665 | WR=0.324 | Return=-48.5% | Trades=859
[2026-05-18 11:09:27,458 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:09:27,816 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 11:09:27,817 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11116309), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12885147), 'atr_normalized': np.float32(0.1400529), 'prev_log_return': np.float32(0.129549), 'usdchf_log_return': np.float32(0.12107726), 'xagusd_log_return': np.float32(0.14127734), 'xtiusd_log_return': np.float32(0.107949555), 'synth_vix_zscore': np.float32(0.12007932)}
[2026-05-18 11:09:27,818 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:09:28,057 INFO] src.engine_xgb: XGB Train Acc: 0.4930 | Test Acc: 0.5133
[2026-05-18 11:09:28,058 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08849508), 'gmm_vol_cluster': np.float32(0.19429244), 'rsi_slope': np.float32(0.11785687), 'atr_normalized': np.float32(0.09953896), 'prev_log_return': np.float32(0.12102487), 'usdchf_log_return': np.float32(0.09029119), 'xagusd_log_return': np.float32(0.109540105), 'xtiusd_log_return': np.float32(0.0945316), 'synth_vix_zscore': np.float32(0.0844289)}
[2026-05-18 11:09:28,058 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:09:28,285 INFO] src.engine_xgb: XGB Train Acc: 0.4947 | Test Acc: 0.5016
[2026-05-18 11:09:28,286 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13467059), 'gmm_vol_cluster': np.float32(0.075624496), 'rsi_slope': np.float32(0.1198158), 'atr_normalized': np.float32(0.10842766), 'prev_log_return': np.float32(0.1308306), 'usdchf_log_return': np.float32(0.10232522), 'xagusd_log_return': np.float32(0.10447701), 'xtiusd_log_return': np.float32(0.0940745), 'synth_vix_zscore': np.float32(0.12975408)}
[2026-05-18 11:09:28,287 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:09:28,288 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:09:28,898 INFO] src.backtester: Backtest [M15]: Sharpe=-5.465 | MaxDD=0.739 | WR=0.354 | Return=-52.2% | Trades=974
[2026-05-18 11:09:28,900 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:09:29,240 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 11:09:29,240 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12588143), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13986789), 'atr_normalized': np.float32(0.13129579), 'prev_log_return': np.float32(0.1498295), 'usdchf_log_return': np.float32(0.113627896), 'xagusd_log_return': np.float32(0.10900431), 'xtiusd_log_return': np.float32(0.117113024), 'synth_vix_zscore': np.float32(0.11338007)}
[2026-05-18 11:09:29,241 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:09:29,508 INFO] src.engine_xgb: XGB Train Acc: 0.4877 | Test Acc: 0.4652
[2026-05-18 11:09:29,508 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.108425066), 'gmm_vol_cluster': np.float32(0.098651506), 'rsi_slope': np.float32(0.13850148), 'atr_normalized': np.float32(0.10334436), 'prev_log_return': np.float32(0.11478634), 'usdchf_log_return': np.float32(0.103113025), 'xagusd_log_return': np.float32(0.09907642), 'xtiusd_log_return': np.float32(0.11798876), 'synth_vix_zscore': np.float32(0.116112985)}
[2026-05-18 11:09:29,509 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:09:29,793 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 11:09:29,793 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1289619), 'gmm_vol_cluster': np.float32(0.11607267), 'rsi_slope': np.float32(0.12833415), 'atr_normalized': np.float32(0.107119255), 'prev_log_return': np.float32(0.110313594), 'usdchf_log_return': np.float32(0.10396793), 'xagusd_log_return': np.float32(0.0972144), 'xtiusd_log_return': np.float32(0.08509878), 'synth_vix_zscore': np.float32(0.12291738)}
[2026-05-18 11:09:29,794 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:09:29,795 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:09:29,931 INFO] src.backtester: Backtest [M15]: Sharpe=-4.628 | MaxDD=0.422 | WR=0.392 | Return=-29.2% | Trades=589
[2026-05-18 11:09:29,932 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[ 40/70] Best Score: -0.500 | ETA: 46m 0s RAM: 60%
Best trial: 4. Best value: -0.5: 57%|██████████████████████████████████████████▊ | 40/70 [1:01:21<49:48, 99.61s/it][2026-05-18 11:11:46,721 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:11:46,721 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:11:46,722 INFO] src.engine_hmm: Bull 0.9557 0.0109 0.0006 0.0328
[2026-05-18 11:11:46,722 INFO] src.engine_hmm: Bear 0.0319 0.9666 0.0003 0.0012
[2026-05-18 11:11:46,722 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0236
[2026-05-18 11:11:46,723 INFO] src.engine_hmm: Chop_High 0.0242 0.0016 0.0260 0.9482
[2026-05-18 11:11:46,723 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:11:46,723 INFO] src.engine_hmm: Bull: return=0.052260, vol=0.383143, rsi_slope=0.000772
[2026-05-18 11:11:46,723 INFO] src.engine_hmm: Bear: return=-0.152082, vol=1.880767, rsi_slope=0.009391
[2026-05-18 11:11:46,724 INFO] src.engine_hmm: Chop_Low: return=-0.019735, vol=-0.670138, rsi_slope=0.000285
[2026-05-18 11:11:46,724 INFO] src.engine_hmm: Chop_High: return=0.028762, vol=-0.246003, rsi_slope=-0.004075
[2026-05-18 11:11:46,726 INFO] src.engine_hmm: Total regime transitions: 9492
[2026-05-18 11:11:46,726 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 11:11:46,727 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 11:11:46,727 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 11:11:46,728 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 11:11:46,728 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 11:11:46,729 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 11:11:46,729 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 11:11:46,730 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 11:11:46,730 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 11:11:46,730 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 11:11:46,948 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:11:46,969 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:11:47,140 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 11:11:47,140 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.3160693), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.08988757), 'atr_normalized': np.float32(0.09850298), 'prev_log_return': np.float32(0.09295592), 'usdchf_log_return': np.float32(0.094319426), 'xagusd_log_return': np.float32(0.09127745), 'xtiusd_log_return': np.float32(0.11349641), 'synth_vix_zscore': np.float32(0.103490934)}
[2026-05-18 11:11:47,141 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:11:47,280 INFO] src.engine_xgb: XGB Train Acc: 0.5097 | Test Acc: 0.5135
[2026-05-18 11:11:47,281 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11004622), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16177185), 'atr_normalized': np.float32(0.12348164), 'prev_log_return': np.float32(0.11857764), 'usdchf_log_return': np.float32(0.12714818), 'xagusd_log_return': np.float32(0.12103557), 'xtiusd_log_return': np.float32(0.114236124), 'synth_vix_zscore': np.float32(0.123702794)}
[2026-05-18 11:11:47,282 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:11:47,416 INFO] src.engine_xgb: XGB Train Acc: 0.5058 | Test Acc: 0.4914
[2026-05-18 11:11:47,416 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11387484), 'gmm_vol_cluster': np.float32(0.120294444), 'rsi_slope': np.float32(0.1108224), 'atr_normalized': np.float32(0.10508771), 'prev_log_return': np.float32(0.12596707), 'usdchf_log_return': np.float32(0.111688346), 'xagusd_log_return': np.float32(0.10723066), 'xtiusd_log_return': np.float32(0.101262406), 'synth_vix_zscore': np.float32(0.103772126)}
[2026-05-18 11:11:47,417 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:11:47,418 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:11:47,784 INFO] src.backtester: Backtest [M15]: Sharpe=-2.368 | MaxDD=0.202 | WR=0.344 | Return=-18.2% | Trades=227
[2026-05-18 11:11:47,784 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:11:48,063 INFO] src.engine_xgb: XGB Train Acc: 0.4928 | Test Acc: 0.4581
[2026-05-18 11:11:48,064 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1235481), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12443229), 'atr_normalized': np.float32(0.122400075), 'prev_log_return': np.float32(0.13960324), 'usdchf_log_return': np.float32(0.11931971), 'xagusd_log_return': np.float32(0.11624248), 'xtiusd_log_return': np.float32(0.12634405), 'synth_vix_zscore': np.float32(0.12811002)}
[2026-05-18 11:11:48,064 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:11:48,391 INFO] src.engine_xgb: XGB Train Acc: 0.5525 | Test Acc: 0.4923
[2026-05-18 11:11:48,391 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10518046), 'gmm_vol_cluster': np.float32(0.13285436), 'rsi_slope': np.float32(0.11350207), 'atr_normalized': np.float32(0.104662254), 'prev_log_return': np.float32(0.11637657), 'usdchf_log_return': np.float32(0.10450299), 'xagusd_log_return': np.float32(0.10416363), 'xtiusd_log_return': np.float32(0.10646319), 'synth_vix_zscore': np.float32(0.11229449)}
[2026-05-18 11:11:48,392 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:11:48,576 INFO] src.engine_xgb: XGB Train Acc: 0.4937 | Test Acc: 0.5011
[2026-05-18 11:11:48,576 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.07914076), 'gmm_vol_cluster': np.float32(0.11386528), 'rsi_slope': np.float32(0.12503214), 'atr_normalized': np.float32(0.1056885), 'prev_log_return': np.float32(0.11729036), 'usdchf_log_return': np.float32(0.10628406), 'xagusd_log_return': np.float32(0.10818484), 'xtiusd_log_return': np.float32(0.10782349), 'synth_vix_zscore': np.float32(0.13669056)}
[2026-05-18 11:11:48,577 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:11:48,579 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:11:49,010 INFO] src.backtester: Backtest [M15]: Sharpe=-3.892 | MaxDD=0.118 | WR=0.317 | Return=-11.2% | Trades=142
[2026-05-18 11:11:49,010 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:11:49,454 INFO] src.engine_xgb: XGB Train Acc: 0.5054 | Test Acc: 0.4893
[2026-05-18 11:11:49,455 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13860041), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12986939), 'atr_normalized': np.float32(0.113450706), 'prev_log_return': np.float32(0.1305887), 'usdchf_log_return': np.float32(0.12226588), 'xagusd_log_return': np.float32(0.12290925), 'xtiusd_log_return': np.float32(0.123608336), 'synth_vix_zscore': np.float32(0.118707396)}
[2026-05-18 11:11:49,455 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:11:49,687 INFO] src.engine_xgb: XGB Train Acc: 0.4956 | Test Acc: 0.5125
[2026-05-18 11:11:49,687 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10826458), 'gmm_vol_cluster': np.float32(0.10248358), 'rsi_slope': np.float32(0.12567276), 'atr_normalized': np.float32(0.10262082), 'prev_log_return': np.float32(0.12906894), 'usdchf_log_return': np.float32(0.09736567), 'xagusd_log_return': np.float32(0.10886709), 'xtiusd_log_return': np.float32(0.11562072), 'synth_vix_zscore': np.float32(0.11003586)}
[2026-05-18 11:11:49,688 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:11:49,981 INFO] src.engine_xgb: XGB Train Acc: 0.5100 | Test Acc: 0.5034
[2026-05-18 11:11:49,981 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11012012), 'gmm_vol_cluster': np.float32(0.11823689), 'rsi_slope': np.float32(0.11919736), 'atr_normalized': np.float32(0.10282144), 'prev_log_return': np.float32(0.11533347), 'usdchf_log_return': np.float32(0.10047678), 'xagusd_log_return': np.float32(0.103559755), 'xtiusd_log_return': np.float32(0.11063876), 'synth_vix_zscore': np.float32(0.119615406)}
[2026-05-18 11:11:49,982 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:11:49,982 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:11:50,338 INFO] src.backtester: Backtest [M15]: Sharpe=-3.206 | MaxDD=0.254 | WR=0.320 | Return=-22.3% | Trades=303
[2026-05-18 11:11:50,339 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:11:50,753 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 11:11:50,754 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11830622), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13973911), 'atr_normalized': np.float32(0.123321205), 'prev_log_return': np.float32(0.14525297), 'usdchf_log_return': np.float32(0.1255754), 'xagusd_log_return': np.float32(0.107727356), 'xtiusd_log_return': np.float32(0.121889986), 'synth_vix_zscore': np.float32(0.11818773)}
[2026-05-18 11:11:50,755 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:11:51,102 INFO] src.engine_xgb: XGB Train Acc: 0.5073 | Test Acc: 0.4735
[2026-05-18 11:11:51,103 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12105292), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14272715), 'atr_normalized': np.float32(0.11682111), 'prev_log_return': np.float32(0.13026136), 'usdchf_log_return': np.float32(0.11481767), 'xagusd_log_return': np.float32(0.120187216), 'xtiusd_log_return': np.float32(0.12355525), 'synth_vix_zscore': np.float32(0.13057734)}
[2026-05-18 11:11:51,104 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:11:51,574 INFO] src.engine_xgb: XGB Train Acc: 0.5154 | Test Acc: 0.4840
[2026-05-18 11:11:51,575 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11562925), 'gmm_vol_cluster': np.float32(0.0989646), 'rsi_slope': np.float32(0.1317202), 'atr_normalized': np.float32(0.11165989), 'prev_log_return': np.float32(0.113889754), 'usdchf_log_return': np.float32(0.10646309), 'xagusd_log_return': np.float32(0.10240525), 'xtiusd_log_return': np.float32(0.10408162), 'synth_vix_zscore': np.float32(0.11518631)}
[2026-05-18 11:11:51,576 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:11:51,577 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:11:51,718 INFO] src.backtester: Backtest [M15]: Sharpe=-5.105 | MaxDD=0.293 | WR=0.328 | Return=-24.3% | Trades=345
[2026-05-18 11:11:51,718 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 59%|███████████████████████████████████████████▎ | 41/70 [1:03:42<54:16, 112.29s/it][2026-05-18 11:14:14,317 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:14:14,318 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:14:14,318 INFO] src.engine_hmm: Bull 0.9757 0.0063 0.0116 0.0065
[2026-05-18 11:14:14,318 INFO] src.engine_hmm: Bear 0.0055 0.9707 0.0149 0.0088
[2026-05-18 11:14:14,319 INFO] src.engine_hmm: Chop_Low 0.0093 0.0117 0.9782 0.0008
[2026-05-18 11:14:14,319 INFO] src.engine_hmm: Chop_High 0.0109 0.0159 0.0000 0.9731
[2026-05-18 11:14:14,319 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:14:14,319 INFO] src.engine_hmm: Bull: return=0.731246, vol=-0.119045, rsi_slope=-0.033725
[2026-05-18 11:14:14,320 INFO] src.engine_hmm: Bear: return=-0.581840, vol=-0.004109, rsi_slope=0.027351
[2026-05-18 11:14:14,320 INFO] src.engine_hmm: Chop_Low: return=-0.044334, vol=-0.622880, rsi_slope=0.000327
[2026-05-18 11:14:14,320 INFO] src.engine_hmm: Chop_High: return=-0.097090, vol=1.444411, rsi_slope=0.007046
[2026-05-18 11:14:14,323 INFO] src.engine_hmm: Total regime transitions: 5993
[2026-05-18 11:14:14,323 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 05:30:00: Bull -> Bear
[2026-05-18 11:14:14,324 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 07:15:00: Bear -> Bull
[2026-05-18 11:14:14,324 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 02:00:00: Bull -> Chop_Low
[2026-05-18 11:14:14,324 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 08:30:00: Chop_Low -> Bull
[2026-05-18 11:14:14,325 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 12:30:00: Bull -> Chop_Low
[2026-05-18 11:14:14,325 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 14:30:00: Chop_Low -> Bear
[2026-05-18 11:14:14,325 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Bear -> Chop_High
[2026-05-18 11:14:14,326 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 22:00:00: Chop_High -> Bear
[2026-05-18 11:14:14,326 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Bear -> Chop_Low
[2026-05-18 11:14:14,326 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_Low -> Bull
[2026-05-18 11:14:14,570 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:14:14,591 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:14:14,751 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 11:14:14,752 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15980573), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.10823734), 'atr_normalized': np.float32(0.12700243), 'prev_log_return': np.float32(0.14721201), 'usdchf_log_return': np.float32(0.096997075), 'xagusd_log_return': np.float32(0.113515526), 'xtiusd_log_return': np.float32(0.1138458), 'synth_vix_zscore': np.float32(0.13338399)}
[2026-05-18 11:14:14,753 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:14:14,873 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.5171
[2026-05-18 11:14:14,874 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13254122), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.17560866), 'atr_normalized': np.float32(0.11291736), 'prev_log_return': np.float32(0.11561278), 'usdchf_log_return': np.float32(0.11379944), 'xagusd_log_return': np.float32(0.104669884), 'xtiusd_log_return': np.float32(0.10584742), 'synth_vix_zscore': np.float32(0.13900314)}
[2026-05-18 11:14:14,875 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:14:15,257 INFO] src.engine_xgb: XGB Train Acc: 0.4966 | Test Acc: 0.4886
[2026-05-18 11:14:15,258 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12149672), 'gmm_vol_cluster': np.float32(0.108980104), 'rsi_slope': np.float32(0.10715623), 'atr_normalized': np.float32(0.1285546), 'prev_log_return': np.float32(0.11650585), 'usdchf_log_return': np.float32(0.10789801), 'xagusd_log_return': np.float32(0.098573275), 'xtiusd_log_return': np.float32(0.10376033), 'synth_vix_zscore': np.float32(0.10707488)}
[2026-05-18 11:14:15,259 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:14:15,260 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:14:15,942 INFO] src.backtester: Backtest [M15]: Sharpe=-14.034 | MaxDD=1.494 | WR=0.341 | Return=-77.5% | Trades=2019
[2026-05-18 11:14:15,942 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:14:16,157 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 11:14:16,158 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.22926033), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11059667), 'atr_normalized': np.float32(0.12707232), 'prev_log_return': np.float32(0.13895662), 'usdchf_log_return': np.float32(0.075185664), 'xagusd_log_return': np.float32(0.10324747), 'xtiusd_log_return': np.float32(0.10397023), 'synth_vix_zscore': np.float32(0.11171061)}
[2026-05-18 11:14:16,158 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:14:16,496 INFO] src.engine_xgb: XGB Train Acc: 0.4871 | Test Acc: 0.4577
[2026-05-18 11:14:16,497 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1143149), 'gmm_vol_cluster': np.float32(0.12609363), 'rsi_slope': np.float32(0.12723379), 'atr_normalized': np.float32(0.10346137), 'prev_log_return': np.float32(0.126086), 'usdchf_log_return': np.float32(0.09834119), 'xagusd_log_return': np.float32(0.10663573), 'xtiusd_log_return': np.float32(0.10147513), 'synth_vix_zscore': np.float32(0.09635831)}
[2026-05-18 11:14:16,497 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:14:16,660 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 11:14:16,660 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12636521), 'gmm_vol_cluster': np.float32(0.056549374), 'rsi_slope': np.float32(0.13323654), 'atr_normalized': np.float32(0.095512345), 'prev_log_return': np.float32(0.14015651), 'usdchf_log_return': np.float32(0.09399288), 'xagusd_log_return': np.float32(0.12122874), 'xtiusd_log_return': np.float32(0.09516764), 'synth_vix_zscore': np.float32(0.13779071)}
[2026-05-18 11:14:16,661 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:14:16,663 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:14:17,284 INFO] src.backtester: Backtest [M15]: Sharpe=-15.736 | MaxDD=1.950 | WR=0.375 | Return=-85.8% | Trades=2734
[2026-05-18 11:14:17,285 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:14:17,624 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 11:14:17,625 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13158852), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14739607), 'atr_normalized': np.float32(0.101646446), 'prev_log_return': np.float32(0.14804696), 'usdchf_log_return': np.float32(0.11829728), 'xagusd_log_return': np.float32(0.14462082), 'xtiusd_log_return': np.float32(0.09352045), 'synth_vix_zscore': np.float32(0.114883535)}
[2026-05-18 11:14:17,625 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:14:17,842 INFO] src.engine_xgb: XGB Train Acc: 0.4910 | Test Acc: 0.5131
[2026-05-18 11:14:17,843 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.22694556), 'gmm_vol_cluster': np.float32(0.09124862), 'rsi_slope': np.float32(0.12390603), 'atr_normalized': np.float32(0.08125744), 'prev_log_return': np.float32(0.10972514), 'usdchf_log_return': np.float32(0.086422645), 'xagusd_log_return': np.float32(0.11170043), 'xtiusd_log_return': np.float32(0.087705664), 'synth_vix_zscore': np.float32(0.08108847)}
[2026-05-18 11:14:17,843 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:14:18,296 INFO] src.engine_xgb: XGB Train Acc: 0.4947 | Test Acc: 0.5016
[2026-05-18 11:14:18,297 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16788326), 'gmm_vol_cluster': np.float32(0.088647895), 'rsi_slope': np.float32(0.11561077), 'atr_normalized': np.float32(0.107508905), 'prev_log_return': np.float32(0.10695557), 'usdchf_log_return': np.float32(0.09515288), 'xagusd_log_return': np.float32(0.10795455), 'xtiusd_log_return': np.float32(0.100148566), 'synth_vix_zscore': np.float32(0.110137574)}
[2026-05-18 11:14:18,297 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:14:18,298 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:14:18,956 INFO] src.backtester: Backtest [M15]: Sharpe=-14.420 | MaxDD=1.621 | WR=0.349 | Return=-80.2% | Trades=2182
[2026-05-18 11:14:18,957 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:14:19,281 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 11:14:19,281 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1407022), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15387066), 'atr_normalized': np.float32(0.116401024), 'prev_log_return': np.float32(0.14715847), 'usdchf_log_return': np.float32(0.11897944), 'xagusd_log_return': np.float32(0.097196795), 'xtiusd_log_return': np.float32(0.107919), 'synth_vix_zscore': np.float32(0.117772415)}
[2026-05-18 11:14:19,282 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:14:19,675 INFO] src.engine_xgb: XGB Train Acc: 0.4877 | Test Acc: 0.4652
[2026-05-18 11:14:19,675 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.20362395), 'gmm_vol_cluster': np.float32(0.13446276), 'rsi_slope': np.float32(0.124751866), 'atr_normalized': np.float32(0.081953414), 'prev_log_return': np.float32(0.10370026), 'usdchf_log_return': np.float32(0.088805996), 'xagusd_log_return': np.float32(0.0849632), 'xtiusd_log_return': np.float32(0.081152916), 'synth_vix_zscore': np.float32(0.096585676)}
[2026-05-18 11:14:19,676 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:14:19,974 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 11:14:19,974 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.23014615), 'gmm_vol_cluster': np.float32(0.08325867), 'rsi_slope': np.float32(0.11061215), 'atr_normalized': np.float32(0.09414751), 'prev_log_return': np.float32(0.119268835), 'usdchf_log_return': np.float32(0.07365393), 'xagusd_log_return': np.float32(0.096174985), 'xtiusd_log_return': np.float32(0.07665839), 'synth_vix_zscore': np.float32(0.11607939)}
[2026-05-18 11:14:19,975 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:14:19,976 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:14:20,127 INFO] src.backtester: Backtest [M15]: Sharpe=-10.132 | MaxDD=0.169 | WR=0.378 | Return=-15.2% | Trades=193
[2026-05-18 11:14:20,128 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 60%|████████████████████████████████████████████▍ | 42/70 [1:06:12<57:41, 123.61s/it][2026-05-18 11:16:27,303 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:16:27,303 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:16:27,303 INFO] src.engine_hmm: Bull 0.9732 0.0078 0.0125 0.0066
[2026-05-18 11:16:27,303 INFO] src.engine_hmm: Bear 0.0067 0.9684 0.0156 0.0093
[2026-05-18 11:16:27,304 INFO] src.engine_hmm: Chop_Low 0.0100 0.0114 0.9777 0.0008
[2026-05-18 11:16:27,304 INFO] src.engine_hmm: Chop_High 0.0113 0.0167 0.0000 0.9720
[2026-05-18 11:16:27,304 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:16:27,304 INFO] src.engine_hmm: Bull: return=0.718593, vol=-0.121514, rsi_slope=-0.034746
[2026-05-18 11:16:27,304 INFO] src.engine_hmm: Bear: return=-0.578020, vol=0.019082, rsi_slope=0.027357
[2026-05-18 11:16:27,305 INFO] src.engine_hmm: Chop_Low: return=-0.054627, vol=-0.625034, rsi_slope=0.001787
[2026-05-18 11:16:27,305 INFO] src.engine_hmm: Chop_High: return=-0.081380, vol=1.467229, rsi_slope=0.006707
[2026-05-18 11:16:27,307 INFO] src.engine_hmm: Total regime transitions: 6331
[2026-05-18 11:16:27,307 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 05:30:00: Bull -> Bear
[2026-05-18 11:16:27,307 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 07:15:00: Bear -> Bull
[2026-05-18 11:16:27,307 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 01:30:00: Bull -> Chop_Low
[2026-05-18 11:16:27,308 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 08:30:00: Chop_Low -> Bull
[2026-05-18 11:16:27,308 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 12:30:00: Bull -> Chop_Low
[2026-05-18 11:16:27,308 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 14:15:00: Chop_Low -> Bear
[2026-05-18 11:16:27,308 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Bear -> Chop_High
[2026-05-18 11:16:27,308 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 22:00:00: Chop_High -> Bear
[2026-05-18 11:16:27,309 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 14:30:00: Bear -> Chop_Low
[2026-05-18 11:16:27,309 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 16:45:00: Chop_Low -> Bear
[2026-05-18 11:16:27,457 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:16:27,476 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:16:27,583 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 11:16:27,584 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.18515205), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.103959166), 'atr_normalized': np.float32(0.11959578), 'prev_log_return': np.float32(0.12365164), 'usdchf_log_return': np.float32(0.09864637), 'xagusd_log_return': np.float32(0.11873933), 'xtiusd_log_return': np.float32(0.11872938), 'synth_vix_zscore': np.float32(0.13152628)}
[2026-05-18 11:16:27,584 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:16:27,680 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.5171
[2026-05-18 11:16:27,681 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1594301), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16098227), 'atr_normalized': np.float32(0.10922387), 'prev_log_return': np.float32(0.114195324), 'usdchf_log_return': np.float32(0.11508543), 'xagusd_log_return': np.float32(0.110608436), 'xtiusd_log_return': np.float32(0.108542345), 'synth_vix_zscore': np.float32(0.121932186)}
[2026-05-18 11:16:27,681 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:16:27,771 INFO] src.engine_xgb: XGB Train Acc: 0.4948 | Test Acc: 0.4897
[2026-05-18 11:16:27,772 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13743828), 'gmm_vol_cluster': np.float32(0.1287814), 'rsi_slope': np.float32(0.11499905), 'atr_normalized': np.float32(0.11567662), 'prev_log_return': np.float32(0.11319944), 'usdchf_log_return': np.float32(0.09747551), 'xagusd_log_return': np.float32(0.099986166), 'xtiusd_log_return': np.float32(0.09114292), 'synth_vix_zscore': np.float32(0.10130052)}
[2026-05-18 11:16:27,772 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:16:27,773 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:16:28,083 INFO] src.backtester: Backtest [M15]: Sharpe=-13.480 | MaxDD=1.459 | WR=0.352 | Return=-76.8% | Trades=2020
[2026-05-18 11:16:28,083 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:16:28,260 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 11:16:28,261 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.24246861), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11887174), 'atr_normalized': np.float32(0.11426264), 'prev_log_return': np.float32(0.11893355), 'usdchf_log_return': np.float32(0.10627736), 'xagusd_log_return': np.float32(0.09149202), 'xtiusd_log_return': np.float32(0.09421919), 'synth_vix_zscore': np.float32(0.113474876)}
[2026-05-18 11:16:28,261 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:16:28,649 INFO] src.engine_xgb: XGB Train Acc: 0.4898 | Test Acc: 0.4601
[2026-05-18 11:16:28,649 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13504711), 'gmm_vol_cluster': np.float32(0.12735936), 'rsi_slope': np.float32(0.11419534), 'atr_normalized': np.float32(0.100396074), 'prev_log_return': np.float32(0.114737466), 'usdchf_log_return': np.float32(0.10135199), 'xagusd_log_return': np.float32(0.10794168), 'xtiusd_log_return': np.float32(0.09863788), 'synth_vix_zscore': np.float32(0.100333095)}
[2026-05-18 11:16:28,649 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:16:28,798 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 11:16:28,798 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14469585), 'gmm_vol_cluster': np.float32(0.06489935), 'rsi_slope': np.float32(0.12710744), 'atr_normalized': np.float32(0.09649681), 'prev_log_return': np.float32(0.1341377), 'usdchf_log_return': np.float32(0.0924236), 'xagusd_log_return': np.float32(0.10913249), 'xtiusd_log_return': np.float32(0.090178184), 'synth_vix_zscore': np.float32(0.14092861)}
[2026-05-18 11:16:28,798 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:16:28,800 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:16:29,223 INFO] src.backtester: Backtest [M15]: Sharpe=-14.933 | MaxDD=1.846 | WR=0.386 | Return=-84.2% | Trades=2678
[2026-05-18 11:16:29,223 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:16:29,469 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 11:16:29,470 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.115849994), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14215732), 'atr_normalized': np.float32(0.10648606), 'prev_log_return': np.float32(0.14497133), 'usdchf_log_return': np.float32(0.12622908), 'xagusd_log_return': np.float32(0.1543543), 'xtiusd_log_return': np.float32(0.09240364), 'synth_vix_zscore': np.float32(0.11754822)}
[2026-05-18 11:16:29,470 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:16:29,657 INFO] src.engine_xgb: XGB Train Acc: 0.4910 | Test Acc: 0.5131
[2026-05-18 11:16:29,657 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.28421217), 'gmm_vol_cluster': np.float32(0.05720213), 'rsi_slope': np.float32(0.12241151), 'atr_normalized': np.float32(0.08051418), 'prev_log_return': np.float32(0.10755209), 'usdchf_log_return': np.float32(0.078435816), 'xagusd_log_return': np.float32(0.10465935), 'xtiusd_log_return': np.float32(0.07565006), 'synth_vix_zscore': np.float32(0.089362636)}
[2026-05-18 11:16:29,658 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:16:30,154 INFO] src.engine_xgb: XGB Train Acc: 0.4947 | Test Acc: 0.5016
[2026-05-18 11:16:30,154 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.17185996), 'gmm_vol_cluster': np.float32(0.100485645), 'rsi_slope': np.float32(0.109224245), 'atr_normalized': np.float32(0.10153736), 'prev_log_return': np.float32(0.10780033), 'usdchf_log_return': np.float32(0.09512257), 'xagusd_log_return': np.float32(0.107892275), 'xtiusd_log_return': np.float32(0.0986724), 'synth_vix_zscore': np.float32(0.107405275)}
[2026-05-18 11:16:30,155 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:16:30,156 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:16:30,589 INFO] src.backtester: Backtest [M15]: Sharpe=-14.217 | MaxDD=1.605 | WR=0.347 | Return=-79.9% | Trades=2218
[2026-05-18 11:16:30,590 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:16:30,843 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 11:16:30,844 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12147989), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16343927), 'atr_normalized': np.float32(0.119116865), 'prev_log_return': np.float32(0.14546001), 'usdchf_log_return': np.float32(0.10972929), 'xagusd_log_return': np.float32(0.10820018), 'xtiusd_log_return': np.float32(0.1183373), 'synth_vix_zscore': np.float32(0.114237115)}
[2026-05-18 11:16:30,844 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:16:31,371 INFO] src.engine_xgb: XGB Train Acc: 0.4877 | Test Acc: 0.4652
[2026-05-18 11:16:31,372 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.19766334), 'gmm_vol_cluster': np.float32(0.1199653), 'rsi_slope': np.float32(0.11653474), 'atr_normalized': np.float32(0.09120574), 'prev_log_return': np.float32(0.113365196), 'usdchf_log_return': np.float32(0.08828886), 'xagusd_log_return': np.float32(0.08939927), 'xtiusd_log_return': np.float32(0.08634135), 'synth_vix_zscore': np.float32(0.09723617)}
[2026-05-18 11:16:31,372 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:16:31,778 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 11:16:31,779 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.20372266), 'gmm_vol_cluster': np.float32(0.09201862), 'rsi_slope': np.float32(0.11969326), 'atr_normalized': np.float32(0.09896444), 'prev_log_return': np.float32(0.10814953), 'usdchf_log_return': np.float32(0.08940066), 'xagusd_log_return': np.float32(0.0916905), 'xtiusd_log_return': np.float32(0.08093916), 'synth_vix_zscore': np.float32(0.11542119)}
[2026-05-18 11:16:31,779 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:16:31,781 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:16:31,926 INFO] src.backtester: Backtest [M15]: Sharpe=-9.717 | MaxDD=0.167 | WR=0.391 | Return=-15.0% | Trades=207
[2026-05-18 11:16:31,926 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 61%|█████████████████████████████████████████████▍ | 43/70 [1:08:23<56:30, 125.56s/it][2026-05-18 11:18:01,227 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:18:01,229 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:18:01,229 INFO] src.engine_hmm: Bull 0.9556 0.0110 0.0006 0.0327
[2026-05-18 11:18:01,229 INFO] src.engine_hmm: Bear 0.0318 0.9667 0.0003 0.0012
[2026-05-18 11:18:01,229 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9745 0.0236
[2026-05-18 11:18:01,229 INFO] src.engine_hmm: Chop_High 0.0243 0.0016 0.0260 0.9481
[2026-05-18 11:18:01,230 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:18:01,230 INFO] src.engine_hmm: Bull: return=0.052481, vol=0.382343, rsi_slope=0.000613
[2026-05-18 11:18:01,230 INFO] src.engine_hmm: Bear: return=-0.150593, vol=1.875433, rsi_slope=0.009642
[2026-05-18 11:18:01,230 INFO] src.engine_hmm: Chop_Low: return=-0.020392, vol=-0.670070, rsi_slope=0.000359
[2026-05-18 11:18:01,230 INFO] src.engine_hmm: Chop_High: return=0.029019, vol=-0.246122, rsi_slope=-0.004125
[2026-05-18 11:18:01,232 INFO] src.engine_hmm: Total regime transitions: 9481
[2026-05-18 11:18:01,232 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 11:18:01,233 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 11:18:01,233 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 11:18:01,233 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 11:18:01,233 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 11:18:01,233 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 11:18:01,234 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 11:18:01,234 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 11:18:01,234 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 11:18:01,234 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 11:18:01,390 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:18:01,406 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:18:01,529 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 11:18:01,530 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16646065), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.112682156), 'atr_normalized': np.float32(0.12246807), 'prev_log_return': np.float32(0.13480599), 'usdchf_log_return': np.float32(0.107019596), 'xagusd_log_return': np.float32(0.11241135), 'xtiusd_log_return': np.float32(0.122473896), 'synth_vix_zscore': np.float32(0.121678255)}
[2026-05-18 11:18:01,530 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:18:01,659 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.5171
[2026-05-18 11:18:01,660 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11530096), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16459262), 'atr_normalized': np.float32(0.11820564), 'prev_log_return': np.float32(0.120379), 'usdchf_log_return': np.float32(0.12658483), 'xagusd_log_return': np.float32(0.114702836), 'xtiusd_log_return': np.float32(0.12042767), 'synth_vix_zscore': np.float32(0.11980643)}
[2026-05-18 11:18:01,660 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:18:01,758 INFO] src.engine_xgb: XGB Train Acc: 0.4948 | Test Acc: 0.4897
[2026-05-18 11:18:01,758 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0884988), 'gmm_vol_cluster': np.float32(0.105945945), 'rsi_slope': np.float32(0.122291654), 'atr_normalized': np.float32(0.10695533), 'prev_log_return': np.float32(0.1420914), 'usdchf_log_return': np.float32(0.10377128), 'xagusd_log_return': np.float32(0.11312439), 'xtiusd_log_return': np.float32(0.10690491), 'synth_vix_zscore': np.float32(0.11041634)}
[2026-05-18 11:18:01,759 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:18:01,760 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:18:02,139 INFO] src.backtester: Backtest [M15]: Sharpe=-4.862 | MaxDD=0.836 | WR=0.361 | Return=-56.5% | Trades=1071
[2026-05-18 11:18:02,140 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:18:02,334 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 11:18:02,335 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13241272), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13876835), 'atr_normalized': np.float32(0.1220234), 'prev_log_return': np.float32(0.13868138), 'usdchf_log_return': np.float32(0.111571975), 'xagusd_log_return': np.float32(0.11391093), 'xtiusd_log_return': np.float32(0.12974645), 'synth_vix_zscore': np.float32(0.11288485)}
[2026-05-18 11:18:02,335 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:18:02,497 INFO] src.engine_xgb: XGB Train Acc: 0.4871 | Test Acc: 0.4577
[2026-05-18 11:18:02,497 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.104817554), 'gmm_vol_cluster': np.float32(0.14033844), 'rsi_slope': np.float32(0.12488258), 'atr_normalized': np.float32(0.09406541), 'prev_log_return': np.float32(0.120460205), 'usdchf_log_return': np.float32(0.098110534), 'xagusd_log_return': np.float32(0.111743), 'xtiusd_log_return': np.float32(0.10514137), 'synth_vix_zscore': np.float32(0.100440964)}
[2026-05-18 11:18:02,498 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:18:02,650 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 11:18:02,650 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.07430394), 'gmm_vol_cluster': np.float32(0.07686584), 'rsi_slope': np.float32(0.14513399), 'atr_normalized': np.float32(0.10271174), 'prev_log_return': np.float32(0.1429131), 'usdchf_log_return': np.float32(0.11181799), 'xagusd_log_return': np.float32(0.119699016), 'xtiusd_log_return': np.float32(0.0938144), 'synth_vix_zscore': np.float32(0.13273999)}
[2026-05-18 11:18:02,651 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:18:02,652 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:18:03,028 INFO] src.backtester: Backtest [M15]: Sharpe=-5.626 | MaxDD=0.675 | WR=0.335 | Return=-48.9% | Trades=927
[2026-05-18 11:18:03,028 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:18:03,259 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 11:18:03,259 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1413422), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14789577), 'atr_normalized': np.float32(0.11263824), 'prev_log_return': np.float32(0.13438642), 'usdchf_log_return': np.float32(0.1243495), 'xagusd_log_return': np.float32(0.11872819), 'xtiusd_log_return': np.float32(0.100564085), 'synth_vix_zscore': np.float32(0.120095626)}
[2026-05-18 11:18:03,260 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:18:03,444 INFO] src.engine_xgb: XGB Train Acc: 0.4910 | Test Acc: 0.5131
[2026-05-18 11:18:03,444 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12519558), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1524833), 'atr_normalized': np.float32(0.12109379), 'prev_log_return': np.float32(0.13423288), 'usdchf_log_return': np.float32(0.10364334), 'xagusd_log_return': np.float32(0.12442425), 'xtiusd_log_return': np.float32(0.123788804), 'synth_vix_zscore': np.float32(0.11513807)}
[2026-05-18 11:18:03,445 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:18:03,649 INFO] src.engine_xgb: XGB Train Acc: 0.4947 | Test Acc: 0.5016
[2026-05-18 11:18:03,650 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13643083), 'gmm_vol_cluster': np.float32(0.07484296), 'rsi_slope': np.float32(0.12575173), 'atr_normalized': np.float32(0.09565379), 'prev_log_return': np.float32(0.12947609), 'usdchf_log_return': np.float32(0.10380694), 'xagusd_log_return': np.float32(0.114362985), 'xtiusd_log_return': np.float32(0.10163388), 'synth_vix_zscore': np.float32(0.11804078)}
[2026-05-18 11:18:03,650 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:18:03,652 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:18:04,038 INFO] src.backtester: Backtest [M15]: Sharpe=-6.369 | MaxDD=0.920 | WR=0.338 | Return=-60.1% | Trades=1088
[2026-05-18 11:18:04,038 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:18:04,288 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 11:18:04,289 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12641492), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16092649), 'atr_normalized': np.float32(0.12308647), 'prev_log_return': np.float32(0.13941443), 'usdchf_log_return': np.float32(0.123325445), 'xagusd_log_return': np.float32(0.10889172), 'xtiusd_log_return': np.float32(0.109835535), 'synth_vix_zscore': np.float32(0.10810492)}
[2026-05-18 11:18:04,289 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:18:04,494 INFO] src.engine_xgb: XGB Train Acc: 0.4877 | Test Acc: 0.4652
[2026-05-18 11:18:04,494 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09345376), 'gmm_vol_cluster': np.float32(0.12620276), 'rsi_slope': np.float32(0.1439215), 'atr_normalized': np.float32(0.09894017), 'prev_log_return': np.float32(0.121362954), 'usdchf_log_return': np.float32(0.0979409), 'xagusd_log_return': np.float32(0.09903101), 'xtiusd_log_return': np.float32(0.10578017), 'synth_vix_zscore': np.float32(0.11336681)}
[2026-05-18 11:18:04,496 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:18:04,750 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 11:18:04,751 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.104652986), 'gmm_vol_cluster': np.float32(0.11650605), 'rsi_slope': np.float32(0.14782), 'atr_normalized': np.float32(0.09779398), 'prev_log_return': np.float32(0.115545996), 'usdchf_log_return': np.float32(0.1002412), 'xagusd_log_return': np.float32(0.105908744), 'xtiusd_log_return': np.float32(0.091172166), 'synth_vix_zscore': np.float32(0.12035892)}
[2026-05-18 11:18:04,751 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:18:04,752 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:18:04,889 INFO] src.backtester: Backtest [M15]: Sharpe=-5.965 | MaxDD=0.476 | WR=0.385 | Return=-37.0% | Trades=654
[2026-05-18 11:18:04,890 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 63%|██████████████████████████████████████████████▌ | 44/70 [1:09:55<50:10, 115.77s/it][2026-05-18 11:19:34,876 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:19:34,876 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:19:34,876 INFO] src.engine_hmm: Bull 0.9557 0.0115 0.0006 0.0322
[2026-05-18 11:19:34,876 INFO] src.engine_hmm: Bear 0.0299 0.9682 0.0004 0.0015
[2026-05-18 11:19:34,877 INFO] src.engine_hmm: Chop_Low 0.0013 0.0007 0.9738 0.0242
[2026-05-18 11:19:34,877 INFO] src.engine_hmm: Chop_High 0.0247 0.0016 0.0258 0.9478
[2026-05-18 11:19:34,877 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:19:34,877 INFO] src.engine_hmm: Bull: return=0.113103, vol=0.342521, rsi_slope=-0.002586
[2026-05-18 11:19:34,877 INFO] src.engine_hmm: Bear: return=-0.130663, vol=1.763655, rsi_slope=0.011130
[2026-05-18 11:19:34,877 INFO] src.engine_hmm: Chop_Low: return=-0.061495, vol=-0.675966, rsi_slope=0.002180
[2026-05-18 11:19:34,877 INFO] src.engine_hmm: Chop_High: return=0.016257, vol=-0.264399, rsi_slope=-0.004209
[2026-05-18 11:19:34,879 INFO] src.engine_hmm: Total regime transitions: 9515
[2026-05-18 11:19:34,879 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 11:19:34,880 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 23:15:00: Bull -> Chop_High
[2026-05-18 11:19:34,880 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 11:19:34,881 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 11:19:34,881 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 11:19:34,881 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 11:19:34,881 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 11:19:34,881 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 11:19:34,882 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 11:19:34,882 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:30:00: Chop_High -> Bull
[2026-05-18 11:19:35,036 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:19:35,049 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:19:35,178 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 11:19:35,179 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16353443), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11074305), 'atr_normalized': np.float32(0.113505505), 'prev_log_return': np.float32(0.13625525), 'usdchf_log_return': np.float32(0.117680214), 'xagusd_log_return': np.float32(0.09323997), 'xtiusd_log_return': np.float32(0.11976573), 'synth_vix_zscore': np.float32(0.14527585)}
[2026-05-18 11:19:35,179 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:19:35,278 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.5171
[2026-05-18 11:19:35,278 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10451745), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.22882913), 'atr_normalized': np.float32(0.10963372), 'prev_log_return': np.float32(0.118391946), 'usdchf_log_return': np.float32(0.1124599), 'xagusd_log_return': np.float32(0.10443396), 'xtiusd_log_return': np.float32(0.10037121), 'synth_vix_zscore': np.float32(0.12136268)}
[2026-05-18 11:19:35,279 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:19:35,451 INFO] src.engine_xgb: XGB Train Acc: 0.4949 | Test Acc: 0.4900
[2026-05-18 11:19:35,451 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12145006), 'gmm_vol_cluster': np.float32(0.103213795), 'rsi_slope': np.float32(0.12693398), 'atr_normalized': np.float32(0.11485838), 'prev_log_return': np.float32(0.1204657), 'usdchf_log_return': np.float32(0.10256745), 'xagusd_log_return': np.float32(0.11058393), 'xtiusd_log_return': np.float32(0.09992717), 'synth_vix_zscore': np.float32(0.09999945)}
[2026-05-18 11:19:35,452 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:19:35,453 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:19:35,851 INFO] src.backtester: Backtest [M15]: Sharpe=-5.104 | MaxDD=0.876 | WR=0.348 | Return=-58.3% | Trades=1143
[2026-05-18 11:19:35,852 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:19:36,036 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 11:19:36,037 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13074929), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12982842), 'atr_normalized': np.float32(0.12859425), 'prev_log_return': np.float32(0.16613612), 'usdchf_log_return': np.float32(0.10610297), 'xagusd_log_return': np.float32(0.0877566), 'xtiusd_log_return': np.float32(0.13441028), 'synth_vix_zscore': np.float32(0.11642207)}
[2026-05-18 11:19:36,037 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:19:36,435 INFO] src.engine_xgb: XGB Train Acc: 0.4911 | Test Acc: 0.4615
[2026-05-18 11:19:36,436 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11196723), 'gmm_vol_cluster': np.float32(0.11882701), 'rsi_slope': np.float32(0.14097612), 'atr_normalized': np.float32(0.10280807), 'prev_log_return': np.float32(0.12319984), 'usdchf_log_return': np.float32(0.09386572), 'xagusd_log_return': np.float32(0.102364674), 'xtiusd_log_return': np.float32(0.09861658), 'synth_vix_zscore': np.float32(0.107374735)}
[2026-05-18 11:19:36,436 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:19:36,598 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 11:19:36,598 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.106136166), 'gmm_vol_cluster': np.float32(0.06325476), 'rsi_slope': np.float32(0.15517992), 'atr_normalized': np.float32(0.08659918), 'prev_log_return': np.float32(0.13839968), 'usdchf_log_return': np.float32(0.076682866), 'xagusd_log_return': np.float32(0.13796233), 'xtiusd_log_return': np.float32(0.08409491), 'synth_vix_zscore': np.float32(0.15169013)}
[2026-05-18 11:19:36,599 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:19:36,600 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:19:37,029 INFO] src.backtester: Backtest [M15]: Sharpe=-5.794 | MaxDD=0.720 | WR=0.351 | Return=-51.2% | Trades=1002
[2026-05-18 11:19:37,029 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:19:37,258 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 11:19:37,259 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12367899), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1504903), 'atr_normalized': np.float32(0.10809767), 'prev_log_return': np.float32(0.16610888), 'usdchf_log_return': np.float32(0.0997735), 'xagusd_log_return': np.float32(0.15571985), 'xtiusd_log_return': np.float32(0.10268226), 'synth_vix_zscore': np.float32(0.09344856)}
[2026-05-18 11:19:37,259 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:19:37,525 INFO] src.engine_xgb: XGB Train Acc: 0.4910 | Test Acc: 0.5131
[2026-05-18 11:19:37,525 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.077929564), 'gmm_vol_cluster': np.float32(0.09884893), 'rsi_slope': np.float32(0.16607213), 'atr_normalized': np.float32(0.1118553), 'prev_log_return': np.float32(0.1441672), 'usdchf_log_return': np.float32(0.08643854), 'xagusd_log_return': np.float32(0.11633389), 'xtiusd_log_return': np.float32(0.10234763), 'synth_vix_zscore': np.float32(0.096006796)}
[2026-05-18 11:19:37,526 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:19:37,848 INFO] src.engine_xgb: XGB Train Acc: 0.4947 | Test Acc: 0.5016
[2026-05-18 11:19:37,849 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13487816), 'gmm_vol_cluster': np.float32(0.08791114), 'rsi_slope': np.float32(0.15720086), 'atr_normalized': np.float32(0.100379266), 'prev_log_return': np.float32(0.118490376), 'usdchf_log_return': np.float32(0.090341315), 'xagusd_log_return': np.float32(0.10512099), 'xtiusd_log_return': np.float32(0.09079351), 'synth_vix_zscore': np.float32(0.114884354)}
[2026-05-18 11:19:37,849 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:19:37,850 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:19:38,252 INFO] src.backtester: Backtest [M15]: Sharpe=-6.870 | MaxDD=1.001 | WR=0.336 | Return=-63.2% | Trades=1178
[2026-05-18 11:19:38,253 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:19:38,476 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 11:19:38,476 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.18613626), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15604152), 'atr_normalized': np.float32(0.113520265), 'prev_log_return': np.float32(0.15513374), 'usdchf_log_return': np.float32(0.1005778), 'xagusd_log_return': np.float32(0.08681201), 'xtiusd_log_return': np.float32(0.10322249), 'synth_vix_zscore': np.float32(0.098555885)}
[2026-05-18 11:19:38,476 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:19:38,730 INFO] src.engine_xgb: XGB Train Acc: 0.4877 | Test Acc: 0.4652
[2026-05-18 11:19:38,731 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09517385), 'gmm_vol_cluster': np.float32(0.08347785), 'rsi_slope': np.float32(0.18411988), 'atr_normalized': np.float32(0.09710633), 'prev_log_return': np.float32(0.14228253), 'usdchf_log_return': np.float32(0.0974892), 'xagusd_log_return': np.float32(0.09573848), 'xtiusd_log_return': np.float32(0.094100714), 'synth_vix_zscore': np.float32(0.11051116)}
[2026-05-18 11:19:38,731 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:19:38,990 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 11:19:38,990 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13413705), 'gmm_vol_cluster': np.float32(0.053136934), 'rsi_slope': np.float32(0.16302253), 'atr_normalized': np.float32(0.09613737), 'prev_log_return': np.float32(0.13576443), 'usdchf_log_return': np.float32(0.103803486), 'xagusd_log_return': np.float32(0.07706061), 'xtiusd_log_return': np.float32(0.07124477), 'synth_vix_zscore': np.float32(0.1656928)}
[2026-05-18 11:19:38,991 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:19:38,992 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:19:39,128 INFO] src.backtester: Backtest [M15]: Sharpe=-5.844 | MaxDD=0.469 | WR=0.397 | Return=-36.6% | Trades=686
[2026-05-18 11:19:39,128 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[ 45/70] Best Score: -0.500 | ETA: 39m 43s RAM: 59%
Best trial: 4. Best value: -0.5: 64%|███████████████████████████████████████████████▌ | 45/70 [1:11:30<45:32, 109.32s/it][2026-05-18 11:20:55,777 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:20:55,778 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:20:55,778 INFO] src.engine_hmm: Bull 0.9731 0.0078 0.0125 0.0066
[2026-05-18 11:20:55,778 INFO] src.engine_hmm: Bear 0.0067 0.9683 0.0156 0.0093
[2026-05-18 11:20:55,778 INFO] src.engine_hmm: Chop_Low 0.0100 0.0114 0.9777 0.0008
[2026-05-18 11:20:55,779 INFO] src.engine_hmm: Chop_High 0.0113 0.0167 0.0000 0.9720
[2026-05-18 11:20:55,779 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:20:55,779 INFO] src.engine_hmm: Bull: return=0.718145, vol=-0.121333, rsi_slope=-0.034713
[2026-05-18 11:20:55,779 INFO] src.engine_hmm: Bear: return=-0.577983, vol=0.019661, rsi_slope=0.027304
[2026-05-18 11:20:55,779 INFO] src.engine_hmm: Chop_Low: return=-0.054740, vol=-0.625062, rsi_slope=0.001815
[2026-05-18 11:20:55,779 INFO] src.engine_hmm: Chop_High: return=-0.081170, vol=1.468007, rsi_slope=0.006721
[2026-05-18 11:20:55,781 INFO] src.engine_hmm: Total regime transitions: 6351
[2026-05-18 11:20:55,781 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 05:30:00: Bull -> Bear
[2026-05-18 11:20:55,781 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 07:15:00: Bear -> Bull
[2026-05-18 11:20:55,782 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 01:30:00: Bull -> Chop_Low
[2026-05-18 11:20:55,782 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 08:30:00: Chop_Low -> Bull
[2026-05-18 11:20:55,782 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 12:30:00: Bull -> Chop_Low
[2026-05-18 11:20:55,782 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 14:15:00: Chop_Low -> Bear
[2026-05-18 11:20:55,782 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Bear -> Chop_High
[2026-05-18 11:20:55,783 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 22:00:00: Chop_High -> Bear
[2026-05-18 11:20:55,783 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 14:30:00: Bear -> Chop_Low
[2026-05-18 11:20:55,783 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 16:45:00: Chop_Low -> Bear
[2026-05-18 11:20:55,936 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:20:55,955 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:20:56,075 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 11:20:56,076 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.20051733), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11006019), 'atr_normalized': np.float32(0.12324839), 'prev_log_return': np.float32(0.13465726), 'usdchf_log_return': np.float32(0.10002693), 'xagusd_log_return': np.float32(0.09180103), 'xtiusd_log_return': np.float32(0.103940144), 'synth_vix_zscore': np.float32(0.1357487)}
[2026-05-18 11:20:56,076 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:20:56,200 INFO] src.engine_xgb: XGB Train Acc: 0.5277 | Test Acc: 0.5106
[2026-05-18 11:20:56,201 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15306972), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.19262685), 'atr_normalized': np.float32(0.10687793), 'prev_log_return': np.float32(0.11681255), 'usdchf_log_return': np.float32(0.10647975), 'xagusd_log_return': np.float32(0.11042368), 'xtiusd_log_return': np.float32(0.09529782), 'synth_vix_zscore': np.float32(0.11841166)}
[2026-05-18 11:20:56,201 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:20:56,456 INFO] src.engine_xgb: XGB Train Acc: 0.5543 | Test Acc: 0.5044
[2026-05-18 11:20:56,457 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13760561), 'gmm_vol_cluster': np.float32(0.13560568), 'rsi_slope': np.float32(0.1087306), 'atr_normalized': np.float32(0.11479395), 'prev_log_return': np.float32(0.11089456), 'usdchf_log_return': np.float32(0.097251475), 'xagusd_log_return': np.float32(0.104630105), 'xtiusd_log_return': np.float32(0.10055381), 'synth_vix_zscore': np.float32(0.089934245)}
[2026-05-18 11:20:56,457 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:20:56,458 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:20:56,813 INFO] src.backtester: Backtest [M15]: Sharpe=-5.339 | MaxDD=0.311 | WR=0.386 | Return=-26.5% | Trades=516
[2026-05-18 11:20:56,813 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:20:57,023 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 11:20:57,023 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.26512247), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.110698424), 'atr_normalized': np.float32(0.11411933), 'prev_log_return': np.float32(0.11505801), 'usdchf_log_return': np.float32(0.08693208), 'xagusd_log_return': np.float32(0.0955992), 'xtiusd_log_return': np.float32(0.10043541), 'synth_vix_zscore': np.float32(0.112035096)}
[2026-05-18 11:20:57,023 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:20:57,552 INFO] src.engine_xgb: XGB Train Acc: 0.5558 | Test Acc: 0.4975
[2026-05-18 11:20:57,552 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15319279), 'gmm_vol_cluster': np.float32(0.11966647), 'rsi_slope': np.float32(0.122710355), 'atr_normalized': np.float32(0.09994827), 'prev_log_return': np.float32(0.11903528), 'usdchf_log_return': np.float32(0.096059784), 'xagusd_log_return': np.float32(0.0947726), 'xtiusd_log_return': np.float32(0.097719), 'synth_vix_zscore': np.float32(0.09689547)}
[2026-05-18 11:20:57,553 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:20:57,925 INFO] src.engine_xgb: XGB Train Acc: 0.5463 | Test Acc: 0.5142
[2026-05-18 11:20:57,925 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14229204), 'gmm_vol_cluster': np.float32(0.09245707), 'rsi_slope': np.float32(0.122706786), 'atr_normalized': np.float32(0.10337382), 'prev_log_return': np.float32(0.12179135), 'usdchf_log_return': np.float32(0.09272297), 'xagusd_log_return': np.float32(0.10390791), 'xtiusd_log_return': np.float32(0.0922157), 'synth_vix_zscore': np.float32(0.12853234)}
[2026-05-18 11:20:57,926 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:20:57,927 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:20:58,302 INFO] src.backtester: Backtest [M15]: Sharpe=-9.260 | MaxDD=0.650 | WR=0.388 | Return=-47.6% | Trades=923
[2026-05-18 11:20:58,303 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:20:58,599 INFO] src.engine_xgb: XGB Train Acc: 0.4956 | Test Acc: 0.4871
[2026-05-18 11:20:58,600 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13203216), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14866053), 'atr_normalized': np.float32(0.114486374), 'prev_log_return': np.float32(0.15111677), 'usdchf_log_return': np.float32(0.11437983), 'xagusd_log_return': np.float32(0.13283496), 'xtiusd_log_return': np.float32(0.098231055), 'synth_vix_zscore': np.float32(0.10825831)}
[2026-05-18 11:20:58,600 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:20:58,785 INFO] src.engine_xgb: XGB Train Acc: 0.4912 | Test Acc: 0.5131
[2026-05-18 11:20:58,786 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.3177641), 'gmm_vol_cluster': np.float32(0.06445808), 'rsi_slope': np.float32(0.11896613), 'atr_normalized': np.float32(0.078470655), 'prev_log_return': np.float32(0.10290907), 'usdchf_log_return': np.float32(0.070373476), 'xagusd_log_return': np.float32(0.09857103), 'xtiusd_log_return': np.float32(0.07110091), 'synth_vix_zscore': np.float32(0.07738655)}
[2026-05-18 11:20:58,786 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:20:59,702 INFO] src.engine_xgb: XGB Train Acc: 0.5540 | Test Acc: 0.5184
[2026-05-18 11:20:59,703 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.17158297), 'gmm_vol_cluster': np.float32(0.113775745), 'rsi_slope': np.float32(0.10670135), 'atr_normalized': np.float32(0.099954695), 'prev_log_return': np.float32(0.11020723), 'usdchf_log_return': np.float32(0.094508134), 'xagusd_log_return': np.float32(0.09653467), 'xtiusd_log_return': np.float32(0.096559234), 'synth_vix_zscore': np.float32(0.110176)}
[2026-05-18 11:20:59,703 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:20:59,705 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:21:00,114 INFO] src.backtester: Backtest [M15]: Sharpe=-7.561 | MaxDD=0.594 | WR=0.367 | Return=-44.8% | Trades=905
[2026-05-18 11:21:00,115 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:21:00,429 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 11:21:00,430 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15771878), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16408347), 'atr_normalized': np.float32(0.12696141), 'prev_log_return': np.float32(0.14414471), 'usdchf_log_return': np.float32(0.107653625), 'xagusd_log_return': np.float32(0.097515225), 'xtiusd_log_return': np.float32(0.091670156), 'synth_vix_zscore': np.float32(0.11025257)}
[2026-05-18 11:21:00,430 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:21:01,411 INFO] src.engine_xgb: XGB Train Acc: 0.5358 | Test Acc: 0.4978
[2026-05-18 11:21:01,412 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.24537574), 'gmm_vol_cluster': np.float32(0.12577245), 'rsi_slope': np.float32(0.10944967), 'atr_normalized': np.float32(0.08559841), 'prev_log_return': np.float32(0.10288839), 'usdchf_log_return': np.float32(0.07734318), 'xagusd_log_return': np.float32(0.08195637), 'xtiusd_log_return': np.float32(0.08043254), 'synth_vix_zscore': np.float32(0.09118327)}
[2026-05-18 11:21:01,412 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:21:02,548 INFO] src.engine_xgb: XGB Train Acc: 0.5393 | Test Acc: 0.4992
[2026-05-18 11:21:02,548 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.20877695), 'gmm_vol_cluster': np.float32(0.10589619), 'rsi_slope': np.float32(0.114238225), 'atr_normalized': np.float32(0.10041983), 'prev_log_return': np.float32(0.102019325), 'usdchf_log_return': np.float32(0.085693374), 'xagusd_log_return': np.float32(0.08676123), 'xtiusd_log_return': np.float32(0.08523349), 'synth_vix_zscore': np.float32(0.11096143)}
[2026-05-18 11:21:02,549 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:21:02,550 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:21:02,664 INFO] src.backtester: Backtest [M15]: Sharpe=-5.621 | MaxDD=0.069 | WR=0.425 | Return=-6.3% | Trades=120
[2026-05-18 11:21:02,664 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 66%|████████████████████████████████████████████████▋ | 46/70 [1:12:53<40:38, 101.58s/it][2026-05-18 11:21:20,440 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:21:20,440 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:21:20,441 INFO] src.engine_hmm: Bull 0.9565 0.0000 0.0000 0.0435
[2026-05-18 11:21:20,441 INFO] src.engine_hmm: Bear 0.0000 0.9700 0.0002 0.0298
[2026-05-18 11:21:20,441 INFO] src.engine_hmm: Chop_Low 0.0000 0.0011 0.9784 0.0205
[2026-05-18 11:21:20,441 INFO] src.engine_hmm: Chop_High 0.0000 0.0142 0.0228 0.9630
[2026-05-18 11:21:20,441 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:21:20,441 INFO] src.engine_hmm: Bull: return=29.285319, vol=51.587724, rsi_slope=0.482719
[2026-05-18 11:21:20,442 INFO] src.engine_hmm: Bear: return=-0.051456, vol=1.294981, rsi_slope=0.006529
[2026-05-18 11:21:20,442 INFO] src.engine_hmm: Chop_Low: return=-0.005419, vol=-0.614149, rsi_slope=-0.002512
[2026-05-18 11:21:20,442 INFO] src.engine_hmm: Chop_High: return=0.025412, vol=-0.024296, rsi_slope=-0.000793
[2026-05-18 11:21:20,444 INFO] src.engine_hmm: Total regime transitions: 7040
[2026-05-18 11:21:20,444 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 15:30:00: Chop_High -> Bear
[2026-05-18 11:21:20,444 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 19:00:00: Bear -> Chop_High
[2026-05-18 11:21:20,444 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 02:15:00: Chop_High -> Chop_Low
[2026-05-18 11:21:20,445 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 07:00:00: Chop_Low -> Chop_High
[2026-05-18 11:21:20,445 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 11:21:20,445 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 22:15:00: Bear -> Chop_High
[2026-05-18 11:21:20,445 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 11:21:20,445 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:45:00: Chop_Low -> Chop_High
[2026-05-18 11:21:20,446 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 17:00:00: Chop_High -> Bear
[2026-05-18 11:21:20,446 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 20:30:00: Bear -> Chop_High
[2026-05-18 11:21:20,632 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:21:20,652 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:21:20,920 WARNING] src.engine_xgb: hmm_state importance=0: XGBoost ignores the HMM regime. The regime-aligned filter gates signals on a feature XGB deems uninformative — likely caused by heavy regularisation or n_states=2. Consider re-optimising with n_states>=3 or lower reg_alpha/gamma.
[2026-05-18 11:21:20,921 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 11:21:20,921 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14112927), 'atr_normalized': np.float32(0.14808805), 'prev_log_return': np.float32(0.15420672), 'usdchf_log_return': np.float32(0.12778789), 'xagusd_log_return': np.float32(0.13296776), 'xtiusd_log_return': np.float32(0.14707695), 'synth_vix_zscore': np.float32(0.14874338)}
[2026-05-18 11:21:20,922 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:21:21,025 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.5171
[2026-05-18 11:21:21,027 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13799578), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13972983), 'atr_normalized': np.float32(0.12623844), 'prev_log_return': np.float32(0.11341273), 'usdchf_log_return': np.float32(0.123089306), 'xagusd_log_return': np.float32(0.11557604), 'xtiusd_log_return': np.float32(0.122341335), 'synth_vix_zscore': np.float32(0.1216166)}
[2026-05-18 11:21:21,027 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:21:21,131 INFO] src.engine_xgb: XGB Train Acc: 0.4948 | Test Acc: 0.4897
[2026-05-18 11:21:21,132 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13261978), 'gmm_vol_cluster': np.float32(0.10152886), 'rsi_slope': np.float32(0.110199384), 'atr_normalized': np.float32(0.10600003), 'prev_log_return': np.float32(0.106997505), 'usdchf_log_return': np.float32(0.10894436), 'xagusd_log_return': np.float32(0.103165746), 'xtiusd_log_return': np.float32(0.1280512), 'synth_vix_zscore': np.float32(0.10249317)}
[2026-05-18 11:21:21,132 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:21:21,133 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:21:21,495 INFO] src.backtester: Backtest [M15]: Sharpe=-6.717 | MaxDD=1.149 | WR=0.329 | Return=-68.3% | Trades=1309
[2026-05-18 11:21:21,495 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:21:21,716 INFO] src.engine_xgb: XGB Train Acc: 0.4989 | Test Acc: 0.4606
[2026-05-18 11:21:21,716 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12669685), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12422062), 'atr_normalized': np.float32(0.12583333), 'prev_log_return': np.float32(0.1244087), 'usdchf_log_return': np.float32(0.11757391), 'xagusd_log_return': np.float32(0.13435826), 'xtiusd_log_return': np.float32(0.116930515), 'synth_vix_zscore': np.float32(0.12997773)}
[2026-05-18 11:21:21,717 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:21:21,868 INFO] src.engine_xgb: XGB Train Acc: 0.4960 | Test Acc: 0.4597
[2026-05-18 11:21:21,868 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12935898), 'gmm_vol_cluster': np.float32(0.1205954), 'rsi_slope': np.float32(0.12271664), 'atr_normalized': np.float32(0.09421044), 'prev_log_return': np.float32(0.106405824), 'usdchf_log_return': np.float32(0.112075396), 'xagusd_log_return': np.float32(0.10450461), 'xtiusd_log_return': np.float32(0.102301024), 'synth_vix_zscore': np.float32(0.10783171)}
[2026-05-18 11:21:21,869 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:21:22,012 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 11:21:22,013 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11122984), 'gmm_vol_cluster': np.float32(0.1218185), 'rsi_slope': np.float32(0.10382502), 'atr_normalized': np.float32(0.10540063), 'prev_log_return': np.float32(0.11912795), 'usdchf_log_return': np.float32(0.11020524), 'xagusd_log_return': np.float32(0.100112714), 'xtiusd_log_return': np.float32(0.10215502), 'synth_vix_zscore': np.float32(0.12612517)}
[2026-05-18 11:21:22,013 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:21:22,014 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:21:22,358 INFO] src.backtester: Backtest [M15]: Sharpe=-6.779 | MaxDD=0.641 | WR=0.314 | Return=-47.3% | Trades=802
[2026-05-18 11:21:22,358 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:21:22,609 INFO] src.engine_xgb: XGB Train Acc: 0.4966 | Test Acc: 0.4865
[2026-05-18 11:21:22,609 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09654263), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12642816), 'atr_normalized': np.float32(0.13221888), 'prev_log_return': np.float32(0.13516068), 'usdchf_log_return': np.float32(0.12735634), 'xagusd_log_return': np.float32(0.13126858), 'xtiusd_log_return': np.float32(0.12475437), 'synth_vix_zscore': np.float32(0.12627026)}
[2026-05-18 11:21:22,610 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:21:22,783 INFO] src.engine_xgb: XGB Train Acc: 0.4965 | Test Acc: 0.5111
[2026-05-18 11:21:22,784 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11988506), 'gmm_vol_cluster': np.float32(0.11288435), 'rsi_slope': np.float32(0.116023846), 'atr_normalized': np.float32(0.10492542), 'prev_log_return': np.float32(0.11824561), 'usdchf_log_return': np.float32(0.1079047), 'xagusd_log_return': np.float32(0.11127456), 'xtiusd_log_return': np.float32(0.10714658), 'synth_vix_zscore': np.float32(0.1017098)}
[2026-05-18 11:21:22,784 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:21:22,985 INFO] src.engine_xgb: XGB Train Acc: 0.4965 | Test Acc: 0.5022
[2026-05-18 11:21:22,985 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12799366), 'gmm_vol_cluster': np.float32(0.12118647), 'rsi_slope': np.float32(0.11131438), 'atr_normalized': np.float32(0.10636988), 'prev_log_return': np.float32(0.11005988), 'usdchf_log_return': np.float32(0.10287573), 'xagusd_log_return': np.float32(0.1051763), 'xtiusd_log_return': np.float32(0.09957331), 'synth_vix_zscore': np.float32(0.11545038)}
[2026-05-18 11:21:22,985 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:21:22,987 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:21:23,350 INFO] src.backtester: Backtest [M15]: Sharpe=-7.989 | MaxDD=1.091 | WR=0.306 | Return=-66.4% | Trades=1276
[2026-05-18 11:21:23,351 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:21:23,665 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 11:21:23,665 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10589539), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13666265), 'atr_normalized': np.float32(0.13195358), 'prev_log_return': np.float32(0.12154872), 'usdchf_log_return': np.float32(0.12938677), 'xagusd_log_return': np.float32(0.1269137), 'xtiusd_log_return': np.float32(0.12130574), 'synth_vix_zscore': np.float32(0.12633355)}
[2026-05-18 11:21:23,666 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:21:23,939 INFO] src.engine_xgb: XGB Train Acc: 0.4962 | Test Acc: 0.4706
[2026-05-18 11:21:23,939 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10961302), 'gmm_vol_cluster': np.float32(0.073230304), 'rsi_slope': np.float32(0.12444507), 'atr_normalized': np.float32(0.11149295), 'prev_log_return': np.float32(0.11897624), 'usdchf_log_return': np.float32(0.11473998), 'xagusd_log_return': np.float32(0.11493611), 'xtiusd_log_return': np.float32(0.111243635), 'synth_vix_zscore': np.float32(0.12132271)}
[2026-05-18 11:21:23,940 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:21:24,173 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 11:21:24,174 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09571476), 'gmm_vol_cluster': np.float32(0.117151916), 'rsi_slope': np.float32(0.117502004), 'atr_normalized': np.float32(0.11911943), 'prev_log_return': np.float32(0.11648663), 'usdchf_log_return': np.float32(0.102562934), 'xagusd_log_return': np.float32(0.111081794), 'xtiusd_log_return': np.float32(0.105986856), 'synth_vix_zscore': np.float32(0.114393756)}
[2026-05-18 11:21:24,174 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:21:24,175 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:21:24,306 INFO] src.backtester: Backtest [M15]: Sharpe=-5.262 | MaxDD=0.399 | WR=0.375 | Return=-29.8% | Trades=579
[2026-05-18 11:21:24,307 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 67%|██████████████████████████████████████████████████▎ | 47/70 [1:13:15<29:45, 77.61s/it][2026-05-18 11:22:48,122 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:22:48,122 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:22:48,123 INFO] src.engine_hmm: Bull 0.9557 0.0109 0.0006 0.0328
[2026-05-18 11:22:48,123 INFO] src.engine_hmm: Bear 0.0322 0.9664 0.0003 0.0011
[2026-05-18 11:22:48,123 INFO] src.engine_hmm: Chop_Low 0.0013 0.0006 0.9744 0.0237
[2026-05-18 11:22:48,123 INFO] src.engine_hmm: Chop_High 0.0242 0.0016 0.0260 0.9482
[2026-05-18 11:22:48,123 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:22:48,123 INFO] src.engine_hmm: Bull: return=0.053228, vol=0.383173, rsi_slope=0.000994
[2026-05-18 11:22:48,125 INFO] src.engine_hmm: Bear: return=-0.154520, vol=1.887689, rsi_slope=0.009015
[2026-05-18 11:22:48,125 INFO] src.engine_hmm: Chop_Low: return=-0.019288, vol=-0.670514, rsi_slope=0.000172
[2026-05-18 11:22:48,125 INFO] src.engine_hmm: Chop_High: return=0.027971, vol=-0.246519, rsi_slope=-0.003993
[2026-05-18 11:22:48,127 INFO] src.engine_hmm: Total regime transitions: 9507
[2026-05-18 11:22:48,127 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 11:22:48,127 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 11:22:48,128 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 11:22:48,128 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:45:00: Bear -> Bull
[2026-05-18 11:22:48,128 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 11:22:48,128 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 11:22:48,129 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 11:22:48,129 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 11:22:48,129 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 11:22:48,129 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 11:22:48,290 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:22:48,305 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:22:48,404 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 11:22:48,404 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.146998), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11072865), 'atr_normalized': np.float32(0.12248444), 'prev_log_return': np.float32(0.14655726), 'usdchf_log_return': np.float32(0.08302016), 'xagusd_log_return': np.float32(0.10700553), 'xtiusd_log_return': np.float32(0.09896494), 'synth_vix_zscore': np.float32(0.184241)}
[2026-05-18 11:22:48,405 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:22:48,622 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.5171
[2026-05-18 11:22:48,622 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09751836), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.26453874), 'atr_normalized': np.float32(0.10029188), 'prev_log_return': np.float32(0.12293451), 'usdchf_log_return': np.float32(0.09240443), 'xagusd_log_return': np.float32(0.10913021), 'xtiusd_log_return': np.float32(0.09629003), 'synth_vix_zscore': np.float32(0.116891794)}
[2026-05-18 11:22:48,623 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:22:48,745 INFO] src.engine_xgb: XGB Train Acc: 0.4948 | Test Acc: 0.4897
[2026-05-18 11:22:48,745 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08393372), 'gmm_vol_cluster': np.float32(0.09291953), 'rsi_slope': np.float32(0.12648487), 'atr_normalized': np.float32(0.09817596), 'prev_log_return': np.float32(0.17352189), 'usdchf_log_return': np.float32(0.09770904), 'xagusd_log_return': np.float32(0.12768371), 'xtiusd_log_return': np.float32(0.091466054), 'synth_vix_zscore': np.float32(0.10810524)}
[2026-05-18 11:22:48,745 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:22:48,746 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:22:49,065 INFO] src.backtester: Backtest [M15]: Sharpe=-4.857 | MaxDD=0.835 | WR=0.360 | Return=-56.5% | Trades=1057
[2026-05-18 11:22:49,066 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:22:49,245 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 11:22:49,246 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08212315), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.17138122), 'atr_normalized': np.float32(0.10994968), 'prev_log_return': np.float32(0.16819987), 'usdchf_log_return': np.float32(0.1052727), 'xagusd_log_return': np.float32(0.1261157), 'xtiusd_log_return': np.float32(0.113961056), 'synth_vix_zscore': np.float32(0.12299664)}
[2026-05-18 11:22:49,246 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:22:49,378 INFO] src.engine_xgb: XGB Train Acc: 0.4871 | Test Acc: 0.4577
[2026-05-18 11:22:49,379 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.07841779), 'gmm_vol_cluster': np.float32(0.09353165), 'rsi_slope': np.float32(0.24634923), 'atr_normalized': np.float32(0.09033721), 'prev_log_return': np.float32(0.15462051), 'usdchf_log_return': np.float32(0.073802695), 'xagusd_log_return': np.float32(0.10155605), 'xtiusd_log_return': np.float32(0.06499213), 'synth_vix_zscore': np.float32(0.096392706)}
[2026-05-18 11:22:49,379 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:22:49,526 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 11:22:49,527 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.071533374), 'gmm_vol_cluster': np.float32(0.06478959), 'rsi_slope': np.float32(0.1661838), 'atr_normalized': np.float32(0.08032973), 'prev_log_return': np.float32(0.16779438), 'usdchf_log_return': np.float32(0.08256978), 'xagusd_log_return': np.float32(0.10965891), 'xtiusd_log_return': np.float32(0.0723552), 'synth_vix_zscore': np.float32(0.18478528)}
[2026-05-18 11:22:49,527 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:22:49,528 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:22:49,863 INFO] src.backtester: Backtest [M15]: Sharpe=-5.506 | MaxDD=0.659 | WR=0.342 | Return=-48.1% | Trades=912
[2026-05-18 11:22:49,864 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:22:50,070 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 11:22:50,070 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09011026), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.19232532), 'atr_normalized': np.float32(0.07647917), 'prev_log_return': np.float32(0.1862774), 'usdchf_log_return': np.float32(0.10188762), 'xagusd_log_return': np.float32(0.18528149), 'xtiusd_log_return': np.float32(0.07357063), 'synth_vix_zscore': np.float32(0.094068155)}
[2026-05-18 11:22:50,071 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:22:50,761 INFO] src.engine_xgb: XGB Train Acc: 0.4910 | Test Acc: 0.5131
[2026-05-18 11:22:50,761 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.07089567), 'gmm_vol_cluster': np.float32(0.061977282), 'rsi_slope': np.float32(0.24026851), 'atr_normalized': np.float32(0.09375259), 'prev_log_return': np.float32(0.14120756), 'usdchf_log_return': np.float32(0.077012986), 'xagusd_log_return': np.float32(0.12571734), 'xtiusd_log_return': np.float32(0.092601955), 'synth_vix_zscore': np.float32(0.09656609)}
[2026-05-18 11:22:50,762 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:22:51,079 INFO] src.engine_xgb: XGB Train Acc: 0.4947 | Test Acc: 0.5016
[2026-05-18 11:22:51,080 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.082204156), 'gmm_vol_cluster': np.float32(0.062149808), 'rsi_slope': np.float32(0.20506112), 'atr_normalized': np.float32(0.0894111), 'prev_log_return': np.float32(0.13091388), 'usdchf_log_return': np.float32(0.08885657), 'xagusd_log_return': np.float32(0.10513528), 'xtiusd_log_return': np.float32(0.07642984), 'synth_vix_zscore': np.float32(0.15983827)}
[2026-05-18 11:22:51,081 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:22:51,082 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:22:51,512 INFO] src.backtester: Backtest [M15]: Sharpe=-6.300 | MaxDD=0.910 | WR=0.336 | Return=-59.7% | Trades=1066
[2026-05-18 11:22:51,512 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:22:51,748 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 11:22:51,749 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.120004445), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.23634987), 'atr_normalized': np.float32(0.11976384), 'prev_log_return': np.float32(0.1829759), 'usdchf_log_return': np.float32(0.08395521), 'xagusd_log_return': np.float32(0.09798829), 'xtiusd_log_return': np.float32(0.05861601), 'synth_vix_zscore': np.float32(0.10034639)}
[2026-05-18 11:22:51,749 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:22:51,946 INFO] src.engine_xgb: XGB Train Acc: 0.4877 | Test Acc: 0.4652
[2026-05-18 11:22:51,947 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.075987026), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.30108556), 'atr_normalized': np.float32(0.07682716), 'prev_log_return': np.float32(0.16456346), 'usdchf_log_return': np.float32(0.08691555), 'xagusd_log_return': np.float32(0.10959487), 'xtiusd_log_return': np.float32(0.071963094), 'synth_vix_zscore': np.float32(0.11306337)}
[2026-05-18 11:22:51,948 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:22:52,147 INFO] src.engine_xgb: XGB Train Acc: 0.4899 | Test Acc: 0.4748
[2026-05-18 11:22:52,148 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.096426435), 'gmm_vol_cluster': np.float32(0.064530075), 'rsi_slope': np.float32(0.23885219), 'atr_normalized': np.float32(0.08001062), 'prev_log_return': np.float32(0.13994573), 'usdchf_log_return': np.float32(0.06682485), 'xagusd_log_return': np.float32(0.13222392), 'xtiusd_log_return': np.float32(0.040097136), 'synth_vix_zscore': np.float32(0.14108908)}
[2026-05-18 11:22:52,148 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:22:52,149 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:22:52,291 INFO] src.backtester: Backtest [M15]: Sharpe=-6.043 | MaxDD=0.482 | WR=0.386 | Return=-37.4% | Trades=647
[2026-05-18 11:22:52,291 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 69%|███████████████████████████████████████████████████▍ | 48/70 [1:14:43<29:35, 80.72s/it][2026-05-18 11:23:49,658 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:23:49,658 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:23:49,659 INFO] src.engine_hmm: Bull 0.9556 0.0106 0.0007 0.0332
[2026-05-18 11:23:49,659 INFO] src.engine_hmm: Bear 0.0363 0.9631 0.0001 0.0005
[2026-05-18 11:23:49,659 INFO] src.engine_hmm: Chop_Low 0.0012 0.0008 0.9734 0.0246
[2026-05-18 11:23:49,659 INFO] src.engine_hmm: Chop_High 0.0236 0.0022 0.0263 0.9479
[2026-05-18 11:23:49,659 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:23:49,659 INFO] src.engine_hmm: Bull: return=0.058929, vol=0.387159, rsi_slope=0.003157
[2026-05-18 11:23:49,660 INFO] src.engine_hmm: Bear: return=-0.169978, vol=1.957753, rsi_slope=0.007371
[2026-05-18 11:23:49,660 INFO] src.engine_hmm: Chop_Low: return=-0.010008, vol=-0.673162, rsi_slope=-0.001033
[2026-05-18 11:23:49,660 INFO] src.engine_hmm: Chop_High: return=0.015527, vol=-0.249497, rsi_slope=-0.003847
[2026-05-18 11:23:49,662 INFO] src.engine_hmm: Total regime transitions: 9690
[2026-05-18 11:23:49,662 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 11:23:49,663 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 11:23:49,663 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 11:23:49,663 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:30:00: Bear -> Bull
[2026-05-18 11:23:49,663 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 11:23:49,664 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 11:23:49,664 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 11:23:49,664 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 11:23:49,664 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 11:23:49,664 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 11:23:49,815 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:23:49,830 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:23:49,962 INFO] src.engine_xgb: XGB Train Acc: 0.4958 | Test Acc: 0.4757
[2026-05-18 11:23:49,962 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14250861), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.116986364), 'atr_normalized': np.float32(0.12823895), 'prev_log_return': np.float32(0.13777107), 'usdchf_log_return': np.float32(0.105955), 'xagusd_log_return': np.float32(0.11637507), 'xtiusd_log_return': np.float32(0.12056392), 'synth_vix_zscore': np.float32(0.13160098)}
[2026-05-18 11:23:49,962 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:23:50,081 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.4836
[2026-05-18 11:23:50,081 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10835461), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16724557), 'atr_normalized': np.float32(0.121394984), 'prev_log_return': np.float32(0.12432127), 'usdchf_log_return': np.float32(0.11958616), 'xagusd_log_return': np.float32(0.12410903), 'xtiusd_log_return': np.float32(0.11243922), 'synth_vix_zscore': np.float32(0.12254927)}
[2026-05-18 11:23:50,082 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:23:50,286 INFO] src.engine_xgb: XGB Train Acc: 0.5234 | Test Acc: 0.5148
[2026-05-18 11:23:50,286 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12682976), 'gmm_vol_cluster': np.float32(0.10375046), 'rsi_slope': np.float32(0.11314487), 'atr_normalized': np.float32(0.110695265), 'prev_log_return': np.float32(0.117515236), 'usdchf_log_return': np.float32(0.10477908), 'xagusd_log_return': np.float32(0.106116235), 'xtiusd_log_return': np.float32(0.112523414), 'synth_vix_zscore': np.float32(0.104645744)}
[2026-05-18 11:23:50,287 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:23:50,288 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:23:50,664 INFO] src.backtester: Backtest [M15]: Sharpe=-10.758 | MaxDD=1.313 | WR=0.343 | Return=-73.1% | Trades=1738
[2026-05-18 11:23:50,664 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:23:50,937 INFO] src.engine_xgb: XGB Train Acc: 0.5083 | Test Acc: 0.5428
[2026-05-18 11:23:50,938 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16251564), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12840751), 'atr_normalized': np.float32(0.11794531), 'prev_log_return': np.float32(0.13168594), 'usdchf_log_return': np.float32(0.11304474), 'xagusd_log_return': np.float32(0.108774796), 'xtiusd_log_return': np.float32(0.11512459), 'synth_vix_zscore': np.float32(0.12250147)}
[2026-05-18 11:23:50,938 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:23:51,190 INFO] src.engine_xgb: XGB Train Acc: 0.5131 | Test Acc: 0.5421
[2026-05-18 11:23:51,191 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12270599), 'gmm_vol_cluster': np.float32(0.12961482), 'rsi_slope': np.float32(0.13355577), 'atr_normalized': np.float32(0.10336031), 'prev_log_return': np.float32(0.117563374), 'usdchf_log_return': np.float32(0.09581977), 'xagusd_log_return': np.float32(0.101156965), 'xtiusd_log_return': np.float32(0.09429084), 'synth_vix_zscore': np.float32(0.10193219)}
[2026-05-18 11:23:51,191 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:23:51,399 INFO] src.engine_xgb: XGB Train Acc: 0.5066 | Test Acc: 0.4994
[2026-05-18 11:23:51,400 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10629404), 'gmm_vol_cluster': np.float32(0.09203041), 'rsi_slope': np.float32(0.12658551), 'atr_normalized': np.float32(0.10182365), 'prev_log_return': np.float32(0.12733625), 'usdchf_log_return': np.float32(0.09739878), 'xagusd_log_return': np.float32(0.11226821), 'xtiusd_log_return': np.float32(0.09978499), 'synth_vix_zscore': np.float32(0.1364781)}
[2026-05-18 11:23:51,401 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:23:51,402 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:23:51,774 INFO] src.backtester: Backtest [M15]: Sharpe=-11.513 | MaxDD=1.263 | WR=0.331 | Return=-71.6% | Trades=1622
[2026-05-18 11:23:51,774 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:23:52,019 INFO] src.engine_xgb: XGB Train Acc: 0.5045 | Test Acc: 0.5131
[2026-05-18 11:23:52,019 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13345166), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15326263), 'atr_normalized': np.float32(0.10516003), 'prev_log_return': np.float32(0.13756838), 'usdchf_log_return': np.float32(0.11677803), 'xagusd_log_return': np.float32(0.12507282), 'xtiusd_log_return': np.float32(0.10559584), 'synth_vix_zscore': np.float32(0.1231106)}
[2026-05-18 11:23:52,020 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:23:52,209 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4869
[2026-05-18 11:23:52,209 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10804638), 'gmm_vol_cluster': np.float32(0.08129669), 'rsi_slope': np.float32(0.1401901), 'atr_normalized': np.float32(0.105809644), 'prev_log_return': np.float32(0.13137694), 'usdchf_log_return': np.float32(0.09712334), 'xagusd_log_return': np.float32(0.1294127), 'xtiusd_log_return': np.float32(0.10820831), 'synth_vix_zscore': np.float32(0.09853592)}
[2026-05-18 11:23:52,210 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:23:52,600 INFO] src.engine_xgb: XGB Train Acc: 0.5060 | Test Acc: 0.4982
[2026-05-18 11:23:52,600 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13278309), 'gmm_vol_cluster': np.float32(0.09366374), 'rsi_slope': np.float32(0.12753716), 'atr_normalized': np.float32(0.10371138), 'prev_log_return': np.float32(0.11867996), 'usdchf_log_return': np.float32(0.10748724), 'xagusd_log_return': np.float32(0.10563778), 'xtiusd_log_return': np.float32(0.09773615), 'synth_vix_zscore': np.float32(0.11276353)}
[2026-05-18 11:23:52,601 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:23:52,602 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:23:52,986 INFO] src.backtester: Backtest [M15]: Sharpe=-10.829 | MaxDD=1.270 | WR=0.341 | Return=-71.9% | Trades=1655
[2026-05-18 11:23:52,986 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:23:53,251 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5433
[2026-05-18 11:23:53,251 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12793802), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15132047), 'atr_normalized': np.float32(0.12019295), 'prev_log_return': np.float32(0.14827228), 'usdchf_log_return': np.float32(0.1168272), 'xagusd_log_return': np.float32(0.11272344), 'xtiusd_log_return': np.float32(0.101919524), 'synth_vix_zscore': np.float32(0.12080608)}
[2026-05-18 11:23:53,252 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:23:53,614 INFO] src.engine_xgb: XGB Train Acc: 0.5123 | Test Acc: 0.5348
[2026-05-18 11:23:53,615 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1168939), 'gmm_vol_cluster': np.float32(0.108764075), 'rsi_slope': np.float32(0.13939196), 'atr_normalized': np.float32(0.10430143), 'prev_log_return': np.float32(0.11996497), 'usdchf_log_return': np.float32(0.099795), 'xagusd_log_return': np.float32(0.10215985), 'xtiusd_log_return': np.float32(0.10372546), 'synth_vix_zscore': np.float32(0.10500328)}
[2026-05-18 11:23:53,615 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:23:53,954 INFO] src.engine_xgb: XGB Train Acc: 0.5101 | Test Acc: 0.5252
[2026-05-18 11:23:53,954 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15878303), 'gmm_vol_cluster': np.float32(0.103606135), 'rsi_slope': np.float32(0.12375313), 'atr_normalized': np.float32(0.10276833), 'prev_log_return': np.float32(0.11080462), 'usdchf_log_return': np.float32(0.09287468), 'xagusd_log_return': np.float32(0.10197752), 'xtiusd_log_return': np.float32(0.08949759), 'synth_vix_zscore': np.float32(0.11593502)}
[2026-05-18 11:23:53,955 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:23:53,956 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:23:54,073 INFO] src.backtester: Backtest [M15]: Sharpe=-10.576 | MaxDD=0.252 | WR=0.355 | Return=-22.1% | Trades=310
[2026-05-18 11:23:54,074 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 70%|████████████████████████████████████████████████████▌ | 49/70 [1:15:46<26:23, 75.42s/it][2026-05-18 11:25:10,707 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:25:10,708 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:25:10,708 INFO] src.engine_hmm: Bull 0.9736 0.0074 0.0124 0.0066
[2026-05-18 11:25:10,708 INFO] src.engine_hmm: Bear 0.0065 0.9690 0.0153 0.0092
[2026-05-18 11:25:10,709 INFO] src.engine_hmm: Chop_Low 0.0098 0.0115 0.9778 0.0008
[2026-05-18 11:25:10,709 INFO] src.engine_hmm: Chop_High 0.0112 0.0165 0.0000 0.9722
[2026-05-18 11:25:10,709 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:25:10,709 INFO] src.engine_hmm: Bull: return=0.723069, vol=-0.118597, rsi_slope=-0.035034
[2026-05-18 11:25:10,710 INFO] src.engine_hmm: Bear: return=-0.578473, vol=0.010358, rsi_slope=0.027585
[2026-05-18 11:25:10,710 INFO] src.engine_hmm: Chop_Low: return=-0.048881, vol=-0.624834, rsi_slope=0.001459
[2026-05-18 11:25:10,710 INFO] src.engine_hmm: Chop_High: return=-0.087738, vol=1.461371, rsi_slope=0.006872
[2026-05-18 11:25:10,712 INFO] src.engine_hmm: Total regime transitions: 6281
[2026-05-18 11:25:10,713 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 05:30:00: Bull -> Bear
[2026-05-18 11:25:10,713 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 07:15:00: Bear -> Bull
[2026-05-18 11:25:10,713 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 01:45:00: Bull -> Chop_Low
[2026-05-18 11:25:10,713 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 08:30:00: Chop_Low -> Bull
[2026-05-18 11:25:10,714 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 12:30:00: Bull -> Chop_Low
[2026-05-18 11:25:10,714 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 14:15:00: Chop_Low -> Bear
[2026-05-18 11:25:10,714 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Bear -> Chop_High
[2026-05-18 11:25:10,715 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 22:00:00: Chop_High -> Bear
[2026-05-18 11:25:10,715 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 14:30:00: Bear -> Chop_Low
[2026-05-18 11:25:10,716 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 16:45:00: Chop_Low -> Bear
[2026-05-18 11:25:10,886 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:25:10,903 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:25:11,022 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5243
[2026-05-18 11:25:11,022 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.2101633), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.115713194), 'atr_normalized': np.float32(0.11497973), 'prev_log_return': np.float32(0.1261626), 'usdchf_log_return': np.float32(0.088658325), 'xagusd_log_return': np.float32(0.10835262), 'xtiusd_log_return': np.float32(0.101718664), 'synth_vix_zscore': np.float32(0.13425153)}
[2026-05-18 11:25:11,023 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:25:11,204 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.5171
[2026-05-18 11:25:11,204 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1873443), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.19054408), 'atr_normalized': np.float32(0.10296994), 'prev_log_return': np.float32(0.11406823), 'usdchf_log_return': np.float32(0.09595213), 'xagusd_log_return': np.float32(0.10977317), 'xtiusd_log_return': np.float32(0.096052706), 'synth_vix_zscore': np.float32(0.10329544)}
[2026-05-18 11:25:11,205 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:25:11,502 INFO] src.engine_xgb: XGB Train Acc: 0.4948 | Test Acc: 0.4897
[2026-05-18 11:25:11,502 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14973223), 'gmm_vol_cluster': np.float32(0.114612944), 'rsi_slope': np.float32(0.10635393), 'atr_normalized': np.float32(0.12095457), 'prev_log_return': np.float32(0.11662241), 'usdchf_log_return': np.float32(0.0958181), 'xagusd_log_return': np.float32(0.10577984), 'xtiusd_log_return': np.float32(0.09437585), 'synth_vix_zscore': np.float32(0.09575008)}
[2026-05-18 11:25:11,503 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:25:11,504 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:25:11,943 INFO] src.backtester: Backtest [M15]: Sharpe=-13.774 | MaxDD=1.473 | WR=0.344 | Return=-77.1% | Trades=2020
[2026-05-18 11:25:11,943 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:25:12,266 INFO] src.engine_xgb: XGB Train Acc: 0.4917 | Test Acc: 0.4570
[2026-05-18 11:25:12,267 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.3387711), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.09666618), 'atr_normalized': np.float32(0.10328042), 'prev_log_return': np.float32(0.10833297), 'usdchf_log_return': np.float32(0.084153555), 'xagusd_log_return': np.float32(0.0877163), 'xtiusd_log_return': np.float32(0.08672408), 'synth_vix_zscore': np.float32(0.09435539)}
[2026-05-18 11:25:12,267 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:25:13,078 INFO] src.engine_xgb: XGB Train Acc: 0.4911 | Test Acc: 0.4594
[2026-05-18 11:25:13,078 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1590756), 'gmm_vol_cluster': np.float32(0.0890789), 'rsi_slope': np.float32(0.13147141), 'atr_normalized': np.float32(0.10186576), 'prev_log_return': np.float32(0.120150745), 'usdchf_log_return': np.float32(0.09706865), 'xagusd_log_return': np.float32(0.09754064), 'xtiusd_log_return': np.float32(0.09650569), 'synth_vix_zscore': np.float32(0.10724264)}
[2026-05-18 11:25:13,079 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:25:13,514 INFO] src.engine_xgb: XGB Train Acc: 0.4934 | Test Acc: 0.5006
[2026-05-18 11:25:13,515 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15469678), 'gmm_vol_cluster': np.float32(0.10759672), 'rsi_slope': np.float32(0.11816836), 'atr_normalized': np.float32(0.09557549), 'prev_log_return': np.float32(0.12296377), 'usdchf_log_return': np.float32(0.08732065), 'xagusd_log_return': np.float32(0.099145524), 'xtiusd_log_return': np.float32(0.087509625), 'synth_vix_zscore': np.float32(0.12702303)}
[2026-05-18 11:25:13,515 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:25:13,517 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:25:14,031 INFO] src.backtester: Backtest [M15]: Sharpe=-15.223 | MaxDD=1.885 | WR=0.384 | Return=-84.8% | Trades=2649
[2026-05-18 11:25:14,032 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:25:14,498 INFO] src.engine_xgb: XGB Train Acc: 0.4955 | Test Acc: 0.4869
[2026-05-18 11:25:14,499 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12716322), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14686666), 'atr_normalized': np.float32(0.11364203), 'prev_log_return': np.float32(0.14838675), 'usdchf_log_return': np.float32(0.11437306), 'xagusd_log_return': np.float32(0.12727153), 'xtiusd_log_return': np.float32(0.10865334), 'synth_vix_zscore': np.float32(0.11364337)}
[2026-05-18 11:25:14,499 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:25:14,908 INFO] src.engine_xgb: XGB Train Acc: 0.4911 | Test Acc: 0.5131
[2026-05-18 11:25:14,908 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.33326864), 'gmm_vol_cluster': np.float32(0.08191446), 'rsi_slope': np.float32(0.110713765), 'atr_normalized': np.float32(0.07245898), 'prev_log_return': np.float32(0.09510963), 'usdchf_log_return': np.float32(0.06976), 'xagusd_log_return': np.float32(0.0897944), 'xtiusd_log_return': np.float32(0.07295232), 'synth_vix_zscore': np.float32(0.074027725)}
[2026-05-18 11:25:14,909 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:25:16,170 INFO] src.engine_xgb: XGB Train Acc: 0.4985 | Test Acc: 0.5028
[2026-05-18 11:25:16,170 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.19819546), 'gmm_vol_cluster': np.float32(0.091107644), 'rsi_slope': np.float32(0.110594064), 'atr_normalized': np.float32(0.10333849), 'prev_log_return': np.float32(0.104739785), 'usdchf_log_return': np.float32(0.088827245), 'xagusd_log_return': np.float32(0.09611266), 'xtiusd_log_return': np.float32(0.095105015), 'synth_vix_zscore': np.float32(0.1119796)}
[2026-05-18 11:25:16,171 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:25:16,173 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:25:16,654 INFO] src.backtester: Backtest [M15]: Sharpe=-14.801 | MaxDD=1.642 | WR=0.342 | Return=-80.6% | Trades=2155
[2026-05-18 11:25:16,655 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:25:16,888 INFO] src.engine_xgb: XGB Train Acc: 0.4896 | Test Acc: 0.4567
[2026-05-18 11:25:16,888 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1223857), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.17573482), 'atr_normalized': np.float32(0.1234765), 'prev_log_return': np.float32(0.14710496), 'usdchf_log_return': np.float32(0.1062211), 'xagusd_log_return': np.float32(0.10057915), 'xtiusd_log_return': np.float32(0.11284914), 'synth_vix_zscore': np.float32(0.11164864)}
[2026-05-18 11:25:16,889 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:25:17,895 INFO] src.engine_xgb: XGB Train Acc: 0.4882 | Test Acc: 0.4652
[2026-05-18 11:25:17,895 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.28871298), 'gmm_vol_cluster': np.float32(0.113619804), 'rsi_slope': np.float32(0.10810617), 'atr_normalized': np.float32(0.077493094), 'prev_log_return': np.float32(0.094761655), 'usdchf_log_return': np.float32(0.07583036), 'xagusd_log_return': np.float32(0.078170955), 'xtiusd_log_return': np.float32(0.07792365), 'synth_vix_zscore': np.float32(0.08538141)}
[2026-05-18 11:25:17,896 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:25:18,985 INFO] src.engine_xgb: XGB Train Acc: 0.4902 | Test Acc: 0.4748
[2026-05-18 11:25:18,987 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.28785786), 'gmm_vol_cluster': np.float32(0.088857606), 'rsi_slope': np.float32(0.1041631), 'atr_normalized': np.float32(0.08947986), 'prev_log_return': np.float32(0.09343818), 'usdchf_log_return': np.float32(0.07651927), 'xagusd_log_return': np.float32(0.082971565), 'xtiusd_log_return': np.float32(0.07321444), 'synth_vix_zscore': np.float32(0.1034981)}
[2026-05-18 11:25:18,988 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:25:18,989 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:25:19,131 INFO] src.backtester: Backtest [M15]: Sharpe=-8.238 | MaxDD=0.135 | WR=0.414 | Return=-12.3% | Trades=203
[2026-05-18 11:25:19,131 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[ 50/70] Best Score: -0.500 | ETA: 30m 52s RAM: 58%
Best trial: 4. Best value: -0.5: 71%|█████████████████████████████████████████████████████▌ | 50/70 [1:17:10<25:58, 77.94s/it][2026-05-18 11:26:14,890 INFO] src.engine_hmm: Transition Matrix:
[2026-05-18 11:26:14,890 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-18 11:26:14,890 INFO] src.engine_hmm: Bull 0.9556 0.0105 0.0007 0.0331
[2026-05-18 11:26:14,891 INFO] src.engine_hmm: Bear 0.0362 0.9632 0.0001 0.0005
[2026-05-18 11:26:14,891 INFO] src.engine_hmm: Chop_Low 0.0012 0.0008 0.9734 0.0246
[2026-05-18 11:26:14,891 INFO] src.engine_hmm: Chop_High 0.0236 0.0021 0.0263 0.9479
[2026-05-18 11:26:14,891 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-18 11:26:14,891 INFO] src.engine_hmm: Bull: return=0.059011, vol=0.388073, rsi_slope=0.003043
[2026-05-18 11:26:14,891 INFO] src.engine_hmm: Bear: return=-0.170405, vol=1.961229, rsi_slope=0.007476
[2026-05-18 11:26:14,892 INFO] src.engine_hmm: Chop_Low: return=-0.010303, vol=-0.673036, rsi_slope=-0.000987
[2026-05-18 11:26:14,892 INFO] src.engine_hmm: Chop_High: return=0.015721, vol=-0.249118, rsi_slope=-0.003825
[2026-05-18 11:26:14,894 INFO] src.engine_hmm: Total regime transitions: 9686
[2026-05-18 11:26:14,895 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 11:30:00: Chop_High -> Bull
[2026-05-18 11:26:14,895 INFO] src.engine_hmm: REGIME CHANGE at 2016-03-31 22:00:00: Bull -> Chop_High
[2026-05-18 11:26:14,895 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 15:30:00: Chop_High -> Bear
[2026-05-18 11:26:14,896 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-01 21:30:00: Bear -> Bull
[2026-05-18 11:26:14,896 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-04 09:30:00: Bull -> Chop_High
[2026-05-18 11:26:14,896 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 01:15:00: Chop_High -> Chop_Low
[2026-05-18 11:26:14,896 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 03:15:00: Chop_Low -> Chop_High
[2026-05-18 11:26:14,896 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 04:00:00: Chop_High -> Bull
[2026-05-18 11:26:14,896 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 09:00:00: Bull -> Chop_High
[2026-05-18 11:26:14,897 INFO] src.engine_hmm: REGIME CHANGE at 2016-04-05 10:45:00: Chop_High -> Bull
[2026-05-18 11:26:15,049 INFO] src.engine_xgb: Features prepared: 224918 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:26:15,065 INFO] src.engine_xgb: Features prepared: 8639 samples, 9 features: ['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:26:15,186 INFO] src.engine_xgb: XGB Train Acc: 0.4958 | Test Acc: 0.4757
[2026-05-18 11:26:15,187 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16847117), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.121552415), 'atr_normalized': np.float32(0.12203666), 'prev_log_return': np.float32(0.12766662), 'usdchf_log_return': np.float32(0.10711716), 'xagusd_log_return': np.float32(0.1172236), 'xtiusd_log_return': np.float32(0.11801498), 'synth_vix_zscore': np.float32(0.11791739)}
[2026-05-18 11:26:15,187 INFO] src.engine_xgb: Trained vol-bucket 'low': 18524 samples.
[2026-05-18 11:26:15,288 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.4829
[2026-05-18 11:26:15,289 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12617926), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1489826), 'atr_normalized': np.float32(0.1258011), 'prev_log_return': np.float32(0.11688892), 'usdchf_log_return': np.float32(0.12288676), 'xagusd_log_return': np.float32(0.11220498), 'xtiusd_log_return': np.float32(0.12565382), 'synth_vix_zscore': np.float32(0.12140259)}
[2026-05-18 11:26:15,289 INFO] src.engine_xgb: Trained vol-bucket 'med': 18524 samples.
[2026-05-18 11:26:15,493 INFO] src.engine_xgb: XGB Train Acc: 0.5479 | Test Acc: 0.5176
[2026-05-18 11:26:15,494 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.104019865), 'gmm_vol_cluster': np.float32(0.101342335), 'rsi_slope': np.float32(0.11452407), 'atr_normalized': np.float32(0.10895381), 'prev_log_return': np.float32(0.11883154), 'usdchf_log_return': np.float32(0.11303773), 'xagusd_log_return': np.float32(0.10986184), 'xtiusd_log_return': np.float32(0.11681044), 'synth_vix_zscore': np.float32(0.112618394)}
[2026-05-18 11:26:15,494 INFO] src.engine_xgb: Trained vol-bucket 'high': 19085 samples.
[2026-05-18 11:26:15,496 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 18524, 'med': 18524, 'high': 19085} thresholds=(-0.57705, -0.12343) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:26:15,919 INFO] src.backtester: Backtest [M15]: Sharpe=-11.470 | MaxDD=1.556 | WR=0.336 | Return=-78.9% | Trades=2047
[2026-05-18 11:26:15,920 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:26:16,179 INFO] src.engine_xgb: XGB Train Acc: 0.5087 | Test Acc: 0.5428
[2026-05-18 11:26:16,179 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14108811), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12272462), 'atr_normalized': np.float32(0.123384364), 'prev_log_return': np.float32(0.1317048), 'usdchf_log_return': np.float32(0.113049224), 'xagusd_log_return': np.float32(0.111481816), 'xtiusd_log_return': np.float32(0.13050118), 'synth_vix_zscore': np.float32(0.12606582)}
[2026-05-18 11:26:16,180 INFO] src.engine_xgb: Trained vol-bucket 'low': 37080 samples.
[2026-05-18 11:26:16,335 INFO] src.engine_xgb: XGB Train Acc: 0.5129 | Test Acc: 0.5423
[2026-05-18 11:26:16,335 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10120515), 'gmm_vol_cluster': np.float32(0.13750064), 'rsi_slope': np.float32(0.120693825), 'atr_normalized': np.float32(0.10187734), 'prev_log_return': np.float32(0.118086696), 'usdchf_log_return': np.float32(0.09775822), 'xagusd_log_return': np.float32(0.10583426), 'xtiusd_log_return': np.float32(0.1139548), 'synth_vix_zscore': np.float32(0.103088975)}
[2026-05-18 11:26:16,336 INFO] src.engine_xgb: Trained vol-bucket 'med': 37079 samples.
[2026-05-18 11:26:16,533 INFO] src.engine_xgb: XGB Train Acc: 0.5066 | Test Acc: 0.4994
[2026-05-18 11:26:16,535 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08925497), 'gmm_vol_cluster': np.float32(0.10608683), 'rsi_slope': np.float32(0.12021252), 'atr_normalized': np.float32(0.10914999), 'prev_log_return': np.float32(0.123797745), 'usdchf_log_return': np.float32(0.105790205), 'xagusd_log_return': np.float32(0.115190856), 'xtiusd_log_return': np.float32(0.11064694), 'synth_vix_zscore': np.float32(0.11986985)}
[2026-05-18 11:26:16,535 INFO] src.engine_xgb: Trained vol-bucket 'high': 38203 samples.
[2026-05-18 11:26:16,537 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 37080, 'med': 37079, 'high': 38203} thresholds=(-0.54449, 0.01071) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:26:16,965 INFO] src.backtester: Backtest [M15]: Sharpe=-14.796 | MaxDD=2.095 | WR=0.328 | Return=-87.6% | Trades=2648
[2026-05-18 11:26:16,965 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:26:17,310 INFO] src.engine_xgb: XGB Train Acc: 0.5046 | Test Acc: 0.5131
[2026-05-18 11:26:17,311 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12855223), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.124786936), 'atr_normalized': np.float32(0.11968047), 'prev_log_return': np.float32(0.13067228), 'usdchf_log_return': np.float32(0.124651745), 'xagusd_log_return': np.float32(0.12955046), 'xtiusd_log_return': np.float32(0.11606722), 'synth_vix_zscore': np.float32(0.12603864)}
[2026-05-18 11:26:17,311 INFO] src.engine_xgb: Trained vol-bucket 'low': 55635 samples.
[2026-05-18 11:26:17,512 INFO] src.engine_xgb: XGB Train Acc: 0.5090 | Test Acc: 0.4869
[2026-05-18 11:26:17,512 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.107637055), 'gmm_vol_cluster': np.float32(0.10683357), 'rsi_slope': np.float32(0.11726434), 'atr_normalized': np.float32(0.111003704), 'prev_log_return': np.float32(0.12256568), 'usdchf_log_return': np.float32(0.10358538), 'xagusd_log_return': np.float32(0.11764854), 'xtiusd_log_return': np.float32(0.10956755), 'synth_vix_zscore': np.float32(0.103894114)}
[2026-05-18 11:26:17,513 INFO] src.engine_xgb: Trained vol-bucket 'med': 55635 samples.
[2026-05-18 11:26:17,763 INFO] src.engine_xgb: XGB Train Acc: 0.5057 | Test Acc: 0.4984
[2026-05-18 11:26:17,763 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.112278126), 'gmm_vol_cluster': np.float32(0.10064133), 'rsi_slope': np.float32(0.118324004), 'atr_normalized': np.float32(0.10988162), 'prev_log_return': np.float32(0.119720004), 'usdchf_log_return': np.float32(0.10611362), 'xagusd_log_return': np.float32(0.10793599), 'xtiusd_log_return': np.float32(0.107020594), 'synth_vix_zscore': np.float32(0.11808472)}
[2026-05-18 11:26:17,764 INFO] src.engine_xgb: Trained vol-bucket 'high': 57321 samples.
[2026-05-18 11:26:17,765 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 55635, 'med': 55635, 'high': 57321} thresholds=(-0.48818, 0.07765) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:26:18,197 INFO] src.backtester: Backtest [M15]: Sharpe=-14.390 | MaxDD=2.010 | WR=0.332 | Return=-86.5% | Trades=2478
[2026-05-18 11:26:18,197 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-18 11:26:18,495 INFO] src.engine_xgb: XGB Train Acc: 0.5104 | Test Acc: 0.5433
[2026-05-18 11:26:18,496 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14247842), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12531848), 'atr_normalized': np.float32(0.13010488), 'prev_log_return': np.float32(0.12391364), 'usdchf_log_return': np.float32(0.1180689), 'xagusd_log_return': np.float32(0.11811257), 'xtiusd_log_return': np.float32(0.12202122), 'synth_vix_zscore': np.float32(0.11998188)}
[2026-05-18 11:26:18,496 INFO] src.engine_xgb: Trained vol-bucket 'low': 74223 samples.
[2026-05-18 11:26:18,766 INFO] src.engine_xgb: XGB Train Acc: 0.5124 | Test Acc: 0.5348
[2026-05-18 11:26:18,767 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10848064), 'gmm_vol_cluster': np.float32(0.1431507), 'rsi_slope': np.float32(0.11009049), 'atr_normalized': np.float32(0.103044964), 'prev_log_return': np.float32(0.12002341), 'usdchf_log_return': np.float32(0.10141848), 'xagusd_log_return': np.float32(0.102147534), 'xtiusd_log_return': np.float32(0.101705424), 'synth_vix_zscore': np.float32(0.10993836)}
[2026-05-18 11:26:18,767 INFO] src.engine_xgb: Trained vol-bucket 'med': 74223 samples.
[2026-05-18 11:26:19,027 INFO] src.engine_xgb: XGB Train Acc: 0.5101 | Test Acc: 0.5252
[2026-05-18 11:26:19,028 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.115815565), 'gmm_vol_cluster': np.float32(0.11616835), 'rsi_slope': np.float32(0.12301095), 'atr_normalized': np.float32(0.11352042), 'prev_log_return': np.float32(0.114940785), 'usdchf_log_return': np.float32(0.101903595), 'xagusd_log_return': np.float32(0.101272434), 'xtiusd_log_return': np.float32(0.10322758), 'synth_vix_zscore': np.float32(0.110140316)}
[2026-05-18 11:26:19,028 INFO] src.engine_xgb: Trained vol-bucket 'high': 76472 samples.
[2026-05-18 11:26:19,029 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 74223, 'med': 74223, 'high': 76472} thresholds=(-0.46226, 0.12137) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-18 11:26:19,163 INFO] src.backtester: Backtest [M15]: Sharpe=-13.727 | MaxDD=0.422 | WR=0.376 | Return=-34.3% | Trades=526
[2026-05-18 11:26:19,164 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
Best trial: 4. Best value: -0.5: 73%|██████████████████████████████████████████████████████▋ | 51/70 [1:18:10<22:58, 72.55s/it][