Files
GoldRegime_X/logfiles_cmd.txt
T
Luke Mosoti d0db33062d Refactor XGBoost training logic and update optimizer parameters
- Removed the early stopping guard fold in the XGBoost training process to enhance model generalization.
- Updated optimizer version to 3.6 and adjusted search space for regularization parameters (reg_alpha and reg_lambda) to prevent overfitting.
- Implemented a purged inner cross-validation split to avoid leakage between training and validation sets.
- Adjusted scoring penalties for WFE to better reflect model performance discrepancies.
2026-05-15 01:24:34 +03:00

5369 lines
872 KiB
Plaintext

[2026-05-15 01:17:12,029 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:12,256 INFO] src.engine_xgb: XGB Train Acc: 0.7181 | Test Acc: 0.7181
[2026-05-15 01:17:12,257 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12212718), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.122620255), 'atr_normalized': np.float32(0.12221966), 'prev_log_return': np.float32(0.12725633), 'usdchf_log_return': np.float32(0.120160215), 'xagusd_log_return': np.float32(0.12946604), 'xtiusd_log_return': np.float32(0.12494361), 'synth_vix_zscore': np.float32(0.13120669)}
[2026-05-15 01:17:12,257 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:17:12,436 INFO] src.engine_xgb: XGB Train Acc: 0.7169 | Test Acc: 0.7169
[2026-05-15 01:17:12,436 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10001774), 'gmm_vol_cluster': np.float32(0.13780245), 'rsi_slope': np.float32(0.10503876), 'atr_normalized': np.float32(0.10667306), 'prev_log_return': np.float32(0.10921035), 'usdchf_log_return': np.float32(0.11285774), 'xagusd_log_return': np.float32(0.106163524), 'xtiusd_log_return': np.float32(0.10937853), 'synth_vix_zscore': np.float32(0.112857856)}
[2026-05-15 01:17:12,437 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:17:12,653 INFO] src.engine_xgb: XGB Train Acc: 0.6773 | Test Acc: 0.6773
[2026-05-15 01:17:12,653 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12970251), 'gmm_vol_cluster': np.float32(0.09323124), 'rsi_slope': np.float32(0.120993316), 'atr_normalized': np.float32(0.11737124), 'prev_log_return': np.float32(0.10744998), 'usdchf_log_return': np.float32(0.11362497), 'xagusd_log_return': np.float32(0.10620041), 'xtiusd_log_return': np.float32(0.10722296), 'synth_vix_zscore': np.float32(0.10420337)}
[2026-05-15 01:17:12,654 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:17:12,655 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53526, 0.16378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:12,743 INFO] src.backtester: Backtest [H1]: Sharpe=0.653 | MaxDD=0.044 | WR=0.372 | Return=1.9% | Trades=86
[2026-05-15 01:17:12,744 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:13,036 INFO] src.engine_xgb: XGB Train Acc: 0.6441 | Test Acc: 0.6441
[2026-05-15 01:17:13,037 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12329475), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12192618), 'atr_normalized': np.float32(0.12500504), 'prev_log_return': np.float32(0.12775075), 'usdchf_log_return': np.float32(0.13420227), 'xagusd_log_return': np.float32(0.11734367), 'xtiusd_log_return': np.float32(0.12558764), 'synth_vix_zscore': np.float32(0.12488966)}
[2026-05-15 01:17:13,037 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:17:13,301 INFO] src.engine_xgb: XGB Train Acc: 0.6567 | Test Acc: 0.6567
[2026-05-15 01:17:13,301 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11568615), 'gmm_vol_cluster': np.float32(0.05043081), 'rsi_slope': np.float32(0.11494666), 'atr_normalized': np.float32(0.11994085), 'prev_log_return': np.float32(0.11757466), 'usdchf_log_return': np.float32(0.1159872), 'xagusd_log_return': np.float32(0.12492971), 'xtiusd_log_return': np.float32(0.11513631), 'synth_vix_zscore': np.float32(0.12536766)}
[2026-05-15 01:17:13,303 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:17:13,566 INFO] src.engine_xgb: XGB Train Acc: 0.6273 | Test Acc: 0.6273
[2026-05-15 01:17:13,566 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11616688), 'gmm_vol_cluster': np.float32(0.11002498), 'rsi_slope': np.float32(0.11637), 'atr_normalized': np.float32(0.113810375), 'prev_log_return': np.float32(0.10796442), 'usdchf_log_return': np.float32(0.107663155), 'xagusd_log_return': np.float32(0.10867386), 'xtiusd_log_return': np.float32(0.11066305), 'synth_vix_zscore': np.float32(0.10866321)}
[2026-05-15 01:17:13,567 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:17:13,568 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.43440, 0.22813) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:13,659 INFO] src.backtester: Backtest [H1]: Sharpe=0.994 | MaxDD=0.057 | WR=0.416 | Return=3.8% | Trades=77
[2026-05-15 01:17:13,660 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:13,669 INFO] src.optimizer: WFO [H1] window start=43200: trades=77 sharpe=0.994 cv_sharpe=-0.789 score=1.410
[2026-05-15 01:17:13,670 INFO] src.optimizer: WFO [H1]: 8/8 valid | median_trades=61 | score=-0.701 | std_sharpe=2.267 | WFE=0.87 | window_scores=[1.786, -0.5, -0.5, -1.0, -1.0, -0.5, -0.5, 1.41]
[2026-05-15 01:17:13,721 INFO] src.optimizer: Trial 26 [H1/headway_cent $15 standard]: score=-1.335 | valid=8/8 | std_sharpe=2.267 | median_trades=61 | WFE=0.87 | scores=[1.786, -0.5, -0.5, -1.0, -1.0, -0.5, -0.5, 1.41]
Best trial: 23. Best value: -0.320363: 14%|█████████▏ | 27/200 [15:12<1:42:38, 35.60s/it][2026-05-15 01:17:17,257 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:17:17,257 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:17:17,259 INFO] src.engine_hmm: Bull 0.9671 0.0122 0.0000 0.0207
[2026-05-15 01:17:17,261 INFO] src.engine_hmm: Bear 0.0074 0.9689 0.0130 0.0107
[2026-05-15 01:17:17,265 INFO] src.engine_hmm: Chop_Low 0.0035 0.0065 0.9757 0.0143
[2026-05-15 01:17:17,267 INFO] src.engine_hmm: Chop_High 0.0110 0.0030 0.0268 0.9592
[2026-05-15 01:17:17,269 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:17:17,270 INFO] src.engine_hmm: Bull: return=1.286028, vol=1.063401, rsi_slope=-0.039560
[2026-05-15 01:17:17,271 INFO] src.engine_hmm: Bear: return=-1.222814, vol=0.916738, rsi_slope=0.039033
[2026-05-15 01:17:17,276 INFO] src.engine_hmm: Chop_Low: return=-0.262119, vol=-0.719367, rsi_slope=-0.002981
[2026-05-15 01:17:17,278 INFO] src.engine_hmm: Chop_High: return=0.363196, vol=-0.223503, rsi_slope=0.003942
[2026-05-15 01:17:17,278 INFO] src.engine_hmm: Total regime transitions: 311
[2026-05-15 01:17:17,279 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-27 15:00:00: Chop_Low -> Bear
[2026-05-15 01:17:17,279 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-28 02:00:00: Bear -> Chop_Low
[2026-05-15 01:17:17,280 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-03 10:00:00: Chop_Low -> Chop_High
[2026-05-15 01:17:17,280 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-05 07:00:00: Chop_High -> Chop_Low
[2026-05-15 01:17:17,281 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-10 15:00:00: Chop_Low -> Chop_High
[2026-05-15 01:17:17,284 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-11 12:00:00: Chop_High -> Chop_Low
[2026-05-15 01:17:17,285 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-11 19:00:00: Chop_Low -> Bear
[2026-05-15 01:17:17,286 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-12 07:00:00: Bear -> Chop_Low
[2026-05-15 01:17:17,287 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-13 15:00:00: Chop_Low -> Bear
[2026-05-15 01:17:17,288 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-16 04:00:00: Bear -> Chop_High
[2026-05-15 01:17:17,334 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:17:17,367 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:17:17,473 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-15 01:17:17,474 INFO] src.engine_xgb: XGB Train Acc: 0.5042 | Test Acc: 0.5042
[2026-05-15 01:17:17,475 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14245693), 'atr_normalized': np.float32(0.12869866), 'prev_log_return': np.float32(0.15667893), 'usdchf_log_return': np.float32(0.11994811), 'xagusd_log_return': np.float32(0.18838076), 'xtiusd_log_return': np.float32(0.112187155), 'synth_vix_zscore': np.float32(0.15164942)}
[2026-05-15 01:17:17,476 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:17:17,596 INFO] src.engine_xgb: XGB Train Acc: 0.5110 | Test Acc: 0.5110
[2026-05-15 01:17:17,596 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13260211), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.18281333), 'atr_normalized': np.float32(0.09122686), 'prev_log_return': np.float32(0.10361928), 'usdchf_log_return': np.float32(0.14281827), 'xagusd_log_return': np.float32(0.09790972), 'xtiusd_log_return': np.float32(0.13015264), 'synth_vix_zscore': np.float32(0.11885773)}
[2026-05-15 01:17:17,596 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:17:17,678 INFO] src.engine_xgb: XGB Train Acc: 0.4837 | Test Acc: 0.4837
[2026-05-15 01:17:17,679 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11653332), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14355867), 'atr_normalized': np.float32(0.12643391), 'prev_log_return': np.float32(0.10395905), 'usdchf_log_return': np.float32(0.09875611), 'xagusd_log_return': np.float32(0.18670675), 'xtiusd_log_return': np.float32(0.11519168), 'synth_vix_zscore': np.float32(0.108860485)}
[2026-05-15 01:17:17,679 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:17:17,680 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.38336, 0.21891) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:17,769 INFO] src.backtester: Backtest [H1]: Sharpe=-4.600 | MaxDD=0.112 | WR=0.211 | Return=-10.6% | Trades=90
[2026-05-15 01:17:17,771 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:17,868 INFO] src.engine_xgb: XGB Train Acc: 0.4977 | Test Acc: 0.4977
[2026-05-15 01:17:17,869 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1176972), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11710243), 'atr_normalized': np.float32(0.15076487), 'prev_log_return': np.float32(0.1270642), 'usdchf_log_return': np.float32(0.12157113), 'xagusd_log_return': np.float32(0.11727354), 'xtiusd_log_return': np.float32(0.12994295), 'synth_vix_zscore': np.float32(0.11858373)}
[2026-05-15 01:17:17,869 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:17:17,945 INFO] src.engine_xgb: XGB Train Acc: 0.5063 | Test Acc: 0.5063
[2026-05-15 01:17:17,947 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11398056), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.17658427), 'atr_normalized': np.float32(0.10846005), 'prev_log_return': np.float32(0.107807554), 'usdchf_log_return': np.float32(0.108357646), 'xagusd_log_return': np.float32(0.13131654), 'xtiusd_log_return': np.float32(0.11534469), 'synth_vix_zscore': np.float32(0.1381487)}
[2026-05-15 01:17:17,948 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:17:18,033 INFO] src.engine_xgb: XGB Train Acc: 0.4942 | Test Acc: 0.4942
[2026-05-15 01:17:18,033 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11410799), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16235992), 'atr_normalized': np.float32(0.1097845), 'prev_log_return': np.float32(0.097620904), 'usdchf_log_return': np.float32(0.11048109), 'xagusd_log_return': np.float32(0.15044405), 'xtiusd_log_return': np.float32(0.13350056), 'synth_vix_zscore': np.float32(0.12170098)}
[2026-05-15 01:17:18,034 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:17:18,035 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53107, 0.07740) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:18,117 INFO] src.backtester: Backtest [H1]: Sharpe=-3.268 | MaxDD=0.093 | WR=0.277 | Return=-7.8% | Trades=65
[2026-05-15 01:17:18,117 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:18,212 INFO] src.engine_xgb: XGB Train Acc: 0.4960 | Test Acc: 0.4960
[2026-05-15 01:17:18,212 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13515678), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11788192), 'atr_normalized': np.float32(0.13327616), 'prev_log_return': np.float32(0.1205538), 'usdchf_log_return': np.float32(0.10663939), 'xagusd_log_return': np.float32(0.107884035), 'xtiusd_log_return': np.float32(0.14487378), 'synth_vix_zscore': np.float32(0.1337342)}
[2026-05-15 01:17:18,213 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:17:18,308 INFO] src.engine_xgb: XGB Train Acc: 0.4945 | Test Acc: 0.4945
[2026-05-15 01:17:18,309 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10612002), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16601521), 'atr_normalized': np.float32(0.10216984), 'prev_log_return': np.float32(0.12099063), 'usdchf_log_return': np.float32(0.12319429), 'xagusd_log_return': np.float32(0.11942969), 'xtiusd_log_return': np.float32(0.12523048), 'synth_vix_zscore': np.float32(0.13684978)}
[2026-05-15 01:17:18,309 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:17:18,395 INFO] src.engine_xgb: XGB Train Acc: 0.5010 | Test Acc: 0.5010
[2026-05-15 01:17:18,395 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13030744), 'gmm_vol_cluster': np.float32(0.08806123), 'rsi_slope': np.float32(0.14797397), 'atr_normalized': np.float32(0.09487141), 'prev_log_return': np.float32(0.09731795), 'usdchf_log_return': np.float32(0.0976163), 'xagusd_log_return': np.float32(0.11530348), 'xtiusd_log_return': np.float32(0.09748929), 'synth_vix_zscore': np.float32(0.13105902)}
[2026-05-15 01:17:18,395 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:17:18,396 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.38300, 0.44275) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:18,490 INFO] src.backtester: Backtest [H1]: Sharpe=0.200 | MaxDD=0.100 | WR=0.311 | Return=1.1% | Trades=45
[2026-05-15 01:17:18,490 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:18,500 INFO] src.optimizer: WFO [H1] window start=12960: trades=45 sharpe=0.200 cv_sharpe=-3.934 score=0.120
[2026-05-15 01:17:22,353 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:17:22,354 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:17:22,355 INFO] src.engine_hmm: Bull 0.9737 0.0000 0.0010 0.0253
[2026-05-15 01:17:22,355 INFO] src.engine_hmm: Bear 0.0000 0.9802 0.0167 0.0031
[2026-05-15 01:17:22,356 INFO] src.engine_hmm: Chop_Low 0.0027 0.0184 0.9634 0.0156
[2026-05-15 01:17:22,356 INFO] src.engine_hmm: Chop_High 0.0077 0.0010 0.0238 0.9675
[2026-05-15 01:17:22,357 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:17:22,358 INFO] src.engine_hmm: Bull: return=0.147171, vol=2.060740, rsi_slope=-0.021402
[2026-05-15 01:17:22,358 INFO] src.engine_hmm: Bear: return=-0.062824, vol=-0.777704, rsi_slope=0.006354
[2026-05-15 01:17:22,358 INFO] src.engine_hmm: Chop_Low: return=0.010295, vol=-0.293105, rsi_slope=0.015924
[2026-05-15 01:17:22,360 INFO] src.engine_hmm: Chop_High: return=0.000712, vol=0.409666, rsi_slope=-0.017528
[2026-05-15 01:17:22,361 INFO] src.engine_hmm: Total regime transitions: 293
[2026-05-15 01:17:22,361 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-20 20:00:00: Bear -> Chop_High
[2026-05-15 01:17:22,362 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-21 18:00:00: Chop_High -> Chop_Low
[2026-05-15 01:17:22,362 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-22 14:00:00: Chop_Low -> Bear
[2026-05-15 01:17:22,362 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-28 14:00:00: Bear -> Chop_Low
[2026-05-15 01:17:22,363 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-01 12:00:00: Chop_Low -> Bear
[2026-05-15 01:17:22,364 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-01 17:00:00: Bear -> Chop_Low
[2026-05-15 01:17:22,364 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-02 12:00:00: Chop_Low -> Bear
[2026-05-15 01:17:22,365 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-04 17:00:00: Bear -> Chop_Low
[2026-05-15 01:17:22,365 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-05 13:00:00: Chop_Low -> Bear
[2026-05-15 01:17:22,366 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-11 15:00:00: Bear -> Chop_Low
[2026-05-15 01:17:22,414 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:17:22,436 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:17:22,582 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-15 01:17:22,583 INFO] src.engine_xgb: XGB Train Acc: 0.4864 | Test Acc: 0.4864
[2026-05-15 01:17:22,584 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1462271), 'atr_normalized': np.float32(0.14973076), 'prev_log_return': np.float32(0.12943362), 'usdchf_log_return': np.float32(0.14367706), 'xagusd_log_return': np.float32(0.13103232), 'xtiusd_log_return': np.float32(0.12927404), 'synth_vix_zscore': np.float32(0.17062508)}
[2026-05-15 01:17:22,587 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:17:22,745 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-15 01:17:22,745 INFO] src.engine_xgb: XGB Train Acc: 0.5037 | Test Acc: 0.5037
[2026-05-15 01:17:22,746 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.09918745), 'atr_normalized': np.float32(0.17751382), 'prev_log_return': np.float32(0.15168947), 'usdchf_log_return': np.float32(0.15829216), 'xagusd_log_return': np.float32(0.15174572), 'xtiusd_log_return': np.float32(0.13862412), 'synth_vix_zscore': np.float32(0.12294725)}
[2026-05-15 01:17:22,747 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:17:22,846 INFO] src.engine_xgb: XGB Train Acc: 0.5102 | Test Acc: 0.5102
[2026-05-15 01:17:22,846 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.07210707), 'gmm_vol_cluster': np.float32(0.1009626), 'rsi_slope': np.float32(0.15135433), 'atr_normalized': np.float32(0.06958308), 'prev_log_return': np.float32(0.11362525), 'usdchf_log_return': np.float32(0.09277909), 'xagusd_log_return': np.float32(0.16320825), 'xtiusd_log_return': np.float32(0.12278733), 'synth_vix_zscore': np.float32(0.113592975)}
[2026-05-15 01:17:22,847 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:17:22,849 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.50441, -0.08685) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:22,958 INFO] src.backtester: Backtest [H1]: Sharpe=-4.261 | MaxDD=0.156 | WR=0.296 | Return=-11.9% | Trades=54
[2026-05-15 01:17:22,960 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:23,089 INFO] src.engine_xgb: XGB Train Acc: 0.4815 | Test Acc: 0.4815
[2026-05-15 01:17:23,089 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14856574), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14742997), 'atr_normalized': np.float32(0.09551415), 'prev_log_return': np.float32(0.10913398), 'usdchf_log_return': np.float32(0.1181725), 'xagusd_log_return': np.float32(0.14544335), 'xtiusd_log_return': np.float32(0.1058624), 'synth_vix_zscore': np.float32(0.12987792)}
[2026-05-15 01:17:23,090 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:17:23,188 INFO] src.engine_xgb: XGB Train Acc: 0.4833 | Test Acc: 0.4833
[2026-05-15 01:17:23,188 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.122157864), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13224205), 'atr_normalized': np.float32(0.116227716), 'prev_log_return': np.float32(0.12467803), 'usdchf_log_return': np.float32(0.13125268), 'xagusd_log_return': np.float32(0.13967107), 'xtiusd_log_return': np.float32(0.11583625), 'synth_vix_zscore': np.float32(0.1179344)}
[2026-05-15 01:17:23,189 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:17:23,303 INFO] src.engine_xgb: XGB Train Acc: 0.5023 | Test Acc: 0.5023
[2026-05-15 01:17:23,303 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11657566), 'gmm_vol_cluster': np.float32(0.07717773), 'rsi_slope': np.float32(0.1466208), 'atr_normalized': np.float32(0.08570168), 'prev_log_return': np.float32(0.08924403), 'usdchf_log_return': np.float32(0.110140145), 'xagusd_log_return': np.float32(0.16118279), 'xtiusd_log_return': np.float32(0.10777809), 'synth_vix_zscore': np.float32(0.105579086)}
[2026-05-15 01:17:23,304 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:17:23,305 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.49357, -0.10582) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:23,417 INFO] src.backtester: Backtest [H1]: Sharpe=-4.564 | MaxDD=0.199 | WR=0.271 | Return=-16.6% | Trades=85
[2026-05-15 01:17:23,418 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:23,543 INFO] src.engine_xgb: XGB Train Acc: 0.4735 | Test Acc: 0.4735
[2026-05-15 01:17:23,543 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1705941), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.10888214), 'atr_normalized': np.float32(0.09868386), 'prev_log_return': np.float32(0.12233664), 'usdchf_log_return': np.float32(0.11692648), 'xagusd_log_return': np.float32(0.1486885), 'xtiusd_log_return': np.float32(0.11419403), 'synth_vix_zscore': np.float32(0.11969423)}
[2026-05-15 01:17:23,544 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:17:23,656 INFO] src.engine_xgb: XGB Train Acc: 0.4848 | Test Acc: 0.4848
[2026-05-15 01:17:23,657 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11622167), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15919767), 'atr_normalized': np.float32(0.11279505), 'prev_log_return': np.float32(0.11470722), 'usdchf_log_return': np.float32(0.13622102), 'xagusd_log_return': np.float32(0.13261282), 'xtiusd_log_return': np.float32(0.11707539), 'synth_vix_zscore': np.float32(0.11116917)}
[2026-05-15 01:17:23,657 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:17:23,775 INFO] src.engine_xgb: XGB Train Acc: 0.4963 | Test Acc: 0.4963
[2026-05-15 01:17:23,775 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09498328), 'gmm_vol_cluster': np.float32(0.06992073), 'rsi_slope': np.float32(0.12491094), 'atr_normalized': np.float32(0.0965908), 'prev_log_return': np.float32(0.10777778), 'usdchf_log_return': np.float32(0.11472185), 'xagusd_log_return': np.float32(0.14713433), 'xtiusd_log_return': np.float32(0.12343054), 'synth_vix_zscore': np.float32(0.12052966)}
[2026-05-15 01:17:23,776 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:17:23,777 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.36542, 0.20284) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:23,875 INFO] src.backtester: Backtest [H1]: Sharpe=-3.122 | MaxDD=0.101 | WR=0.220 | Return=-8.1% | Trades=59
[2026-05-15 01:17:23,875 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:23,885 INFO] src.optimizer: WFO [H1] window start=17280: trades=59 sharpe=-3.122 cv_sharpe=-4.413 score=-0.500
[2026-05-15 01:17:24,938 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:17:24,939 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:17:24,940 INFO] src.engine_hmm: Bull 0.9723 0.0130 0.0147 0.0000
[2026-05-15 01:17:24,940 INFO] src.engine_hmm: Bear 0.0091 0.9613 0.0174 0.0121
[2026-05-15 01:17:24,940 INFO] src.engine_hmm: Chop_Low 0.0112 0.0127 0.9761 0.0000
[2026-05-15 01:17:24,941 INFO] src.engine_hmm: Chop_High 0.0000 0.0261 0.0000 0.9739
[2026-05-15 01:17:24,941 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:17:24,942 INFO] src.engine_hmm: Bull: return=0.812417, vol=-0.261701, rsi_slope=-0.028043
[2026-05-15 01:17:24,943 INFO] src.engine_hmm: Bear: return=-0.556114, vol=0.202551, rsi_slope=0.024258
[2026-05-15 01:17:24,943 INFO] src.engine_hmm: Chop_Low: return=-0.038480, vol=-0.676400, rsi_slope=0.000788
[2026-05-15 01:17:24,944 INFO] src.engine_hmm: Chop_High: return=-0.149454, vol=1.835409, rsi_slope=-0.004269
[2026-05-15 01:17:24,944 INFO] src.engine_hmm: Total regime transitions: 297
[2026-05-15 01:17:24,945 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 15:00:00: Chop_Low -> Bear
[2026-05-15 01:17:24,946 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-13 13:00:00: Bear -> Chop_Low
[2026-05-15 01:17:24,946 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-24 17:00:00: Chop_Low -> Bull
[2026-05-15 01:17:24,947 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-27 15:00:00: Bull -> Chop_Low
[2026-05-15 01:17:24,948 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-02 16:00:00: Chop_Low -> Bull
[2026-05-15 01:17:24,948 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 01:00:00: Bull -> Bear
[2026-05-15 01:17:24,949 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 02:00:00: Bear -> Chop_High
[2026-05-15 01:17:24,949 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 20:00:00: Chop_High -> Bear
[2026-05-15 01:17:24,950 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 21:00:00: Bear -> Bull
[2026-05-15 01:17:24,950 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-08 01:00:00: Bull -> Bear
[2026-05-15 01:17:24,993 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:17:25,008 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:17:25,086 INFO] src.engine_xgb: XGB Train Acc: 0.4707 | Test Acc: 0.4707
[2026-05-15 01:17:25,087 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16168335), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1358667), 'atr_normalized': np.float32(0.11135035), 'prev_log_return': np.float32(0.11735083), 'usdchf_log_return': np.float32(0.11537829), 'xagusd_log_return': np.float32(0.117368914), 'xtiusd_log_return': np.float32(0.103909574), 'synth_vix_zscore': np.float32(0.13709196)}
[2026-05-15 01:17:25,087 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:17:25,137 INFO] src.engine_xgb: XGB Train Acc: 0.4838 | Test Acc: 0.4838
[2026-05-15 01:17:25,137 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15845932), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1401961), 'atr_normalized': np.float32(0.110789366), 'prev_log_return': np.float32(0.10660113), 'usdchf_log_return': np.float32(0.12070675), 'xagusd_log_return': np.float32(0.14859585), 'xtiusd_log_return': np.float32(0.10775059), 'synth_vix_zscore': np.float32(0.1069009)}
[2026-05-15 01:17:25,138 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:17:25,190 INFO] src.engine_xgb: XGB Train Acc: 0.4939 | Test Acc: 0.4939
[2026-05-15 01:17:25,191 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10963578), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13864866), 'atr_normalized': np.float32(0.10161689), 'prev_log_return': np.float32(0.094248764), 'usdchf_log_return': np.float32(0.121468015), 'xagusd_log_return': np.float32(0.15366687), 'xtiusd_log_return': np.float32(0.13247843), 'synth_vix_zscore': np.float32(0.14823662)}
[2026-05-15 01:17:25,191 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:17:25,192 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.54544, 0.24324) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:25,273 INFO] src.backtester: Backtest [H1]: Sharpe=-2.433 | MaxDD=0.088 | WR=0.178 | Return=-6.5% | Trades=45
[2026-05-15 01:17:25,273 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:25,345 INFO] src.engine_xgb: XGB Train Acc: 0.4612 | Test Acc: 0.4612
[2026-05-15 01:17:25,346 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16686103), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13961275), 'atr_normalized': np.float32(0.11537747), 'prev_log_return': np.float32(0.101090975), 'usdchf_log_return': np.float32(0.124578945), 'xagusd_log_return': np.float32(0.13483621), 'xtiusd_log_return': np.float32(0.11272884), 'synth_vix_zscore': np.float32(0.10491381)}
[2026-05-15 01:17:25,346 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:17:25,412 INFO] src.engine_xgb: XGB Train Acc: 0.4708 | Test Acc: 0.4708
[2026-05-15 01:17:25,413 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08942932), 'gmm_vol_cluster': np.float32(0.1404538), 'rsi_slope': np.float32(0.13375777), 'atr_normalized': np.float32(0.106292546), 'prev_log_return': np.float32(0.10416352), 'usdchf_log_return': np.float32(0.102153994), 'xagusd_log_return': np.float32(0.11349175), 'xtiusd_log_return': np.float32(0.09105304), 'synth_vix_zscore': np.float32(0.11920428)}
[2026-05-15 01:17:25,413 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:17:25,489 INFO] src.engine_xgb: XGB Train Acc: 0.4927 | Test Acc: 0.4927
[2026-05-15 01:17:25,490 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09953588), 'gmm_vol_cluster': np.float32(0.10964664), 'rsi_slope': np.float32(0.123897105), 'atr_normalized': np.float32(0.11120417), 'prev_log_return': np.float32(0.09754086), 'usdchf_log_return': np.float32(0.10119379), 'xagusd_log_return': np.float32(0.123522), 'xtiusd_log_return': np.float32(0.12082223), 'synth_vix_zscore': np.float32(0.11263731)}
[2026-05-15 01:17:25,491 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:17:25,492 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.48586, 0.08539) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:25,581 INFO] src.backtester: Backtest [H1]: Sharpe=0.065 | MaxDD=0.010 | WR=0.333 | Return=0.0% | Trades=9
[2026-05-15 01:17:25,581 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:25,693 INFO] src.engine_xgb: XGB Train Acc: 0.4746 | Test Acc: 0.4746
[2026-05-15 01:17:25,694 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13671568), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1371362), 'atr_normalized': np.float32(0.12463753), 'prev_log_return': np.float32(0.116725475), 'usdchf_log_return': np.float32(0.11125774), 'xagusd_log_return': np.float32(0.15938142), 'xtiusd_log_return': np.float32(0.10953139), 'synth_vix_zscore': np.float32(0.10461464)}
[2026-05-15 01:17:25,695 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:17:25,793 INFO] src.engine_xgb: XGB Train Acc: 0.4758 | Test Acc: 0.4758
[2026-05-15 01:17:25,793 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10905489), 'gmm_vol_cluster': np.float32(0.08896707), 'rsi_slope': np.float32(0.14210208), 'atr_normalized': np.float32(0.10018778), 'prev_log_return': np.float32(0.108929574), 'usdchf_log_return': np.float32(0.11414485), 'xagusd_log_return': np.float32(0.1380315), 'xtiusd_log_return': np.float32(0.091885686), 'synth_vix_zscore': np.float32(0.10669665)}
[2026-05-15 01:17:25,795 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:17:25,892 INFO] src.engine_xgb: XGB Train Acc: 0.4903 | Test Acc: 0.4903
[2026-05-15 01:17:25,893 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12217417), 'gmm_vol_cluster': np.float32(0.1028127), 'rsi_slope': np.float32(0.13567951), 'atr_normalized': np.float32(0.1101412), 'prev_log_return': np.float32(0.09160517), 'usdchf_log_return': np.float32(0.099435695), 'xagusd_log_return': np.float32(0.12816752), 'xtiusd_log_return': np.float32(0.10732363), 'synth_vix_zscore': np.float32(0.102660395)}
[2026-05-15 01:17:25,893 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:17:25,895 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.51495, -0.03378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:25,991 INFO] src.backtester: Backtest [H1]: Sharpe=-0.386 | MaxDD=0.029 | WR=0.412 | Return=-0.5% | Trades=34
[2026-05-15 01:17:25,992 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:26,002 INFO] src.optimizer: WFO [H1] window start=21600: trades=34 sharpe=-0.386 cv_sharpe=-1.184 score=-0.224
[2026-05-15 01:17:28,284 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:17:28,284 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:17:28,284 INFO] src.engine_hmm: Bull 0.9712 0.0073 0.0169 0.0046
[2026-05-15 01:17:28,285 INFO] src.engine_hmm: Bear 0.0000 0.9576 0.0000 0.0424
[2026-05-15 01:17:28,285 INFO] src.engine_hmm: Chop_Low 0.0151 0.0083 0.9626 0.0140
[2026-05-15 01:17:28,285 INFO] src.engine_hmm: Chop_High 0.0118 0.0078 0.0282 0.9522
[2026-05-15 01:17:28,285 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:17:28,285 INFO] src.engine_hmm: Bull: return=0.932961, vol=-0.384900, rsi_slope=-0.030568
[2026-05-15 01:17:28,286 INFO] src.engine_hmm: Bear: return=-0.815365, vol=1.574822, rsi_slope=-0.008600
[2026-05-15 01:17:28,286 INFO] src.engine_hmm: Chop_Low: return=-0.068448, vol=-0.619538, rsi_slope=0.001913
[2026-05-15 01:17:28,286 INFO] src.engine_hmm: Chop_High: return=-0.394788, vol=0.210067, rsi_slope=0.034595
[2026-05-15 01:17:28,286 INFO] src.engine_hmm: Total regime transitions: 381
[2026-05-15 01:17:28,287 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-07 17:00:00: Chop_High -> Chop_Low
[2026-05-15 01:17:28,287 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-08 12:00:00: Chop_Low -> Chop_High
[2026-05-15 01:17:28,288 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 12:00:00: Chop_High -> Bull
[2026-05-15 01:17:28,288 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 21:00:00: Bull -> Chop_High
[2026-05-15 01:17:28,288 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-14 16:00:00: Chop_High -> Bull
[2026-05-15 01:17:28,289 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-15 17:00:00: Bull -> Chop_High
[2026-05-15 01:17:28,289 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-16 10:00:00: Chop_High -> Bull
[2026-05-15 01:17:28,290 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-16 20:00:00: Bull -> Chop_Low
[2026-05-15 01:17:28,290 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-17 04:00:00: Chop_Low -> Chop_High
[2026-05-15 01:17:28,290 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-18 03:00:00: Chop_High -> Chop_Low
[2026-05-15 01:17:28,310 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:17:28,322 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:17:28,382 INFO] src.engine_xgb: XGB Train Acc: 0.5105 | Test Acc: 0.5105
[2026-05-15 01:17:28,382 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.17662784), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11164687), 'atr_normalized': np.float32(0.10324133), 'prev_log_return': np.float32(0.12472613), 'usdchf_log_return': np.float32(0.102918215), 'xagusd_log_return': np.float32(0.15130286), 'xtiusd_log_return': np.float32(0.10557381), 'synth_vix_zscore': np.float32(0.12396287)}
[2026-05-15 01:17:28,383 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:17:28,430 INFO] src.engine_xgb: XGB Train Acc: 0.4942 | Test Acc: 0.4942
[2026-05-15 01:17:28,430 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0501376), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16525747), 'atr_normalized': np.float32(0.116192736), 'prev_log_return': np.float32(0.14411028), 'usdchf_log_return': np.float32(0.1297103), 'xagusd_log_return': np.float32(0.14084935), 'xtiusd_log_return': np.float32(0.10307676), 'synth_vix_zscore': np.float32(0.15066545)}
[2026-05-15 01:17:28,430 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:17:28,477 INFO] src.engine_xgb: XGB Train Acc: 0.4939 | Test Acc: 0.4939
[2026-05-15 01:17:28,477 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.076188006), 'gmm_vol_cluster': np.float32(0.07833365), 'rsi_slope': np.float32(0.11460697), 'atr_normalized': np.float32(0.13249537), 'prev_log_return': np.float32(0.10470049), 'usdchf_log_return': np.float32(0.1190811), 'xagusd_log_return': np.float32(0.11067379), 'xtiusd_log_return': np.float32(0.10769845), 'synth_vix_zscore': np.float32(0.15622216)}
[2026-05-15 01:17:28,478 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:17:28,479 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.16146, 0.63340) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:28,558 INFO] src.backtester: Backtest [H1]: Sharpe=-3.863 | MaxDD=0.095 | WR=0.328 | Return=-9.0% | Trades=61
[2026-05-15 01:17:28,558 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:28,625 INFO] src.engine_xgb: XGB Train Acc: 0.4961 | Test Acc: 0.4961
[2026-05-15 01:17:28,625 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14504172), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11552848), 'atr_normalized': np.float32(0.13853684), 'prev_log_return': np.float32(0.10522013), 'usdchf_log_return': np.float32(0.11002626), 'xagusd_log_return': np.float32(0.15996031), 'xtiusd_log_return': np.float32(0.10282326), 'synth_vix_zscore': np.float32(0.12286293)}
[2026-05-15 01:17:28,625 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:17:28,684 INFO] src.engine_xgb: XGB Train Acc: 0.4891 | Test Acc: 0.4891
[2026-05-15 01:17:28,684 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11230697), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14161682), 'atr_normalized': np.float32(0.12885138), 'prev_log_return': np.float32(0.13598093), 'usdchf_log_return': np.float32(0.105738714), 'xagusd_log_return': np.float32(0.120363064), 'xtiusd_log_return': np.float32(0.12135695), 'synth_vix_zscore': np.float32(0.13378517)}
[2026-05-15 01:17:28,684 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:17:28,744 INFO] src.engine_xgb: XGB Train Acc: 0.4937 | Test Acc: 0.4937
[2026-05-15 01:17:28,744 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.124772534), 'gmm_vol_cluster': np.float32(0.042929966), 'rsi_slope': np.float32(0.14314921), 'atr_normalized': np.float32(0.11000713), 'prev_log_return': np.float32(0.1112795), 'usdchf_log_return': np.float32(0.10210412), 'xagusd_log_return': np.float32(0.13585724), 'xtiusd_log_return': np.float32(0.104290776), 'synth_vix_zscore': np.float32(0.12560955)}
[2026-05-15 01:17:28,744 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:17:28,745 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47142, 0.22575) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:28,829 INFO] src.backtester: Backtest [H1]: Sharpe=-4.112 | MaxDD=0.093 | WR=0.239 | Return=-8.8% | Trades=67
[2026-05-15 01:17:28,830 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:28,916 INFO] src.engine_xgb: XGB Train Acc: 0.5047 | Test Acc: 0.5047
[2026-05-15 01:17:28,916 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10231199), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.17551674), 'atr_normalized': np.float32(0.124905884), 'prev_log_return': np.float32(0.120344155), 'usdchf_log_return': np.float32(0.12102941), 'xagusd_log_return': np.float32(0.12503582), 'xtiusd_log_return': np.float32(0.11680466), 'synth_vix_zscore': np.float32(0.11405132)}
[2026-05-15 01:17:28,916 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:17:28,986 INFO] src.engine_xgb: XGB Train Acc: 0.4920 | Test Acc: 0.4920
[2026-05-15 01:17:28,986 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13026975), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14468487), 'atr_normalized': np.float32(0.12232792), 'prev_log_return': np.float32(0.15544142), 'usdchf_log_return': np.float32(0.09799482), 'xagusd_log_return': np.float32(0.11932297), 'xtiusd_log_return': np.float32(0.124913916), 'synth_vix_zscore': np.float32(0.10504431)}
[2026-05-15 01:17:28,987 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:17:29,095 INFO] src.engine_xgb: XGB Train Acc: 0.4866 | Test Acc: 0.4866
[2026-05-15 01:17:29,096 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10212283), 'gmm_vol_cluster': np.float32(0.060273223), 'rsi_slope': np.float32(0.14804722), 'atr_normalized': np.float32(0.1160284), 'prev_log_return': np.float32(0.10260754), 'usdchf_log_return': np.float32(0.10460486), 'xagusd_log_return': np.float32(0.12876707), 'xtiusd_log_return': np.float32(0.09865924), 'synth_vix_zscore': np.float32(0.13888958)}
[2026-05-15 01:17:29,096 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:17:29,098 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.62208, 0.06248) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:29,166 INFO] src.backtester: Backtest [H1]: Sharpe=-0.324 | MaxDD=0.037 | WR=0.304 | Return=-0.6% | Trades=56
[2026-05-15 01:17:29,166 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:29,173 INFO] src.optimizer: WFO [H1] window start=25920: trades=56 sharpe=-0.324 cv_sharpe=-3.988 score=-0.201
[2026-05-15 01:17:30,586 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:17:30,597 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:17:30,598 INFO] src.engine_hmm: Bull 0.9641 0.0033 0.0238 0.0088
[2026-05-15 01:17:30,600 INFO] src.engine_hmm: Bear 0.0031 0.9632 0.0253 0.0085
[2026-05-15 01:17:30,602 INFO] src.engine_hmm: Chop_Low 0.0202 0.0128 0.9611 0.0059
[2026-05-15 01:17:30,603 INFO] src.engine_hmm: Chop_High 0.0132 0.0319 0.0004 0.9545
[2026-05-15 01:17:30,606 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:17:30,607 INFO] src.engine_hmm: Bull: return=0.817569, vol=-0.421686, rsi_slope=-0.031054
[2026-05-15 01:17:30,607 INFO] src.engine_hmm: Bear: return=-0.707594, vol=0.203145, rsi_slope=0.015833
[2026-05-15 01:17:30,609 INFO] src.engine_hmm: Chop_Low: return=-0.112783, vol=-0.524620, rsi_slope=0.012607
[2026-05-15 01:17:30,610 INFO] src.engine_hmm: Chop_High: return=0.062986, vol=1.628102, rsi_slope=-0.001499
[2026-05-15 01:17:30,611 INFO] src.engine_hmm: Total regime transitions: 377
[2026-05-15 01:17:30,612 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-02 19:00:00: Chop_Low -> Bull
[2026-05-15 01:17:30,613 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 06:00:00: Bull -> Chop_Low
[2026-05-15 01:17:30,614 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 15:00:00: Chop_Low -> Chop_High
[2026-05-15 01:17:30,615 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-04 12:00:00: Chop_High -> Bear
[2026-05-15 01:17:30,616 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 12:00:00: Bear -> Chop_Low
[2026-05-15 01:17:30,617 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 16:00:00: Chop_Low -> Bull
[2026-05-15 01:17:30,618 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-08 11:00:00: Bull -> Chop_Low
[2026-05-15 01:17:30,619 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 15:00:00: Chop_Low -> Chop_High
[2026-05-15 01:17:30,619 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 16:00:00: Chop_High -> Bear
[2026-05-15 01:17:30,620 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-11 07:00:00: Bear -> Bull
[2026-05-15 01:17:30,668 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:17:30,695 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:17:30,860 INFO] src.engine_xgb: XGB Train Acc: 0.5209 | Test Acc: 0.5209
[2026-05-15 01:17:30,860 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12618528), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1600583), 'atr_normalized': np.float32(0.10063176), 'prev_log_return': np.float32(0.14944015), 'usdchf_log_return': np.float32(0.12229628), 'xagusd_log_return': np.float32(0.12941134), 'xtiusd_log_return': np.float32(0.110106096), 'synth_vix_zscore': np.float32(0.1018707)}
[2026-05-15 01:17:30,860 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:17:30,933 INFO] src.engine_xgb: XGB Train Acc: 0.5162 | Test Acc: 0.5162
[2026-05-15 01:17:30,933 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.106491424), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15053791), 'atr_normalized': np.float32(0.11926661), 'prev_log_return': np.float32(0.102448404), 'usdchf_log_return': np.float32(0.13076754), 'xagusd_log_return': np.float32(0.12525305), 'xtiusd_log_return': np.float32(0.13883936), 'synth_vix_zscore': np.float32(0.12639572)}
[2026-05-15 01:17:30,934 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:17:31,005 INFO] src.engine_xgb: XGB Train Acc: 0.4888 | Test Acc: 0.4888
[2026-05-15 01:17:31,006 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12569815), 'gmm_vol_cluster': np.float32(0.1360496), 'rsi_slope': np.float32(0.116960734), 'atr_normalized': np.float32(0.12006481), 'prev_log_return': np.float32(0.11030762), 'usdchf_log_return': np.float32(0.10096841), 'xagusd_log_return': np.float32(0.120192625), 'xtiusd_log_return': np.float32(0.0957277), 'synth_vix_zscore': np.float32(0.07403027)}
[2026-05-15 01:17:31,007 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:17:31,008 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.56732, -0.02191) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:31,108 INFO] src.backtester: Backtest [H1]: Sharpe=-0.584 | MaxDD=0.064 | WR=0.350 | Return=-2.2% | Trades=80
[2026-05-15 01:17:31,108 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:31,209 INFO] src.engine_xgb: XGB Train Acc: 0.5039 | Test Acc: 0.5039
[2026-05-15 01:17:31,209 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12609103), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15728144), 'atr_normalized': np.float32(0.117143124), 'prev_log_return': np.float32(0.13649608), 'usdchf_log_return': np.float32(0.11449172), 'xagusd_log_return': np.float32(0.1296141), 'xtiusd_log_return': np.float32(0.10403899), 'synth_vix_zscore': np.float32(0.1148435)}
[2026-05-15 01:17:31,210 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:17:31,305 INFO] src.engine_xgb: XGB Train Acc: 0.4974 | Test Acc: 0.4974
[2026-05-15 01:17:31,306 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10287009), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12108932), 'atr_normalized': np.float32(0.10395252), 'prev_log_return': np.float32(0.13400932), 'usdchf_log_return': np.float32(0.13007957), 'xagusd_log_return': np.float32(0.1354065), 'xtiusd_log_return': np.float32(0.14386137), 'synth_vix_zscore': np.float32(0.1287313)}
[2026-05-15 01:17:31,307 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:17:31,451 INFO] src.engine_xgb: XGB Train Acc: 0.5023 | Test Acc: 0.5023
[2026-05-15 01:17:31,452 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09059615), 'gmm_vol_cluster': np.float32(0.12305865), 'rsi_slope': np.float32(0.12182219), 'atr_normalized': np.float32(0.10547422), 'prev_log_return': np.float32(0.113955304), 'usdchf_log_return': np.float32(0.09314964), 'xagusd_log_return': np.float32(0.15254611), 'xtiusd_log_return': np.float32(0.09593311), 'synth_vix_zscore': np.float32(0.10346466)}
[2026-05-15 01:17:31,453 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:17:31,455 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47816, 0.15210) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:31,595 INFO] src.backtester: Backtest [H1]: Sharpe=-1.946 | MaxDD=0.109 | WR=0.338 | Return=-6.1% | Trades=74
[2026-05-15 01:17:31,597 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:31,784 INFO] src.engine_xgb: XGB Train Acc: 0.5022 | Test Acc: 0.5022
[2026-05-15 01:17:31,784 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10636407), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15050225), 'atr_normalized': np.float32(0.12734555), 'prev_log_return': np.float32(0.12289683), 'usdchf_log_return': np.float32(0.11768165), 'xagusd_log_return': np.float32(0.13731141), 'xtiusd_log_return': np.float32(0.116189666), 'synth_vix_zscore': np.float32(0.12170862)}
[2026-05-15 01:17:31,786 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:17:31,922 INFO] src.engine_xgb: XGB Train Acc: 0.5125 | Test Acc: 0.5125
[2026-05-15 01:17:31,923 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12124282), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14770386), 'atr_normalized': np.float32(0.12853274), 'prev_log_return': np.float32(0.11911803), 'usdchf_log_return': np.float32(0.13108426), 'xagusd_log_return': np.float32(0.12814128), 'xtiusd_log_return': np.float32(0.11695605), 'synth_vix_zscore': np.float32(0.10722098)}
[2026-05-15 01:17:31,924 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:17:32,063 INFO] src.engine_xgb: XGB Train Acc: 0.5020 | Test Acc: 0.5020
[2026-05-15 01:17:32,066 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.122758694), 'gmm_vol_cluster': np.float32(0.10208268), 'rsi_slope': np.float32(0.13324493), 'atr_normalized': np.float32(0.10933652), 'prev_log_return': np.float32(0.11738512), 'usdchf_log_return': np.float32(0.10285206), 'xagusd_log_return': np.float32(0.102991246), 'xtiusd_log_return': np.float32(0.0855927), 'synth_vix_zscore': np.float32(0.12375609)}
[2026-05-15 01:17:32,070 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:17:32,072 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.40708, 0.22442) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:32,182 INFO] src.backtester: Backtest [H1]: Sharpe=-4.367 | MaxDD=0.122 | WR=0.207 | Return=-11.2% | Trades=58
[2026-05-15 01:17:32,182 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:32,194 INFO] src.optimizer: WFO [H1] window start=30240: trades=58 sharpe=-4.367 cv_sharpe=-1.265 score=-0.500
[2026-05-15 01:17:33,543 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:17:33,544 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:17:33,544 INFO] src.engine_hmm: Bull 0.9649 0.0119 0.0000 0.0233
[2026-05-15 01:17:33,545 INFO] src.engine_hmm: Bear 0.0048 0.9672 0.0264 0.0016
[2026-05-15 01:17:33,546 INFO] src.engine_hmm: Chop_Low 0.0048 0.0135 0.9586 0.0232
[2026-05-15 01:17:33,546 INFO] src.engine_hmm: Chop_High 0.0137 0.0044 0.0226 0.9593
[2026-05-15 01:17:33,547 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:17:33,547 INFO] src.engine_hmm: Bull: return=1.232076, vol=1.187029, rsi_slope=-0.018595
[2026-05-15 01:17:33,548 INFO] src.engine_hmm: Bear: return=-1.059672, vol=0.500410, rsi_slope=0.027183
[2026-05-15 01:17:33,548 INFO] src.engine_hmm: Chop_Low: return=-0.396498, vol=-0.664236, rsi_slope=0.021667
[2026-05-15 01:17:33,550 INFO] src.engine_hmm: Chop_High: return=0.478525, vol=-0.459012, rsi_slope=-0.032764
[2026-05-15 01:17:33,550 INFO] src.engine_hmm: Total regime transitions: 375
[2026-05-15 01:17:33,551 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-23 16:00:00: Chop_Low -> Chop_High
[2026-05-15 01:17:33,552 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-24 04:00:00: Chop_High -> Bull
[2026-05-15 01:17:33,552 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-25 18:00:00: Bull -> Bear
[2026-05-15 01:17:33,553 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-28 01:00:00: Bear -> Bull
[2026-05-15 01:17:33,554 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-03 06:00:00: Bull -> Chop_High
[2026-05-15 01:17:33,554 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-04 02:00:00: Chop_High -> Bull
[2026-05-15 01:17:33,554 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-10 21:00:00: Bull -> Bear
[2026-05-15 01:17:33,555 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-17 03:00:00: Bear -> Bull
[2026-05-15 01:17:33,555 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-17 18:00:00: Bull -> Chop_High
[2026-05-15 01:17:33,557 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-18 04:00:00: Chop_High -> Chop_Low
[2026-05-15 01:17:33,609 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:17:33,656 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:17:33,959 INFO] src.engine_xgb: XGB Train Acc: 0.4895 | Test Acc: 0.4895
[2026-05-15 01:17:33,960 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.120651245), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11659924), 'atr_normalized': np.float32(0.12948188), 'prev_log_return': np.float32(0.11784156), 'usdchf_log_return': np.float32(0.1421823), 'xagusd_log_return': np.float32(0.09500723), 'xtiusd_log_return': np.float32(0.10231366), 'synth_vix_zscore': np.float32(0.17592286)}
[2026-05-15 01:17:33,961 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:17:34,059 INFO] src.engine_xgb: XGB Train Acc: 0.5267 | Test Acc: 0.5267
[2026-05-15 01:17:34,060 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.07204717), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.16697504), 'atr_normalized': np.float32(0.119584486), 'prev_log_return': np.float32(0.12833259), 'usdchf_log_return': np.float32(0.13033456), 'xagusd_log_return': np.float32(0.12700398), 'xtiusd_log_return': np.float32(0.11697312), 'synth_vix_zscore': np.float32(0.13874903)}
[2026-05-15 01:17:34,061 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:17:34,157 INFO] src.engine_xgb: XGB Train Acc: 0.5020 | Test Acc: 0.5020
[2026-05-15 01:17:34,159 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13591513), 'gmm_vol_cluster': np.float32(0.09330178), 'rsi_slope': np.float32(0.10252254), 'atr_normalized': np.float32(0.14310078), 'prev_log_return': np.float32(0.12469181), 'usdchf_log_return': np.float32(0.08665014), 'xagusd_log_return': np.float32(0.14416544), 'xtiusd_log_return': np.float32(0.08570976), 'synth_vix_zscore': np.float32(0.08394255)}
[2026-05-15 01:17:34,160 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:17:34,164 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.42962, 0.34995) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:34,313 INFO] src.backtester: Backtest [H1]: Sharpe=-3.803 | MaxDD=0.207 | WR=0.279 | Return=-14.7% | Trades=104
[2026-05-15 01:17:34,313 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:34,456 INFO] src.engine_xgb: XGB Train Acc: 0.4862 | Test Acc: 0.4862
[2026-05-15 01:17:34,457 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1269024), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.124159954), 'atr_normalized': np.float32(0.123066425), 'prev_log_return': np.float32(0.12633394), 'usdchf_log_return': np.float32(0.13367407), 'xagusd_log_return': np.float32(0.12228566), 'xtiusd_log_return': np.float32(0.11261632), 'synth_vix_zscore': np.float32(0.13096122)}
[2026-05-15 01:17:34,459 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:17:34,594 INFO] src.engine_xgb: XGB Train Acc: 0.5245 | Test Acc: 0.5245
[2026-05-15 01:17:34,594 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09493702), 'gmm_vol_cluster': np.float32(0.11246359), 'rsi_slope': np.float32(0.13062257), 'atr_normalized': np.float32(0.10656295), 'prev_log_return': np.float32(0.10790703), 'usdchf_log_return': np.float32(0.11190451), 'xagusd_log_return': np.float32(0.111155435), 'xtiusd_log_return': np.float32(0.11749942), 'synth_vix_zscore': np.float32(0.10694748)}
[2026-05-15 01:17:34,595 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:17:34,722 INFO] src.engine_xgb: XGB Train Acc: 0.5073 | Test Acc: 0.5073
[2026-05-15 01:17:34,723 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16126403), 'gmm_vol_cluster': np.float32(0.08776736), 'rsi_slope': np.float32(0.10464456), 'atr_normalized': np.float32(0.12247511), 'prev_log_return': np.float32(0.09766454), 'usdchf_log_return': np.float32(0.10900195), 'xagusd_log_return': np.float32(0.09865283), 'xtiusd_log_return': np.float32(0.10361627), 'synth_vix_zscore': np.float32(0.1149133)}
[2026-05-15 01:17:34,724 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:17:34,725 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47849, 0.22854) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:34,857 INFO] src.backtester: Backtest [H1]: Sharpe=-3.356 | MaxDD=0.138 | WR=0.283 | Return=-10.7% | Trades=106
[2026-05-15 01:17:34,858 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:34,977 INFO] src.engine_xgb: XGB Train Acc: 0.4998 | Test Acc: 0.4998
[2026-05-15 01:17:34,978 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.112966426), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12646145), 'atr_normalized': np.float32(0.119031735), 'prev_log_return': np.float32(0.123796135), 'usdchf_log_return': np.float32(0.13254288), 'xagusd_log_return': np.float32(0.134902), 'xtiusd_log_return': np.float32(0.12572001), 'synth_vix_zscore': np.float32(0.12457932)}
[2026-05-15 01:17:34,980 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:17:35,107 INFO] src.engine_xgb: XGB Train Acc: 0.5156 | Test Acc: 0.5156
[2026-05-15 01:17:35,107 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09300202), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14105287), 'atr_normalized': np.float32(0.1455623), 'prev_log_return': np.float32(0.12155174), 'usdchf_log_return': np.float32(0.14209878), 'xagusd_log_return': np.float32(0.11726982), 'xtiusd_log_return': np.float32(0.12389039), 'synth_vix_zscore': np.float32(0.11557213)}
[2026-05-15 01:17:35,108 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:17:35,205 INFO] src.engine_xgb: XGB Train Acc: 0.5020 | Test Acc: 0.5020
[2026-05-15 01:17:35,205 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12915283), 'gmm_vol_cluster': np.float32(0.062120035), 'rsi_slope': np.float32(0.11553954), 'atr_normalized': np.float32(0.107402466), 'prev_log_return': np.float32(0.12483684), 'usdchf_log_return': np.float32(0.11315284), 'xagusd_log_return': np.float32(0.12584987), 'xtiusd_log_return': np.float32(0.10859286), 'synth_vix_zscore': np.float32(0.11335274)}
[2026-05-15 01:17:35,206 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:17:35,207 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.64128, 0.06038) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:35,301 INFO] src.backtester: Backtest [H1]: Sharpe=-5.717 | MaxDD=0.135 | WR=0.186 | Return=-12.0% | Trades=70
[2026-05-15 01:17:35,302 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:35,311 INFO] src.optimizer: WFO [H1] window start=34560: trades=70 sharpe=-5.717 cv_sharpe=-3.580 score=-0.500
[2026-05-15 01:17:39,490 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:17:39,490 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:17:39,491 INFO] src.engine_hmm: Bull 0.9686 0.0096 0.0000 0.0219
[2026-05-15 01:17:39,491 INFO] src.engine_hmm: Bear 0.0045 0.9643 0.0073 0.0239
[2026-05-15 01:17:39,491 INFO] src.engine_hmm: Chop_Low 0.0078 0.0041 0.9683 0.0199
[2026-05-15 01:17:39,492 INFO] src.engine_hmm: Chop_High 0.0081 0.0077 0.0304 0.9538
[2026-05-15 01:17:39,492 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:17:39,492 INFO] src.engine_hmm: Bull: return=1.279864, vol=1.060903, rsi_slope=-0.021397
[2026-05-15 01:17:39,492 INFO] src.engine_hmm: Bear: return=-1.318575, vol=0.696817, rsi_slope=0.043220
[2026-05-15 01:17:39,493 INFO] src.engine_hmm: Chop_Low: return=-0.153504, vol=-0.850418, rsi_slope=-0.005571
[2026-05-15 01:17:39,493 INFO] src.engine_hmm: Chop_High: return=0.057636, vol=-0.067526, rsi_slope=-0.002777
[2026-05-15 01:17:39,493 INFO] src.engine_hmm: Total regime transitions: 367
[2026-05-15 01:17:39,494 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-16 06:00:00: Bull -> Chop_High
[2026-05-15 01:17:39,495 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-18 12:00:00: Chop_High -> Chop_Low
[2026-05-15 01:17:39,496 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-18 17:00:00: Chop_Low -> Bear
[2026-05-15 01:17:39,496 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-22 02:00:00: Bear -> Chop_High
[2026-05-15 01:17:39,497 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-22 15:00:00: Chop_High -> Chop_Low
[2026-05-15 01:17:39,497 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-23 10:00:00: Chop_Low -> Chop_High
[2026-05-15 01:17:39,498 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-24 18:00:00: Chop_High -> Chop_Low
[2026-05-15 01:17:39,498 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-28 01:00:00: Chop_Low -> Chop_High
[2026-05-15 01:17:39,499 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 03:00:00: Chop_High -> Chop_Low
[2026-05-15 01:17:39,499 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 13:00:00: Chop_Low -> Chop_High
[2026-05-15 01:17:39,528 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:17:39,545 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:17:39,617 INFO] src.engine_xgb: XGB Train Acc: 0.4833 | Test Acc: 0.4833
[2026-05-15 01:17:39,617 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1554419), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.118483834), 'atr_normalized': np.float32(0.08975008), 'prev_log_return': np.float32(0.1279032), 'usdchf_log_return': np.float32(0.13567615), 'xagusd_log_return': np.float32(0.10506517), 'xtiusd_log_return': np.float32(0.12281745), 'synth_vix_zscore': np.float32(0.14486226)}
[2026-05-15 01:17:39,618 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:17:39,682 INFO] src.engine_xgb: XGB Train Acc: 0.5120 | Test Acc: 0.5120
[2026-05-15 01:17:39,682 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12682177), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1484384), 'atr_normalized': np.float32(0.14529112), 'prev_log_return': np.float32(0.12645522), 'usdchf_log_return': np.float32(0.10030203), 'xagusd_log_return': np.float32(0.111262254), 'xtiusd_log_return': np.float32(0.12654085), 'synth_vix_zscore': np.float32(0.114888325)}
[2026-05-15 01:17:39,683 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:17:39,854 INFO] src.engine_xgb: XGB Train Acc: 0.4858 | Test Acc: 0.4858
[2026-05-15 01:17:39,863 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.07919884), 'gmm_vol_cluster': np.float32(0.14176357), 'rsi_slope': np.float32(0.10667187), 'atr_normalized': np.float32(0.11082947), 'prev_log_return': np.float32(0.108168475), 'usdchf_log_return': np.float32(0.11824138), 'xagusd_log_return': np.float32(0.12082816), 'xtiusd_log_return': np.float32(0.10178447), 'synth_vix_zscore': np.float32(0.11251381)}
[2026-05-15 01:17:39,865 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:17:39,867 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.13686, 0.71017) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:40,045 INFO] src.backtester: Backtest [H1]: Sharpe=-1.385 | MaxDD=0.054 | WR=0.360 | Return=-3.3% | Trades=86
[2026-05-15 01:17:40,045 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:40,195 INFO] src.engine_xgb: XGB Train Acc: 0.5112 | Test Acc: 0.5112
[2026-05-15 01:17:40,196 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16508378), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14584692), 'atr_normalized': np.float32(0.09718635), 'prev_log_return': np.float32(0.12385438), 'usdchf_log_return': np.float32(0.118908145), 'xagusd_log_return': np.float32(0.12028374), 'xtiusd_log_return': np.float32(0.11085457), 'synth_vix_zscore': np.float32(0.11798213)}
[2026-05-15 01:17:40,197 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:17:40,322 INFO] src.engine_xgb: XGB Train Acc: 0.4838 | Test Acc: 0.4838
[2026-05-15 01:17:40,323 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.113714114), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.122111246), 'atr_normalized': np.float32(0.10912766), 'prev_log_return': np.float32(0.12295994), 'usdchf_log_return': np.float32(0.12500592), 'xagusd_log_return': np.float32(0.12722418), 'xtiusd_log_return': np.float32(0.14915027), 'synth_vix_zscore': np.float32(0.13070667)}
[2026-05-15 01:17:40,323 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:17:40,459 INFO] src.engine_xgb: XGB Train Acc: 0.5134 | Test Acc: 0.5134
[2026-05-15 01:17:40,459 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13244219), 'gmm_vol_cluster': np.float32(0.08734315), 'rsi_slope': np.float32(0.11203134), 'atr_normalized': np.float32(0.12601238), 'prev_log_return': np.float32(0.11381871), 'usdchf_log_return': np.float32(0.09515711), 'xagusd_log_return': np.float32(0.1073666), 'xtiusd_log_return': np.float32(0.120127276), 'synth_vix_zscore': np.float32(0.10570119)}
[2026-05-15 01:17:40,462 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:17:40,467 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.51565, 0.29314) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:40,626 INFO] src.backtester: Backtest [H1]: Sharpe=-3.965 | MaxDD=0.148 | WR=0.263 | Return=-13.3% | Trades=95
[2026-05-15 01:17:40,627 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:40,779 INFO] src.engine_xgb: XGB Train Acc: 0.5033 | Test Acc: 0.5033
[2026-05-15 01:17:40,781 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.121161945), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11744416), 'atr_normalized': np.float32(0.12976773), 'prev_log_return': np.float32(0.12989706), 'usdchf_log_return': np.float32(0.11558418), 'xagusd_log_return': np.float32(0.12750581), 'xtiusd_log_return': np.float32(0.13358818), 'synth_vix_zscore': np.float32(0.12505089)}
[2026-05-15 01:17:40,782 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:17:40,918 INFO] src.engine_xgb: XGB Train Acc: 0.4913 | Test Acc: 0.4913
[2026-05-15 01:17:40,919 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.119410545), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11460468), 'atr_normalized': np.float32(0.11932594), 'prev_log_return': np.float32(0.12985212), 'usdchf_log_return': np.float32(0.12659684), 'xagusd_log_return': np.float32(0.12418618), 'xtiusd_log_return': np.float32(0.1303384), 'synth_vix_zscore': np.float32(0.1356853)}
[2026-05-15 01:17:40,921 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:17:41,100 INFO] src.engine_xgb: XGB Train Acc: 0.4946 | Test Acc: 0.4946
[2026-05-15 01:17:41,102 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11634063), 'gmm_vol_cluster': np.float32(0.102625296), 'rsi_slope': np.float32(0.11593278), 'atr_normalized': np.float32(0.13323702), 'prev_log_return': np.float32(0.11068396), 'usdchf_log_return': np.float32(0.0963987), 'xagusd_log_return': np.float32(0.10808603), 'xtiusd_log_return': np.float32(0.101828426), 'synth_vix_zscore': np.float32(0.11486723)}
[2026-05-15 01:17:41,106 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:17:41,114 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.46960, 0.34543) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:41,258 INFO] src.backtester: Backtest [H1]: Sharpe=-3.225 | MaxDD=0.066 | WR=0.339 | Return=-6.3% | Trades=56
[2026-05-15 01:17:41,259 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:41,272 INFO] src.optimizer: WFO [H1] window start=38880: trades=56 sharpe=-3.225 cv_sharpe=-2.675 score=-0.500
[2026-05-15 01:17:43,710 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:17:43,711 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:17:43,711 INFO] src.engine_hmm: Bull 0.9719 0.0000 0.0227 0.0053
[2026-05-15 01:17:43,711 INFO] src.engine_hmm: Bear 0.0000 0.9596 0.0319 0.0084
[2026-05-15 01:17:43,712 INFO] src.engine_hmm: Chop_Low 0.0202 0.0230 0.9533 0.0035
[2026-05-15 01:17:43,712 INFO] src.engine_hmm: Chop_High 0.0123 0.0182 0.0015 0.9680
[2026-05-15 01:17:43,712 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:17:43,713 INFO] src.engine_hmm: Bull: return=0.969918, vol=-0.056998, rsi_slope=-0.024206
[2026-05-15 01:17:43,713 INFO] src.engine_hmm: Bear: return=-0.772311, vol=-0.263811, rsi_slope=0.038058
[2026-05-15 01:17:43,713 INFO] src.engine_hmm: Chop_Low: return=0.017051, vol=-0.512585, rsi_slope=-0.002260
[2026-05-15 01:17:43,714 INFO] src.engine_hmm: Chop_High: return=-0.637463, vol=1.643346, rsi_slope=-0.011641
[2026-05-15 01:17:43,714 INFO] src.engine_hmm: Total regime transitions: 372
[2026-05-15 01:17:43,715 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-21 14:00:00: Bear -> Chop_Low
[2026-05-15 01:17:43,716 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-23 16:00:00: Chop_Low -> Bull
[2026-05-15 01:17:43,716 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-24 14:00:00: Bull -> Chop_Low
[2026-05-15 01:17:43,717 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-25 17:00:00: Chop_Low -> Bear
[2026-05-15 01:17:43,717 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-25 20:00:00: Bear -> Chop_Low
[2026-05-15 01:17:43,718 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-29 17:00:00: Chop_Low -> Bull
[2026-05-15 01:17:43,718 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-31 09:00:00: Bull -> Chop_Low
[2026-05-15 01:17:43,720 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-04 17:00:00: Chop_Low -> Bear
[2026-05-15 01:17:43,721 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-08 03:00:00: Bear -> Chop_Low
[2026-05-15 01:17:43,722 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-08 19:00:00: Chop_Low -> Bear
[2026-05-15 01:17:43,751 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:17:43,769 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:17:43,891 INFO] src.engine_xgb: XGB Train Acc: 0.5146 | Test Acc: 0.5146
[2026-05-15 01:17:43,892 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1460204), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1359925), 'atr_normalized': np.float32(0.10183491), 'prev_log_return': np.float32(0.15803145), 'usdchf_log_return': np.float32(0.11385152), 'xagusd_log_return': np.float32(0.09189379), 'xtiusd_log_return': np.float32(0.1265622), 'synth_vix_zscore': np.float32(0.12581325)}
[2026-05-15 01:17:43,892 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:17:43,978 INFO] src.engine_xgb: XGB Train Acc: 0.4859 | Test Acc: 0.4859
[2026-05-15 01:17:43,979 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15365234), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.08298422), 'atr_normalized': np.float32(0.14841752), 'prev_log_return': np.float32(0.095078304), 'usdchf_log_return': np.float32(0.108480886), 'xagusd_log_return': np.float32(0.13569184), 'xtiusd_log_return': np.float32(0.10875677), 'synth_vix_zscore': np.float32(0.16693813)}
[2026-05-15 01:17:43,979 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:17:44,068 INFO] src.engine_xgb: XGB Train Acc: 0.5000 | Test Acc: 0.5000
[2026-05-15 01:17:44,068 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.121826895), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.10280372), 'atr_normalized': np.float32(0.10439411), 'prev_log_return': np.float32(0.114447944), 'usdchf_log_return': np.float32(0.1378977), 'xagusd_log_return': np.float32(0.13327268), 'xtiusd_log_return': np.float32(0.15569282), 'synth_vix_zscore': np.float32(0.12966411)}
[2026-05-15 01:17:44,069 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:17:44,071 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.73608, -0.15122) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:44,188 INFO] src.backtester: Backtest [H1]: Sharpe=-3.852 | MaxDD=0.148 | WR=0.291 | Return=-12.7% | Trades=86
[2026-05-15 01:17:44,188 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:44,433 INFO] src.engine_xgb: XGB Train Acc: 0.4956 | Test Acc: 0.4956
[2026-05-15 01:17:44,434 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13686405), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13096821), 'atr_normalized': np.float32(0.10754834), 'prev_log_return': np.float32(0.12613009), 'usdchf_log_return': np.float32(0.117347226), 'xagusd_log_return': np.float32(0.10385285), 'xtiusd_log_return': np.float32(0.13854076), 'synth_vix_zscore': np.float32(0.13874851)}
[2026-05-15 01:17:44,434 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:17:44,605 INFO] src.engine_xgb: XGB Train Acc: 0.4922 | Test Acc: 0.4922
[2026-05-15 01:17:44,605 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10600183), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1315963), 'atr_normalized': np.float32(0.11960502), 'prev_log_return': np.float32(0.14758188), 'usdchf_log_return': np.float32(0.117640875), 'xagusd_log_return': np.float32(0.119195946), 'xtiusd_log_return': np.float32(0.13157272), 'synth_vix_zscore': np.float32(0.12680545)}
[2026-05-15 01:17:44,606 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:17:44,736 INFO] src.engine_xgb: XGB Train Acc: 0.4745 | Test Acc: 0.4745
[2026-05-15 01:17:44,743 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13817771), 'gmm_vol_cluster': np.float32(0.10622632), 'rsi_slope': np.float32(0.1187626), 'atr_normalized': np.float32(0.11388098), 'prev_log_return': np.float32(0.10338528), 'usdchf_log_return': np.float32(0.115903765), 'xagusd_log_return': np.float32(0.11273743), 'xtiusd_log_return': np.float32(0.104615346), 'synth_vix_zscore': np.float32(0.08631052)}
[2026-05-15 01:17:44,746 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:17:44,748 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53526, 0.16378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:44,884 INFO] src.backtester: Backtest [H1]: Sharpe=-2.147 | MaxDD=0.058 | WR=0.390 | Return=-4.5% | Trades=59
[2026-05-15 01:17:44,885 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:44,998 INFO] src.engine_xgb: XGB Train Acc: 0.4815 | Test Acc: 0.4815
[2026-05-15 01:17:44,998 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13687904), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12317624), 'atr_normalized': np.float32(0.12585858), 'prev_log_return': np.float32(0.13885166), 'usdchf_log_return': np.float32(0.1260977), 'xagusd_log_return': np.float32(0.12157305), 'xtiusd_log_return': np.float32(0.13492723), 'synth_vix_zscore': np.float32(0.09263653)}
[2026-05-15 01:17:44,999 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:17:45,096 INFO] src.engine_xgb: XGB Train Acc: 0.4875 | Test Acc: 0.4875
[2026-05-15 01:17:45,096 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10982409), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13072123), 'atr_normalized': np.float32(0.120905094), 'prev_log_return': np.float32(0.11747843), 'usdchf_log_return': np.float32(0.13424195), 'xagusd_log_return': np.float32(0.13211453), 'xtiusd_log_return': np.float32(0.11888507), 'synth_vix_zscore': np.float32(0.13582954)}
[2026-05-15 01:17:45,097 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:17:45,199 INFO] src.engine_xgb: XGB Train Acc: 0.4758 | Test Acc: 0.4758
[2026-05-15 01:17:45,199 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1219929), 'gmm_vol_cluster': np.float32(0.09177721), 'rsi_slope': np.float32(0.11936051), 'atr_normalized': np.float32(0.11569124), 'prev_log_return': np.float32(0.10595393), 'usdchf_log_return': np.float32(0.10643652), 'xagusd_log_return': np.float32(0.12040919), 'xtiusd_log_return': np.float32(0.10864662), 'synth_vix_zscore': np.float32(0.109731905)}
[2026-05-15 01:17:45,200 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:17:45,201 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.43440, 0.22813) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:45,289 INFO] src.backtester: Backtest [H1]: Sharpe=-3.324 | MaxDD=0.094 | WR=0.205 | Return=-8.2% | Trades=44
[2026-05-15 01:17:45,290 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:45,299 INFO] src.optimizer: WFO [H1] window start=43200: trades=44 sharpe=-3.324 cv_sharpe=-2.999 score=-0.500
[2026-05-15 01:17:45,300 INFO] src.optimizer: WFO [H1]: 8/8 valid | median_trades=56 | score=-0.543 | std_sharpe=1.997 | WFE=0.84 | window_scores=[0.12, -0.5, -0.224, -0.201, -0.5, -0.5, -0.5, -0.5]
[2026-05-15 01:17:45,354 INFO] src.optimizer: Trial 27 [H1/headway_cent $15 standard]: score=-1.042 | valid=8/8 | std_sharpe=1.997 | median_trades=56 | WFE=0.84 | scores=[0.12, -0.5, -0.224, -0.201, -0.5, -0.5, -0.5, -0.5]
Best trial: 23. Best value: -0.320363: 14%|█████████▌ | 28/200 [15:44<1:38:36, 34.40s/it][2026-05-15 01:17:46,951 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:17:46,952 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:17:46,952 INFO] src.engine_hmm: Bull 0.9616 0.0134 0.0000 0.0250
[2026-05-15 01:17:46,952 INFO] src.engine_hmm: Bear 0.0087 0.9613 0.0141 0.0159
[2026-05-15 01:17:46,952 INFO] src.engine_hmm: Chop_Low 0.0038 0.0084 0.9736 0.0142
[2026-05-15 01:17:46,953 INFO] src.engine_hmm: Chop_High 0.0109 0.0030 0.0318 0.9543
[2026-05-15 01:17:46,953 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:17:46,953 INFO] src.engine_hmm: Bull: return=1.254913, vol=1.208239, rsi_slope=-0.020298
[2026-05-15 01:17:46,953 INFO] src.engine_hmm: Bear: return=-1.290409, vol=0.886943, rsi_slope=0.022222
[2026-05-15 01:17:46,953 INFO] src.engine_hmm: Chop_Low: return=-0.202615, vol=-0.712702, rsi_slope=-0.012016
[2026-05-15 01:17:46,954 INFO] src.engine_hmm: Chop_High: return=0.370307, vol=-0.141238, rsi_slope=0.016549
[2026-05-15 01:17:46,954 INFO] src.engine_hmm: Total regime transitions: 350
[2026-05-15 01:17:46,954 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-27 15:00:00: Chop_Low -> Bear
[2026-05-15 01:17:46,954 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-28 01:00:00: Bear -> Chop_Low
[2026-05-15 01:17:46,955 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-02 19:00:00: Chop_Low -> Bear
[2026-05-15 01:17:46,955 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-03 10:00:00: Bear -> Chop_High
[2026-05-15 01:17:46,956 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-05 05:00:00: Chop_High -> Chop_Low
[2026-05-15 01:17:46,956 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-10 13:00:00: Chop_Low -> Bear
[2026-05-15 01:17:46,956 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-10 16:00:00: Bear -> Chop_High
[2026-05-15 01:17:46,956 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-11 12:00:00: Chop_High -> Chop_Low
[2026-05-15 01:17:46,957 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-11 18:00:00: Chop_Low -> Bear
[2026-05-15 01:17:46,957 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-12 07:00:00: Bear -> Chop_Low
[2026-05-15 01:17:46,979 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:17:46,991 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:17:47,292 INFO] src.engine_xgb: XGB Train Acc: 0.8054 | Test Acc: 0.8054
[2026-05-15 01:17:47,293 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14947219), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11089536), 'atr_normalized': np.float32(0.123386055), 'prev_log_return': np.float32(0.119415104), 'usdchf_log_return': np.float32(0.12138923), 'xagusd_log_return': np.float32(0.12654765), 'xtiusd_log_return': np.float32(0.12596789), 'synth_vix_zscore': np.float32(0.12292652)}
[2026-05-15 01:17:47,293 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:17:47,656 INFO] src.engine_xgb: XGB Train Acc: 0.8178 | Test Acc: 0.8178
[2026-05-15 01:17:47,656 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14695695), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14316726), 'atr_normalized': np.float32(0.10899205), 'prev_log_return': np.float32(0.11324071), 'usdchf_log_return': np.float32(0.124609165), 'xagusd_log_return': np.float32(0.11420505), 'xtiusd_log_return': np.float32(0.117618784), 'synth_vix_zscore': np.float32(0.1312101)}
[2026-05-15 01:17:47,657 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:17:48,136 INFO] src.engine_xgb: XGB Train Acc: 0.7937 | Test Acc: 0.7937
[2026-05-15 01:17:48,137 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11757164), 'gmm_vol_cluster': np.float32(0.08946442), 'rsi_slope': np.float32(0.1236502), 'atr_normalized': np.float32(0.11456693), 'prev_log_return': np.float32(0.11058029), 'usdchf_log_return': np.float32(0.11038707), 'xagusd_log_return': np.float32(0.111073084), 'xtiusd_log_return': np.float32(0.11382895), 'synth_vix_zscore': np.float32(0.10887743)}
[2026-05-15 01:17:48,137 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:17:48,140 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.38336, 0.21891) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:48,314 INFO] src.backtester: Backtest [H1]: Sharpe=-4.034 | MaxDD=0.145 | WR=0.236 | Return=-11.4% | Trades=182
[2026-05-15 01:17:48,315 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:48,798 INFO] src.engine_xgb: XGB Train Acc: 0.7572 | Test Acc: 0.7572
[2026-05-15 01:17:48,799 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14575347), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1207373), 'atr_normalized': np.float32(0.11949632), 'prev_log_return': np.float32(0.12241821), 'usdchf_log_return': np.float32(0.12272552), 'xagusd_log_return': np.float32(0.1248492), 'xtiusd_log_return': np.float32(0.12397781), 'synth_vix_zscore': np.float32(0.12004207)}
[2026-05-15 01:17:48,799 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:17:49,387 INFO] src.engine_xgb: XGB Train Acc: 0.7685 | Test Acc: 0.7685
[2026-05-15 01:17:49,387 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12451211), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13045822), 'atr_normalized': np.float32(0.120329276), 'prev_log_return': np.float32(0.123078115), 'usdchf_log_return': np.float32(0.12256356), 'xagusd_log_return': np.float32(0.13084117), 'xtiusd_log_return': np.float32(0.12449735), 'synth_vix_zscore': np.float32(0.12372023)}
[2026-05-15 01:17:49,388 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:17:49,891 INFO] src.engine_xgb: XGB Train Acc: 0.7577 | Test Acc: 0.7577
[2026-05-15 01:17:49,891 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09742168), 'gmm_vol_cluster': np.float32(0.102811806), 'rsi_slope': np.float32(0.11883438), 'atr_normalized': np.float32(0.11307341), 'prev_log_return': np.float32(0.1156829), 'usdchf_log_return': np.float32(0.111134514), 'xagusd_log_return': np.float32(0.11593468), 'xtiusd_log_return': np.float32(0.11672625), 'synth_vix_zscore': np.float32(0.108380474)}
[2026-05-15 01:17:49,892 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:17:49,893 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53107, 0.07740) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:50,023 INFO] src.backtester: Backtest [H1]: Sharpe=-2.042 | MaxDD=0.124 | WR=0.290 | Return=-9.6% | Trades=155
[2026-05-15 01:17:50,023 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:50,538 INFO] src.engine_xgb: XGB Train Acc: 0.6942 | Test Acc: 0.6942
[2026-05-15 01:17:50,538 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12747934), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12981571), 'atr_normalized': np.float32(0.12431256), 'prev_log_return': np.float32(0.12170315), 'usdchf_log_return': np.float32(0.122144826), 'xagusd_log_return': np.float32(0.123468764), 'xtiusd_log_return': np.float32(0.12853464), 'synth_vix_zscore': np.float32(0.122541)}
[2026-05-15 01:17:50,539 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:17:51,107 INFO] src.engine_xgb: XGB Train Acc: 0.7087 | Test Acc: 0.7087
[2026-05-15 01:17:51,107 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12367004), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13029045), 'atr_normalized': np.float32(0.116002515), 'prev_log_return': np.float32(0.11921001), 'usdchf_log_return': np.float32(0.1259177), 'xagusd_log_return': np.float32(0.12741643), 'xtiusd_log_return': np.float32(0.1261757), 'synth_vix_zscore': np.float32(0.13131724)}
[2026-05-15 01:17:51,108 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:17:51,687 INFO] src.engine_xgb: XGB Train Acc: 0.7273 | Test Acc: 0.7273
[2026-05-15 01:17:51,687 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11667863), 'gmm_vol_cluster': np.float32(0.10697577), 'rsi_slope': np.float32(0.1212474), 'atr_normalized': np.float32(0.109614536), 'prev_log_return': np.float32(0.107612), 'usdchf_log_return': np.float32(0.10699922), 'xagusd_log_return': np.float32(0.10935731), 'xtiusd_log_return': np.float32(0.10896198), 'synth_vix_zscore': np.float32(0.112553224)}
[2026-05-15 01:17:51,688 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:17:51,690 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.38300, 0.44275) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:51,792 INFO] src.backtester: Backtest [H1]: Sharpe=5.008 | MaxDD=0.045 | WR=0.351 | Return=36.8% | Trades=114
[2026-05-15 01:17:51,792 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:51,807 INFO] src.optimizer: WFO [H1] window start=12960: trades=114 sharpe=5.008 cv_sharpe=-3.038 score=1.785
[2026-05-15 01:17:53,389 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:17:53,390 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:17:53,390 INFO] src.engine_hmm: Bull 0.9677 0.0010 0.0234 0.0079
[2026-05-15 01:17:53,390 INFO] src.engine_hmm: Bear 0.0030 0.9793 0.0177 0.0000
[2026-05-15 01:17:53,390 INFO] src.engine_hmm: Chop_Low 0.0163 0.0187 0.9631 0.0020
[2026-05-15 01:17:53,391 INFO] src.engine_hmm: Chop_High 0.0268 0.0000 0.0011 0.9721
[2026-05-15 01:17:53,391 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:17:53,391 INFO] src.engine_hmm: Bull: return=0.027396, vol=0.415276, rsi_slope=-0.022172
[2026-05-15 01:17:53,393 INFO] src.engine_hmm: Bear: return=-0.038937, vol=-0.780071, rsi_slope=0.004567
[2026-05-15 01:17:53,393 INFO] src.engine_hmm: Chop_Low: return=0.018870, vol=-0.295936, rsi_slope=0.017634
[2026-05-15 01:17:53,393 INFO] src.engine_hmm: Chop_High: return=-0.015940, vol=2.210233, rsi_slope=-0.010053
[2026-05-15 01:17:53,394 INFO] src.engine_hmm: Total regime transitions: 298
[2026-05-15 01:17:53,395 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-20 20:00:00: Bear -> Bull
[2026-05-15 01:17:53,395 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-21 18:00:00: Bull -> Chop_Low
[2026-05-15 01:17:53,397 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-22 14:00:00: Chop_Low -> Bear
[2026-05-15 01:17:53,398 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-28 14:00:00: Bear -> Chop_Low
[2026-05-15 01:17:53,398 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-01 12:00:00: Chop_Low -> Bear
[2026-05-15 01:17:53,398 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-01 18:00:00: Bear -> Chop_Low
[2026-05-15 01:17:53,399 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-02 12:00:00: Chop_Low -> Bear
[2026-05-15 01:17:53,399 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-04 17:00:00: Bear -> Chop_Low
[2026-05-15 01:17:53,399 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-05 13:00:00: Chop_Low -> Bear
[2026-05-15 01:17:53,400 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-11 15:00:00: Bear -> Chop_Low
[2026-05-15 01:17:53,429 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:17:53,445 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:17:54,239 INFO] src.engine_xgb: XGB Train Acc: 0.7824 | Test Acc: 0.7824
[2026-05-15 01:17:54,240 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13070408), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12634824), 'atr_normalized': np.float32(0.12337925), 'prev_log_return': np.float32(0.12860906), 'usdchf_log_return': np.float32(0.12086418), 'xagusd_log_return': np.float32(0.12407513), 'xtiusd_log_return': np.float32(0.11974617), 'synth_vix_zscore': np.float32(0.12627389)}
[2026-05-15 01:17:54,240 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:17:54,650 INFO] src.engine_xgb: XGB Train Acc: 0.7990 | Test Acc: 0.7990
[2026-05-15 01:17:54,650 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10832768), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12398724), 'atr_normalized': np.float32(0.13235693), 'prev_log_return': np.float32(0.122722946), 'usdchf_log_return': np.float32(0.12724693), 'xagusd_log_return': np.float32(0.1270131), 'xtiusd_log_return': np.float32(0.13321918), 'synth_vix_zscore': np.float32(0.12512602)}
[2026-05-15 01:17:54,651 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:17:54,974 INFO] src.engine_xgb: XGB Train Acc: 0.8201 | Test Acc: 0.8201
[2026-05-15 01:17:54,974 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09458478), 'gmm_vol_cluster': np.float32(0.11399212), 'rsi_slope': np.float32(0.115855165), 'atr_normalized': np.float32(0.10818761), 'prev_log_return': np.float32(0.11440034), 'usdchf_log_return': np.float32(0.11311789), 'xagusd_log_return': np.float32(0.111594036), 'xtiusd_log_return': np.float32(0.11362635), 'synth_vix_zscore': np.float32(0.11464172)}
[2026-05-15 01:17:54,975 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:17:54,977 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.50441, -0.08685) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:55,116 INFO] src.backtester: Backtest [H1]: Sharpe=-5.228 | MaxDD=0.335 | WR=0.222 | Return=-26.2% | Trades=158
[2026-05-15 01:17:55,116 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:55,802 INFO] src.engine_xgb: XGB Train Acc: 0.7379 | Test Acc: 0.7379
[2026-05-15 01:17:55,802 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13157797), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12562722), 'atr_normalized': np.float32(0.12263902), 'prev_log_return': np.float32(0.12064954), 'usdchf_log_return': np.float32(0.123631075), 'xagusd_log_return': np.float32(0.12769748), 'xtiusd_log_return': np.float32(0.11592074), 'synth_vix_zscore': np.float32(0.13225691)}
[2026-05-15 01:17:55,803 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:17:56,269 INFO] src.engine_xgb: XGB Train Acc: 0.7435 | Test Acc: 0.7435
[2026-05-15 01:17:56,269 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10835821), 'gmm_vol_cluster': np.float32(0.11359254), 'rsi_slope': np.float32(0.11023191), 'atr_normalized': np.float32(0.11164014), 'prev_log_return': np.float32(0.11209073), 'usdchf_log_return': np.float32(0.11386467), 'xagusd_log_return': np.float32(0.111545645), 'xtiusd_log_return': np.float32(0.10896447), 'synth_vix_zscore': np.float32(0.109711654)}
[2026-05-15 01:17:56,270 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:17:56,733 INFO] src.engine_xgb: XGB Train Acc: 0.7805 | Test Acc: 0.7805
[2026-05-15 01:17:56,734 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09817039), 'gmm_vol_cluster': np.float32(0.095350154), 'rsi_slope': np.float32(0.12395408), 'atr_normalized': np.float32(0.1074439), 'prev_log_return': np.float32(0.112458766), 'usdchf_log_return': np.float32(0.11314329), 'xagusd_log_return': np.float32(0.1181778), 'xtiusd_log_return': np.float32(0.11591426), 'synth_vix_zscore': np.float32(0.115387395)}
[2026-05-15 01:17:56,734 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:17:56,737 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.49357, -0.10582) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:56,865 INFO] src.backtester: Backtest [H1]: Sharpe=-3.054 | MaxDD=0.222 | WR=0.298 | Return=-18.7% | Trades=161
[2026-05-15 01:17:56,866 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:57,311 INFO] src.engine_xgb: XGB Train Acc: 0.6749 | Test Acc: 0.6749
[2026-05-15 01:17:57,314 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13234113), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.122820616), 'atr_normalized': np.float32(0.1269867), 'prev_log_return': np.float32(0.12071176), 'usdchf_log_return': np.float32(0.12899026), 'xagusd_log_return': np.float32(0.12393086), 'xtiusd_log_return': np.float32(0.12294613), 'synth_vix_zscore': np.float32(0.12127261)}
[2026-05-15 01:17:57,315 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:17:57,781 INFO] src.engine_xgb: XGB Train Acc: 0.6990 | Test Acc: 0.6990
[2026-05-15 01:17:57,782 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10199901), 'gmm_vol_cluster': np.float32(0.09778379), 'rsi_slope': np.float32(0.12007765), 'atr_normalized': np.float32(0.112382814), 'prev_log_return': np.float32(0.114118226), 'usdchf_log_return': np.float32(0.11583308), 'xagusd_log_return': np.float32(0.111815594), 'xtiusd_log_return': np.float32(0.11182059), 'synth_vix_zscore': np.float32(0.11416928)}
[2026-05-15 01:17:57,782 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:17:58,218 INFO] src.engine_xgb: XGB Train Acc: 0.7196 | Test Acc: 0.7196
[2026-05-15 01:17:58,219 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10372306), 'gmm_vol_cluster': np.float32(0.09413397), 'rsi_slope': np.float32(0.116723426), 'atr_normalized': np.float32(0.11053211), 'prev_log_return': np.float32(0.11284429), 'usdchf_log_return': np.float32(0.11503372), 'xagusd_log_return': np.float32(0.11726605), 'xtiusd_log_return': np.float32(0.11523181), 'synth_vix_zscore': np.float32(0.11451159)}
[2026-05-15 01:17:58,219 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:17:58,221 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.36542, 0.20284) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:17:58,334 INFO] src.backtester: Backtest [H1]: Sharpe=-2.333 | MaxDD=0.105 | WR=0.344 | Return=-9.0% | Trades=93
[2026-05-15 01:17:58,334 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:17:58,350 INFO] src.optimizer: WFO [H1] window start=17280: trades=93 sharpe=-2.333 cv_sharpe=-4.141 score=-0.500
[2026-05-15 01:17:59,521 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:17:59,522 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:17:59,522 INFO] src.engine_hmm: Bull 0.9651 0.0138 0.0210 0.0000
[2026-05-15 01:17:59,522 INFO] src.engine_hmm: Bear 0.0088 0.9599 0.0189 0.0124
[2026-05-15 01:17:59,523 INFO] src.engine_hmm: Chop_Low 0.0146 0.0119 0.9708 0.0026
[2026-05-15 01:17:59,523 INFO] src.engine_hmm: Chop_High 0.0068 0.0237 0.0000 0.9695
[2026-05-15 01:17:59,523 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:17:59,523 INFO] src.engine_hmm: Bull: return=0.801185, vol=-0.216902, rsi_slope=-0.005257
[2026-05-15 01:17:59,524 INFO] src.engine_hmm: Bear: return=-0.474614, vol=0.170553, rsi_slope=-0.000056
[2026-05-15 01:17:59,524 INFO] src.engine_hmm: Chop_Low: return=-0.016910, vol=-0.701476, rsi_slope=-0.005592
[2026-05-15 01:17:59,524 INFO] src.engine_hmm: Chop_High: return=-0.426601, vol=1.796908, rsi_slope=0.023155
[2026-05-15 01:17:59,525 INFO] src.engine_hmm: Total regime transitions: 336
[2026-05-15 01:17:59,525 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 15:00:00: Chop_Low -> Bear
[2026-05-15 01:17:59,526 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-13 13:00:00: Bear -> Chop_Low
[2026-05-15 01:17:59,527 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-24 17:00:00: Chop_Low -> Bull
[2026-05-15 01:17:59,527 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-27 08:00:00: Bull -> Chop_Low
[2026-05-15 01:17:59,528 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-03 03:00:00: Chop_Low -> Bull
[2026-05-15 01:17:59,528 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-03 23:00:00: Bull -> Chop_Low
[2026-05-15 01:17:59,529 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 01:00:00: Chop_Low -> Chop_High
[2026-05-15 01:17:59,529 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 18:00:00: Chop_High -> Bear
[2026-05-15 01:17:59,529 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 23:00:00: Bear -> Chop_Low
[2026-05-15 01:17:59,529 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-07 08:00:00: Chop_Low -> Bull
[2026-05-15 01:17:59,557 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:17:59,572 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:18:00,021 INFO] src.engine_xgb: XGB Train Acc: 0.7584 | Test Acc: 0.7584
[2026-05-15 01:18:00,024 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14053126), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12383201), 'atr_normalized': np.float32(0.11795333), 'prev_log_return': np.float32(0.12280248), 'usdchf_log_return': np.float32(0.12143156), 'xagusd_log_return': np.float32(0.1287772), 'xtiusd_log_return': np.float32(0.12562713), 'synth_vix_zscore': np.float32(0.119045086)}
[2026-05-15 01:18:00,027 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:18:00,413 INFO] src.engine_xgb: XGB Train Acc: 0.7696 | Test Acc: 0.7696
[2026-05-15 01:18:00,414 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11011315), 'gmm_vol_cluster': np.float32(0.10217608), 'rsi_slope': np.float32(0.116027676), 'atr_normalized': np.float32(0.11232625), 'prev_log_return': np.float32(0.111591004), 'usdchf_log_return': np.float32(0.110892594), 'xagusd_log_return': np.float32(0.11268286), 'xtiusd_log_return': np.float32(0.11517078), 'synth_vix_zscore': np.float32(0.10901959)}
[2026-05-15 01:18:00,414 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:18:00,748 INFO] src.engine_xgb: XGB Train Acc: 0.7988 | Test Acc: 0.7988
[2026-05-15 01:18:00,748 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.114093915), 'gmm_vol_cluster': np.float32(0.10621136), 'rsi_slope': np.float32(0.11296772), 'atr_normalized': np.float32(0.11155681), 'prev_log_return': np.float32(0.106126554), 'usdchf_log_return': np.float32(0.11154646), 'xagusd_log_return': np.float32(0.11128375), 'xtiusd_log_return': np.float32(0.11286448), 'synth_vix_zscore': np.float32(0.11334902)}
[2026-05-15 01:18:00,749 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:18:00,751 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.54544, 0.24324) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:00,881 INFO] src.backtester: Backtest [H1]: Sharpe=-1.295 | MaxDD=0.128 | WR=0.306 | Return=-6.5% | Trades=157
[2026-05-15 01:18:00,882 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:01,421 INFO] src.engine_xgb: XGB Train Acc: 0.7124 | Test Acc: 0.7124
[2026-05-15 01:18:01,422 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1456019), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12186156), 'atr_normalized': np.float32(0.11684119), 'prev_log_return': np.float32(0.12326665), 'usdchf_log_return': np.float32(0.12593482), 'xagusd_log_return': np.float32(0.12667081), 'xtiusd_log_return': np.float32(0.12050139), 'synth_vix_zscore': np.float32(0.119321644)}
[2026-05-15 01:18:01,422 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:18:01,850 INFO] src.engine_xgb: XGB Train Acc: 0.7320 | Test Acc: 0.7320
[2026-05-15 01:18:01,851 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.102492765), 'gmm_vol_cluster': np.float32(0.12247955), 'rsi_slope': np.float32(0.11457683), 'atr_normalized': np.float32(0.11022106), 'prev_log_return': np.float32(0.109853014), 'usdchf_log_return': np.float32(0.11135708), 'xagusd_log_return': np.float32(0.10985605), 'xtiusd_log_return': np.float32(0.107685395), 'synth_vix_zscore': np.float32(0.11147827)}
[2026-05-15 01:18:01,851 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:18:02,388 INFO] src.engine_xgb: XGB Train Acc: 0.7527 | Test Acc: 0.7527
[2026-05-15 01:18:02,389 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11546976), 'gmm_vol_cluster': np.float32(0.10534042), 'rsi_slope': np.float32(0.11372112), 'atr_normalized': np.float32(0.110375516), 'prev_log_return': np.float32(0.107099704), 'usdchf_log_return': np.float32(0.10967599), 'xagusd_log_return': np.float32(0.10818329), 'xtiusd_log_return': np.float32(0.1120733), 'synth_vix_zscore': np.float32(0.118060954)}
[2026-05-15 01:18:02,389 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:18:02,391 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.48586, 0.08539) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:02,516 INFO] src.backtester: Backtest [H1]: Sharpe=-0.607 | MaxDD=0.059 | WR=0.309 | Return=-2.9% | Trades=136
[2026-05-15 01:18:02,517 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:03,309 INFO] src.engine_xgb: XGB Train Acc: 0.6949 | Test Acc: 0.6949
[2026-05-15 01:18:03,310 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.112079434), 'gmm_vol_cluster': np.float32(0.08504773), 'rsi_slope': np.float32(0.1178954), 'atr_normalized': np.float32(0.11459924), 'prev_log_return': np.float32(0.11790265), 'usdchf_log_return': np.float32(0.11630804), 'xagusd_log_return': np.float32(0.11330117), 'xtiusd_log_return': np.float32(0.11205365), 'synth_vix_zscore': np.float32(0.11081257)}
[2026-05-15 01:18:03,311 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:18:04,327 INFO] src.engine_xgb: XGB Train Acc: 0.7076 | Test Acc: 0.7076
[2026-05-15 01:18:04,327 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.115835994), 'gmm_vol_cluster': np.float32(0.104144156), 'rsi_slope': np.float32(0.116892956), 'atr_normalized': np.float32(0.10956098), 'prev_log_return': np.float32(0.10966695), 'usdchf_log_return': np.float32(0.10801261), 'xagusd_log_return': np.float32(0.11703076), 'xtiusd_log_return': np.float32(0.10782067), 'synth_vix_zscore': np.float32(0.11103485)}
[2026-05-15 01:18:04,328 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:18:04,822 INFO] src.engine_xgb: XGB Train Acc: 0.7015 | Test Acc: 0.7015
[2026-05-15 01:18:04,823 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11959403), 'gmm_vol_cluster': np.float32(0.10712122), 'rsi_slope': np.float32(0.11305835), 'atr_normalized': np.float32(0.11262354), 'prev_log_return': np.float32(0.10871313), 'usdchf_log_return': np.float32(0.10594008), 'xagusd_log_return': np.float32(0.11625891), 'xtiusd_log_return': np.float32(0.11033328), 'synth_vix_zscore': np.float32(0.10635746)}
[2026-05-15 01:18:04,823 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:18:04,826 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.51495, -0.03378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:04,930 INFO] src.backtester: Backtest [H1]: Sharpe=-4.654 | MaxDD=0.161 | WR=0.259 | Return=-14.5% | Trades=108
[2026-05-15 01:18:04,930 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:04,944 INFO] src.optimizer: WFO [H1] window start=21600: trades=108 sharpe=-4.654 cv_sharpe=-0.951 score=-1.000
[2026-05-15 01:18:06,486 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:18:06,486 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:18:06,486 INFO] src.engine_hmm: Bull 0.9535 0.0072 0.0296 0.0097
[2026-05-15 01:18:06,486 INFO] src.engine_hmm: Bear 0.0000 0.9310 0.0000 0.0690
[2026-05-15 01:18:06,488 INFO] src.engine_hmm: Chop_Low 0.0163 0.0129 0.9680 0.0028
[2026-05-15 01:18:06,488 INFO] src.engine_hmm: Chop_High 0.0243 0.0068 0.0187 0.9502
[2026-05-15 01:18:06,488 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:18:06,488 INFO] src.engine_hmm: Bull: return=0.642907, vol=-0.149050, rsi_slope=0.008782
[2026-05-15 01:18:06,489 INFO] src.engine_hmm: Bear: return=-0.799635, vol=1.770955, rsi_slope=-0.042499
[2026-05-15 01:18:06,489 INFO] src.engine_hmm: Chop_Low: return=0.041340, vol=-0.726563, rsi_slope=-0.011444
[2026-05-15 01:18:06,489 INFO] src.engine_hmm: Chop_High: return=-0.353013, vol=0.412281, rsi_slope=0.030048
[2026-05-15 01:18:06,489 INFO] src.engine_hmm: Total regime transitions: 447
[2026-05-15 01:18:06,489 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-07 16:00:00: Chop_High -> Chop_Low
[2026-05-15 01:18:06,490 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-08 13:00:00: Chop_Low -> Chop_High
[2026-05-15 01:18:06,490 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 12:00:00: Chop_High -> Bull
[2026-05-15 01:18:06,490 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 21:00:00: Bull -> Chop_High
[2026-05-15 01:18:06,490 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-11 15:00:00: Chop_High -> Bull
[2026-05-15 01:18:06,490 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-15 17:00:00: Bull -> Chop_High
[2026-05-15 01:18:06,491 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-16 10:00:00: Chop_High -> Bull
[2026-05-15 01:18:06,491 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-16 13:00:00: Bull -> Chop_Low
[2026-05-15 01:18:06,491 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-17 04:00:00: Chop_Low -> Bear
[2026-05-15 01:18:06,492 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-17 05:00:00: Bear -> Chop_High
[2026-05-15 01:18:06,522 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:18:06,534 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:18:06,839 INFO] src.engine_xgb: XGB Train Acc: 0.8128 | Test Acc: 0.8128
[2026-05-15 01:18:06,839 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13179317), 'gmm_vol_cluster': np.float32(0.086577214), 'rsi_slope': np.float32(0.1078253), 'atr_normalized': np.float32(0.11322728), 'prev_log_return': np.float32(0.12223423), 'usdchf_log_return': np.float32(0.106238045), 'xagusd_log_return': np.float32(0.11207468), 'xtiusd_log_return': np.float32(0.108525254), 'synth_vix_zscore': np.float32(0.11150476)}
[2026-05-15 01:18:06,840 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:18:07,149 INFO] src.engine_xgb: XGB Train Acc: 0.8021 | Test Acc: 0.8021
[2026-05-15 01:18:07,150 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10830076), 'gmm_vol_cluster': np.float32(0.08858557), 'rsi_slope': np.float32(0.11942431), 'atr_normalized': np.float32(0.11705996), 'prev_log_return': np.float32(0.10651957), 'usdchf_log_return': np.float32(0.11403458), 'xagusd_log_return': np.float32(0.11899457), 'xtiusd_log_return': np.float32(0.111934766), 'synth_vix_zscore': np.float32(0.11514585)}
[2026-05-15 01:18:07,150 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:18:07,625 INFO] src.engine_xgb: XGB Train Acc: 0.7825 | Test Acc: 0.7825
[2026-05-15 01:18:07,625 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11160026), 'gmm_vol_cluster': np.float32(0.09807474), 'rsi_slope': np.float32(0.11411382), 'atr_normalized': np.float32(0.114989564), 'prev_log_return': np.float32(0.10796128), 'usdchf_log_return': np.float32(0.10691988), 'xagusd_log_return': np.float32(0.11500679), 'xtiusd_log_return': np.float32(0.108934), 'synth_vix_zscore': np.float32(0.12239965)}
[2026-05-15 01:18:07,626 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:18:07,630 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.16146, 0.63340) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:07,782 INFO] src.backtester: Backtest [H1]: Sharpe=-1.040 | MaxDD=0.101 | WR=0.366 | Return=-5.4% | Trades=183
[2026-05-15 01:18:07,782 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:08,270 INFO] src.engine_xgb: XGB Train Acc: 0.7744 | Test Acc: 0.7744
[2026-05-15 01:18:08,270 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11837172), 'gmm_vol_cluster': np.float32(0.061349854), 'rsi_slope': np.float32(0.122051515), 'atr_normalized': np.float32(0.11686047), 'prev_log_return': np.float32(0.119289085), 'usdchf_log_return': np.float32(0.10848793), 'xagusd_log_return': np.float32(0.11870066), 'xtiusd_log_return': np.float32(0.11685551), 'synth_vix_zscore': np.float32(0.11803326)}
[2026-05-15 01:18:08,272 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:18:08,654 INFO] src.engine_xgb: XGB Train Acc: 0.7419 | Test Acc: 0.7419
[2026-05-15 01:18:08,655 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1083208), 'gmm_vol_cluster': np.float32(0.122303836), 'rsi_slope': np.float32(0.11564834), 'atr_normalized': np.float32(0.114969894), 'prev_log_return': np.float32(0.10830618), 'usdchf_log_return': np.float32(0.10589718), 'xagusd_log_return': np.float32(0.10492759), 'xtiusd_log_return': np.float32(0.10973763), 'synth_vix_zscore': np.float32(0.109888524)}
[2026-05-15 01:18:08,655 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:18:09,066 INFO] src.engine_xgb: XGB Train Acc: 0.7324 | Test Acc: 0.7324
[2026-05-15 01:18:09,067 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10776434), 'gmm_vol_cluster': np.float32(0.08822846), 'rsi_slope': np.float32(0.11117014), 'atr_normalized': np.float32(0.11652274), 'prev_log_return': np.float32(0.109325804), 'usdchf_log_return': np.float32(0.1179815), 'xagusd_log_return': np.float32(0.11423755), 'xtiusd_log_return': np.float32(0.11353487), 'synth_vix_zscore': np.float32(0.1212346)}
[2026-05-15 01:18:09,067 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:18:09,069 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47142, 0.22575) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:09,196 INFO] src.backtester: Backtest [H1]: Sharpe=-4.693 | MaxDD=0.224 | WR=0.223 | Return=-18.3% | Trades=175
[2026-05-15 01:18:09,197 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:09,630 INFO] src.engine_xgb: XGB Train Acc: 0.7299 | Test Acc: 0.7299
[2026-05-15 01:18:09,631 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10652774), 'gmm_vol_cluster': np.float32(0.10010261), 'rsi_slope': np.float32(0.117072806), 'atr_normalized': np.float32(0.11522988), 'prev_log_return': np.float32(0.11032538), 'usdchf_log_return': np.float32(0.108968936), 'xagusd_log_return': np.float32(0.11288684), 'xtiusd_log_return': np.float32(0.11289184), 'synth_vix_zscore': np.float32(0.115993984)}
[2026-05-15 01:18:09,631 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:18:10,079 INFO] src.engine_xgb: XGB Train Acc: 0.7104 | Test Acc: 0.7104
[2026-05-15 01:18:10,080 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11329481), 'gmm_vol_cluster': np.float32(0.11833187), 'rsi_slope': np.float32(0.1134605), 'atr_normalized': np.float32(0.10894257), 'prev_log_return': np.float32(0.11314109), 'usdchf_log_return': np.float32(0.10922776), 'xagusd_log_return': np.float32(0.10695303), 'xtiusd_log_return': np.float32(0.10968719), 'synth_vix_zscore': np.float32(0.10696113)}
[2026-05-15 01:18:10,080 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:18:10,760 INFO] src.engine_xgb: XGB Train Acc: 0.7142 | Test Acc: 0.7142
[2026-05-15 01:18:10,760 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10672792), 'gmm_vol_cluster': np.float32(0.106577985), 'rsi_slope': np.float32(0.11454373), 'atr_normalized': np.float32(0.11528819), 'prev_log_return': np.float32(0.10808384), 'usdchf_log_return': np.float32(0.11046889), 'xagusd_log_return': np.float32(0.11483345), 'xtiusd_log_return': np.float32(0.106396705), 'synth_vix_zscore': np.float32(0.11707931)}
[2026-05-15 01:18:10,761 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:18:10,762 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.62208, 0.06248) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:10,863 INFO] src.backtester: Backtest [H1]: Sharpe=-3.161 | MaxDD=0.185 | WR=0.255 | Return=-12.2% | Trades=106
[2026-05-15 01:18:10,863 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:10,878 INFO] src.optimizer: WFO [H1] window start=25920: trades=106 sharpe=-3.161 cv_sharpe=-2.866 score=-0.500
[2026-05-15 01:18:12,801 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:18:12,801 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:18:12,801 INFO] src.engine_hmm: Bull 0.9616 0.0023 0.0256 0.0105
[2026-05-15 01:18:12,802 INFO] src.engine_hmm: Bear 0.0099 0.9559 0.0283 0.0059
[2026-05-15 01:18:12,802 INFO] src.engine_hmm: Chop_Low 0.0301 0.0110 0.9519 0.0069
[2026-05-15 01:18:12,802 INFO] src.engine_hmm: Chop_High 0.0051 0.0587 0.0008 0.9354
[2026-05-15 01:18:12,803 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:18:12,803 INFO] src.engine_hmm: Bull: return=0.594293, vol=-0.584880, rsi_slope=-0.010639
[2026-05-15 01:18:12,803 INFO] src.engine_hmm: Bear: return=-0.424394, vol=0.446772, rsi_slope=0.014568
[2026-05-15 01:18:12,804 INFO] src.engine_hmm: Chop_Low: return=-0.292786, vol=-0.377531, rsi_slope=0.007832
[2026-05-15 01:18:12,804 INFO] src.engine_hmm: Chop_High: return=0.016865, vol=1.867523, rsi_slope=-0.023326
[2026-05-15 01:18:12,804 INFO] src.engine_hmm: Total regime transitions: 445
[2026-05-15 01:18:12,804 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-02 15:00:00: Chop_Low -> Bull
[2026-05-15 01:18:12,806 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 09:00:00: Bull -> Chop_Low
[2026-05-15 01:18:12,806 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 15:00:00: Chop_Low -> Bear
[2026-05-15 01:18:12,806 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-04 04:00:00: Bear -> Chop_High
[2026-05-15 01:18:12,806 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-04 12:00:00: Chop_High -> Bear
[2026-05-15 01:18:12,807 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 12:00:00: Bear -> Bull
[2026-05-15 01:18:12,807 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-08 16:00:00: Bull -> Chop_Low
[2026-05-15 01:18:12,807 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-09 14:00:00: Chop_Low -> Bull
[2026-05-15 01:18:12,807 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 10:00:00: Bull -> Chop_Low
[2026-05-15 01:18:12,808 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 15:00:00: Chop_Low -> Chop_High
[2026-05-15 01:18:12,834 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:18:12,844 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:18:13,229 INFO] src.engine_xgb: XGB Train Acc: 0.8222 | Test Acc: 0.8222
[2026-05-15 01:18:13,230 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12304998), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13376771), 'atr_normalized': np.float32(0.12506492), 'prev_log_return': np.float32(0.124213755), 'usdchf_log_return': np.float32(0.124284424), 'xagusd_log_return': np.float32(0.12600702), 'xtiusd_log_return': np.float32(0.123911545), 'synth_vix_zscore': np.float32(0.119700536)}
[2026-05-15 01:18:13,231 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:18:13,594 INFO] src.engine_xgb: XGB Train Acc: 0.8147 | Test Acc: 0.8147
[2026-05-15 01:18:13,594 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11797481), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1258967), 'atr_normalized': np.float32(0.11919213), 'prev_log_return': np.float32(0.12459912), 'usdchf_log_return': np.float32(0.12547566), 'xagusd_log_return': np.float32(0.12370062), 'xtiusd_log_return': np.float32(0.12900428), 'synth_vix_zscore': np.float32(0.13415664)}
[2026-05-15 01:18:13,595 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:18:13,950 INFO] src.engine_xgb: XGB Train Acc: 0.7774 | Test Acc: 0.7774
[2026-05-15 01:18:13,950 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.123523064), 'gmm_vol_cluster': np.float32(0.0940644), 'rsi_slope': np.float32(0.11225184), 'atr_normalized': np.float32(0.11338965), 'prev_log_return': np.float32(0.10664182), 'usdchf_log_return': np.float32(0.11711947), 'xagusd_log_return': np.float32(0.11368118), 'xtiusd_log_return': np.float32(0.110224), 'synth_vix_zscore': np.float32(0.1091045)}
[2026-05-15 01:18:13,951 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:18:13,952 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.56732, -0.02191) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:14,073 INFO] src.backtester: Backtest [H1]: Sharpe=-0.815 | MaxDD=0.095 | WR=0.350 | Return=-4.1% | Trades=177
[2026-05-15 01:18:14,395 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:14,805 INFO] src.engine_xgb: XGB Train Acc: 0.7759 | Test Acc: 0.7759
[2026-05-15 01:18:14,805 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10510966), 'gmm_vol_cluster': np.float32(0.11356286), 'rsi_slope': np.float32(0.114870116), 'atr_normalized': np.float32(0.10814899), 'prev_log_return': np.float32(0.11215054), 'usdchf_log_return': np.float32(0.10936279), 'xagusd_log_return': np.float32(0.109441124), 'xtiusd_log_return': np.float32(0.107930094), 'synth_vix_zscore': np.float32(0.11942374)}
[2026-05-15 01:18:14,806 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:18:15,221 INFO] src.engine_xgb: XGB Train Acc: 0.7440 | Test Acc: 0.7440
[2026-05-15 01:18:15,221 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10792548), 'gmm_vol_cluster': np.float32(0.084729366), 'rsi_slope': np.float32(0.11746405), 'atr_normalized': np.float32(0.11392207), 'prev_log_return': np.float32(0.115950555), 'usdchf_log_return': np.float32(0.11512708), 'xagusd_log_return': np.float32(0.11501411), 'xtiusd_log_return': np.float32(0.11168342), 'synth_vix_zscore': np.float32(0.11818384)}
[2026-05-15 01:18:15,222 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:18:15,629 INFO] src.engine_xgb: XGB Train Acc: 0.7709 | Test Acc: 0.7709
[2026-05-15 01:18:15,629 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11043499), 'gmm_vol_cluster': np.float32(0.10826763), 'rsi_slope': np.float32(0.113344066), 'atr_normalized': np.float32(0.111863256), 'prev_log_return': np.float32(0.11401058), 'usdchf_log_return': np.float32(0.1105888), 'xagusd_log_return': np.float32(0.1117606), 'xtiusd_log_return': np.float32(0.10833925), 'synth_vix_zscore': np.float32(0.11139092)}
[2026-05-15 01:18:15,629 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:18:15,631 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47816, 0.15210) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:15,759 INFO] src.backtester: Backtest [H1]: Sharpe=-1.959 | MaxDD=0.180 | WR=0.298 | Return=-9.6% | Trades=168
[2026-05-15 01:18:15,760 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:16,235 INFO] src.engine_xgb: XGB Train Acc: 0.7364 | Test Acc: 0.7364
[2026-05-15 01:18:16,236 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10783265), 'gmm_vol_cluster': np.float32(0.11326349), 'rsi_slope': np.float32(0.11427758), 'atr_normalized': np.float32(0.11241373), 'prev_log_return': np.float32(0.10454397), 'usdchf_log_return': np.float32(0.10669426), 'xagusd_log_return': np.float32(0.11487903), 'xtiusd_log_return': np.float32(0.11109108), 'synth_vix_zscore': np.float32(0.11500415)}
[2026-05-15 01:18:16,236 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:18:16,657 INFO] src.engine_xgb: XGB Train Acc: 0.7422 | Test Acc: 0.7422
[2026-05-15 01:18:16,657 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10142454), 'gmm_vol_cluster': np.float32(0.12023548), 'rsi_slope': np.float32(0.11526955), 'atr_normalized': np.float32(0.1105532), 'prev_log_return': np.float32(0.111373566), 'usdchf_log_return': np.float32(0.11056649), 'xagusd_log_return': np.float32(0.11717706), 'xtiusd_log_return': np.float32(0.107593514), 'synth_vix_zscore': np.float32(0.10580662)}
[2026-05-15 01:18:16,658 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:18:17,081 INFO] src.engine_xgb: XGB Train Acc: 0.7307 | Test Acc: 0.7307
[2026-05-15 01:18:17,081 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10223394), 'gmm_vol_cluster': np.float32(0.112369664), 'rsi_slope': np.float32(0.1134406), 'atr_normalized': np.float32(0.11046121), 'prev_log_return': np.float32(0.11632129), 'usdchf_log_return': np.float32(0.11084631), 'xagusd_log_return': np.float32(0.1136413), 'xtiusd_log_return': np.float32(0.11024679), 'synth_vix_zscore': np.float32(0.11043891)}
[2026-05-15 01:18:17,082 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:18:17,083 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.40708, 0.22442) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:17,189 INFO] src.backtester: Backtest [H1]: Sharpe=-1.334 | MaxDD=0.103 | WR=0.342 | Return=-4.6% | Trades=120
[2026-05-15 01:18:17,190 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:17,204 INFO] src.optimizer: WFO [H1] window start=30240: trades=120 sharpe=-1.334 cv_sharpe=-1.387 score=-0.500
[2026-05-15 01:18:18,316 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:18:18,324 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:18:18,325 INFO] src.engine_hmm: Bull 0.9582 0.0177 0.0000 0.0241
[2026-05-15 01:18:18,325 INFO] src.engine_hmm: Bear 0.0065 0.9615 0.0291 0.0029
[2026-05-15 01:18:18,326 INFO] src.engine_hmm: Chop_Low 0.0057 0.0136 0.9536 0.0271
[2026-05-15 01:18:18,326 INFO] src.engine_hmm: Chop_High 0.0122 0.0040 0.0302 0.9537
[2026-05-15 01:18:18,326 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:18:18,326 INFO] src.engine_hmm: Bull: return=1.187607, vol=1.326682, rsi_slope=0.004842
[2026-05-15 01:18:18,326 INFO] src.engine_hmm: Bear: return=-1.054904, vol=0.518094, rsi_slope=0.008846
[2026-05-15 01:18:18,328 INFO] src.engine_hmm: Chop_Low: return=-0.348081, vol=-0.649573, rsi_slope=0.006032
[2026-05-15 01:18:18,328 INFO] src.engine_hmm: Chop_High: return=0.526555, vol=-0.412875, rsi_slope=-0.016293
[2026-05-15 01:18:18,329 INFO] src.engine_hmm: Total regime transitions: 425
[2026-05-15 01:18:18,329 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-23 16:00:00: Chop_Low -> Chop_High
[2026-05-15 01:18:18,330 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-24 04:00:00: Chop_High -> Bull
[2026-05-15 01:18:18,330 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-25 18:00:00: Bull -> Bear
[2026-05-15 01:18:18,330 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-28 01:00:00: Bear -> Bull
[2026-05-15 01:18:18,331 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-02 12:00:00: Bull -> Bear
[2026-05-15 01:18:18,331 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-03 09:00:00: Bear -> Chop_High
[2026-05-15 01:18:18,331 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-04 02:00:00: Chop_High -> Bull
[2026-05-15 01:18:18,331 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-10 23:00:00: Bull -> Bear
[2026-05-15 01:18:18,332 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-16 21:00:00: Bear -> Bull
[2026-05-15 01:18:18,332 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-17 18:00:00: Bull -> Chop_High
[2026-05-15 01:18:18,361 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:18:18,381 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:18:18,721 INFO] src.engine_xgb: XGB Train Acc: 0.7751 | Test Acc: 0.7751
[2026-05-15 01:18:18,722 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11979276), 'gmm_vol_cluster': np.float32(0.12028566), 'rsi_slope': np.float32(0.10589999), 'atr_normalized': np.float32(0.10789742), 'prev_log_return': np.float32(0.10665593), 'usdchf_log_return': np.float32(0.115108155), 'xagusd_log_return': np.float32(0.11080343), 'xtiusd_log_return': np.float32(0.10310612), 'synth_vix_zscore': np.float32(0.110450536)}
[2026-05-15 01:18:18,723 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:18:18,952 INFO] src.engine_xgb: XGB Train Acc: 0.8325 | Test Acc: 0.8325
[2026-05-15 01:18:18,952 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09753458), 'gmm_vol_cluster': np.float32(0.10843866), 'rsi_slope': np.float32(0.113719895), 'atr_normalized': np.float32(0.109255455), 'prev_log_return': np.float32(0.116704136), 'usdchf_log_return': np.float32(0.116570026), 'xagusd_log_return': np.float32(0.11770854), 'xtiusd_log_return': np.float32(0.106989585), 'synth_vix_zscore': np.float32(0.1130791)}
[2026-05-15 01:18:18,953 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:18:19,238 INFO] src.engine_xgb: XGB Train Acc: 0.8100 | Test Acc: 0.8100
[2026-05-15 01:18:19,239 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.112147644), 'gmm_vol_cluster': np.float32(0.102361016), 'rsi_slope': np.float32(0.11426835), 'atr_normalized': np.float32(0.11417974), 'prev_log_return': np.float32(0.108104244), 'usdchf_log_return': np.float32(0.11197104), 'xagusd_log_return': np.float32(0.11876787), 'xtiusd_log_return': np.float32(0.10899426), 'synth_vix_zscore': np.float32(0.10920578)}
[2026-05-15 01:18:19,239 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:18:19,241 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.42962, 0.34995) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:19,353 INFO] src.backtester: Backtest [H1]: Sharpe=-2.209 | MaxDD=0.148 | WR=0.328 | Return=-10.4% | Trades=186
[2026-05-15 01:18:19,354 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:19,631 INFO] src.engine_xgb: XGB Train Acc: 0.7493 | Test Acc: 0.7493
[2026-05-15 01:18:20,366 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.119812384), 'gmm_vol_cluster': np.float32(0.049064633), 'rsi_slope': np.float32(0.118030585), 'atr_normalized': np.float32(0.12086181), 'prev_log_return': np.float32(0.11571338), 'usdchf_log_return': np.float32(0.12052982), 'xagusd_log_return': np.float32(0.113868885), 'xtiusd_log_return': np.float32(0.11693891), 'synth_vix_zscore': np.float32(0.12517953)}
[2026-05-15 01:18:20,367 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:18:20,826 INFO] src.engine_xgb: XGB Train Acc: 0.8024 | Test Acc: 0.8024
[2026-05-15 01:18:20,830 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.110170096), 'gmm_vol_cluster': np.float32(0.11416036), 'rsi_slope': np.float32(0.11560456), 'atr_normalized': np.float32(0.10943908), 'prev_log_return': np.float32(0.10745396), 'usdchf_log_return': np.float32(0.11247267), 'xagusd_log_return': np.float32(0.1123812), 'xtiusd_log_return': np.float32(0.10950496), 'synth_vix_zscore': np.float32(0.10881313)}
[2026-05-15 01:18:20,831 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:18:21,343 INFO] src.engine_xgb: XGB Train Acc: 0.7668 | Test Acc: 0.7668
[2026-05-15 01:18:21,346 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11058349), 'gmm_vol_cluster': np.float32(0.09531449), 'rsi_slope': np.float32(0.11166042), 'atr_normalized': np.float32(0.11263695), 'prev_log_return': np.float32(0.117875196), 'usdchf_log_return': np.float32(0.11304061), 'xagusd_log_return': np.float32(0.11154905), 'xtiusd_log_return': np.float32(0.11508413), 'synth_vix_zscore': np.float32(0.112255625)}
[2026-05-15 01:18:21,353 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:18:21,356 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47849, 0.22854) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:21,503 INFO] src.backtester: Backtest [H1]: Sharpe=-3.736 | MaxDD=0.199 | WR=0.241 | Return=-14.6% | Trades=170
[2026-05-15 01:18:21,504 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:21,959 INFO] src.engine_xgb: XGB Train Acc: 0.7240 | Test Acc: 0.7240
[2026-05-15 01:18:21,959 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11640828), 'gmm_vol_cluster': np.float32(0.11139749), 'rsi_slope': np.float32(0.10436164), 'atr_normalized': np.float32(0.10655228), 'prev_log_return': np.float32(0.11339479), 'usdchf_log_return': np.float32(0.11293622), 'xagusd_log_return': np.float32(0.11082047), 'xtiusd_log_return': np.float32(0.109600976), 'synth_vix_zscore': np.float32(0.11452773)}
[2026-05-15 01:18:21,960 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:18:22,493 INFO] src.engine_xgb: XGB Train Acc: 0.7571 | Test Acc: 0.7571
[2026-05-15 01:18:22,494 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10737057), 'gmm_vol_cluster': np.float32(0.09849954), 'rsi_slope': np.float32(0.11441791), 'atr_normalized': np.float32(0.11762072), 'prev_log_return': np.float32(0.11455577), 'usdchf_log_return': np.float32(0.11196829), 'xagusd_log_return': np.float32(0.1164987), 'xtiusd_log_return': np.float32(0.10901534), 'synth_vix_zscore': np.float32(0.11005318)}
[2026-05-15 01:18:22,494 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:18:22,988 INFO] src.engine_xgb: XGB Train Acc: 0.7277 | Test Acc: 0.7277
[2026-05-15 01:18:22,989 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10656585), 'gmm_vol_cluster': np.float32(0.100407325), 'rsi_slope': np.float32(0.11281615), 'atr_normalized': np.float32(0.11176395), 'prev_log_return': np.float32(0.11615582), 'usdchf_log_return': np.float32(0.11293573), 'xagusd_log_return': np.float32(0.111865126), 'xtiusd_log_return': np.float32(0.11127695), 'synth_vix_zscore': np.float32(0.11621316)}
[2026-05-15 01:18:22,989 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:18:22,991 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.64128, 0.06038) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:23,098 INFO] src.backtester: Backtest [H1]: Sharpe=-3.584 | MaxDD=0.108 | WR=0.250 | Return=-9.5% | Trades=104
[2026-05-15 01:18:23,098 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:23,111 INFO] src.optimizer: WFO [H1] window start=34560: trades=104 sharpe=-3.584 cv_sharpe=-2.972 score=-0.500
[2026-05-15 01:18:25,137 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:18:25,138 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:18:25,138 INFO] src.engine_hmm: Bull 0.9606 0.0125 0.0015 0.0254
[2026-05-15 01:18:25,138 INFO] src.engine_hmm: Bear 0.0057 0.9583 0.0041 0.0319
[2026-05-15 01:18:25,139 INFO] src.engine_hmm: Chop_Low 0.0092 0.0030 0.9686 0.0192
[2026-05-15 01:18:25,139 INFO] src.engine_hmm: Chop_High 0.0090 0.0073 0.0295 0.9541
[2026-05-15 01:18:25,139 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:18:25,140 INFO] src.engine_hmm: Bull: return=1.205770, vol=1.105392, rsi_slope=-0.016930
[2026-05-15 01:18:25,140 INFO] src.engine_hmm: Bear: return=-1.378823, vol=0.902005, rsi_slope=0.019698
[2026-05-15 01:18:25,140 INFO] src.engine_hmm: Chop_Low: return=-0.122837, vol=-0.855789, rsi_slope=-0.004589
[2026-05-15 01:18:25,141 INFO] src.engine_hmm: Chop_High: return=0.051344, vol=-0.075498, rsi_slope=0.005568
[2026-05-15 01:18:25,141 INFO] src.engine_hmm: Total regime transitions: 381
[2026-05-15 01:18:25,141 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-16 06:00:00: Bull -> Chop_High
[2026-05-15 01:18:25,142 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-18 12:00:00: Chop_High -> Chop_Low
[2026-05-15 01:18:25,144 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-18 17:00:00: Chop_Low -> Bear
[2026-05-15 01:18:25,144 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-21 22:00:00: Bear -> Chop_High
[2026-05-15 01:18:25,145 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-22 15:00:00: Chop_High -> Chop_Low
[2026-05-15 01:18:25,145 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-23 09:00:00: Chop_Low -> Chop_High
[2026-05-15 01:18:25,146 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-24 18:00:00: Chop_High -> Chop_Low
[2026-05-15 01:18:25,146 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-28 01:00:00: Chop_Low -> Chop_High
[2026-05-15 01:18:25,146 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 03:00:00: Chop_High -> Chop_Low
[2026-05-15 01:18:25,147 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 13:00:00: Chop_Low -> Chop_High
[2026-05-15 01:18:25,177 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:18:25,197 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:18:25,521 INFO] src.engine_xgb: XGB Train Acc: 0.8044 | Test Acc: 0.8044
[2026-05-15 01:18:25,521 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09776129), 'gmm_vol_cluster': np.float32(0.17928757), 'rsi_slope': np.float32(0.1040947), 'atr_normalized': np.float32(0.102174744), 'prev_log_return': np.float32(0.10033405), 'usdchf_log_return': np.float32(0.103153266), 'xagusd_log_return': np.float32(0.10389254), 'xtiusd_log_return': np.float32(0.10190927), 'synth_vix_zscore': np.float32(0.1073925)}
[2026-05-15 01:18:25,522 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:18:25,854 INFO] src.engine_xgb: XGB Train Acc: 0.8230 | Test Acc: 0.8230
[2026-05-15 01:18:25,855 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.121874794), 'gmm_vol_cluster': np.float32(0.1040616), 'rsi_slope': np.float32(0.116576985), 'atr_normalized': np.float32(0.112067565), 'prev_log_return': np.float32(0.11202242), 'usdchf_log_return': np.float32(0.109765925), 'xagusd_log_return': np.float32(0.107659355), 'xtiusd_log_return': np.float32(0.112025164), 'synth_vix_zscore': np.float32(0.10394622)}
[2026-05-15 01:18:25,855 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:18:26,179 INFO] src.engine_xgb: XGB Train Acc: 0.7927 | Test Acc: 0.7927
[2026-05-15 01:18:26,179 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10276926), 'gmm_vol_cluster': np.float32(0.10144436), 'rsi_slope': np.float32(0.12250817), 'atr_normalized': np.float32(0.111701414), 'prev_log_return': np.float32(0.11402211), 'usdchf_log_return': np.float32(0.11215744), 'xagusd_log_return': np.float32(0.11193952), 'xtiusd_log_return': np.float32(0.1089661), 'synth_vix_zscore': np.float32(0.114491634)}
[2026-05-15 01:18:26,180 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:18:26,181 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.13686, 0.71017) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:26,303 INFO] src.backtester: Backtest [H1]: Sharpe=-3.170 | MaxDD=0.127 | WR=0.285 | Return=-9.6% | Trades=130
[2026-05-15 01:18:26,303 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:26,782 INFO] src.engine_xgb: XGB Train Acc: 0.7603 | Test Acc: 0.7603
[2026-05-15 01:18:26,782 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.113192916), 'gmm_vol_cluster': np.float32(0.109782994), 'rsi_slope': np.float32(0.11664671), 'atr_normalized': np.float32(0.109950796), 'prev_log_return': np.float32(0.11021923), 'usdchf_log_return': np.float32(0.11066731), 'xagusd_log_return': np.float32(0.11071125), 'xtiusd_log_return': np.float32(0.11156934), 'synth_vix_zscore': np.float32(0.10725941)}
[2026-05-15 01:18:26,783 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:18:27,163 INFO] src.engine_xgb: XGB Train Acc: 0.7497 | Test Acc: 0.7497
[2026-05-15 01:18:27,164 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11088266), 'gmm_vol_cluster': np.float32(0.1192368), 'rsi_slope': np.float32(0.11409172), 'atr_normalized': np.float32(0.10838984), 'prev_log_return': np.float32(0.11026764), 'usdchf_log_return': np.float32(0.11057731), 'xagusd_log_return': np.float32(0.10780106), 'xtiusd_log_return': np.float32(0.10894084), 'synth_vix_zscore': np.float32(0.10981208)}
[2026-05-15 01:18:27,165 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:18:27,585 INFO] src.engine_xgb: XGB Train Acc: 0.7688 | Test Acc: 0.7688
[2026-05-15 01:18:27,585 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10943956), 'gmm_vol_cluster': np.float32(0.10834267), 'rsi_slope': np.float32(0.11327673), 'atr_normalized': np.float32(0.11144101), 'prev_log_return': np.float32(0.111753434), 'usdchf_log_return': np.float32(0.11026233), 'xagusd_log_return': np.float32(0.10903452), 'xtiusd_log_return': np.float32(0.11464088), 'synth_vix_zscore': np.float32(0.11180881)}
[2026-05-15 01:18:27,586 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:18:27,587 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.51565, 0.29314) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:27,720 INFO] src.backtester: Backtest [H1]: Sharpe=-0.958 | MaxDD=0.086 | WR=0.324 | Return=-4.7% | Trades=170
[2026-05-15 01:18:27,720 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:28,192 INFO] src.engine_xgb: XGB Train Acc: 0.7143 | Test Acc: 0.7143
[2026-05-15 01:18:28,195 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.109516434), 'gmm_vol_cluster': np.float32(0.09651971), 'rsi_slope': np.float32(0.11370086), 'atr_normalized': np.float32(0.11501181), 'prev_log_return': np.float32(0.11068481), 'usdchf_log_return': np.float32(0.113812), 'xagusd_log_return': np.float32(0.111963205), 'xtiusd_log_return': np.float32(0.113627285), 'synth_vix_zscore': np.float32(0.115163915)}
[2026-05-15 01:18:28,196 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:18:28,673 INFO] src.engine_xgb: XGB Train Acc: 0.7135 | Test Acc: 0.7135
[2026-05-15 01:18:28,674 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09884243), 'gmm_vol_cluster': np.float32(0.12088485), 'rsi_slope': np.float32(0.11384003), 'atr_normalized': np.float32(0.10477077), 'prev_log_return': np.float32(0.11221648), 'usdchf_log_return': np.float32(0.11347406), 'xagusd_log_return': np.float32(0.11333228), 'xtiusd_log_return': np.float32(0.112286426), 'synth_vix_zscore': np.float32(0.11035261)}
[2026-05-15 01:18:28,674 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:18:29,163 INFO] src.engine_xgb: XGB Train Acc: 0.7129 | Test Acc: 0.7129
[2026-05-15 01:18:29,164 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10128477), 'gmm_vol_cluster': np.float32(0.11645325), 'rsi_slope': np.float32(0.11426754), 'atr_normalized': np.float32(0.113992535), 'prev_log_return': np.float32(0.11187481), 'usdchf_log_return': np.float32(0.107811645), 'xagusd_log_return': np.float32(0.10848856), 'xtiusd_log_return': np.float32(0.11115573), 'synth_vix_zscore': np.float32(0.11467121)}
[2026-05-15 01:18:29,164 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:18:29,166 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.46960, 0.34543) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:29,274 INFO] src.backtester: Backtest [H1]: Sharpe=-2.199 | MaxDD=0.112 | WR=0.297 | Return=-7.1% | Trades=111
[2026-05-15 01:18:29,275 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:29,289 INFO] src.optimizer: WFO [H1] window start=38880: trades=111 sharpe=-2.199 cv_sharpe=-2.064 score=-0.500
[2026-05-15 01:18:34,202 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:18:34,202 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:18:34,203 INFO] src.engine_hmm: Bull 0.9497 0.0078 0.0039 0.0386
[2026-05-15 01:18:34,203 INFO] src.engine_hmm: Bear 0.0270 0.9663 0.0019 0.0047
[2026-05-15 01:18:34,203 INFO] src.engine_hmm: Chop_Low 0.0022 0.0048 0.9593 0.0336
[2026-05-15 01:18:34,203 INFO] src.engine_hmm: Chop_High 0.0231 0.0040 0.0256 0.9473
[2026-05-15 01:18:34,204 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:18:34,204 INFO] src.engine_hmm: Bull: return=0.228326, vol=0.378132, rsi_slope=0.017181
[2026-05-15 01:18:34,204 INFO] src.engine_hmm: Bear: return=-0.354169, vol=1.796617, rsi_slope=-0.043359
[2026-05-15 01:18:34,205 INFO] src.engine_hmm: Chop_Low: return=-0.206035, vol=-0.921806, rsi_slope=-0.010416
[2026-05-15 01:18:34,205 INFO] src.engine_hmm: Chop_High: return=0.125273, vol=-0.290081, rsi_slope=0.012183
[2026-05-15 01:18:34,205 INFO] src.engine_hmm: Total regime transitions: 468
[2026-05-15 01:18:34,205 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-10 17:00:00: Chop_Low -> Chop_High
[2026-05-15 01:18:34,206 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-11 14:00:00: Chop_High -> Chop_Low
[2026-05-15 01:18:34,206 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-21 05:00:00: Chop_Low -> Chop_High
[2026-05-15 01:18:34,206 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-21 16:00:00: Chop_High -> Bull
[2026-05-15 01:18:34,206 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-22 02:00:00: Bull -> Chop_High
[2026-05-15 01:18:34,207 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-22 13:00:00: Chop_High -> Chop_Low
[2026-05-15 01:18:34,207 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-22 16:00:00: Chop_Low -> Chop_High
[2026-05-15 01:18:34,207 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-23 13:00:00: Chop_High -> Chop_Low
[2026-05-15 01:18:34,208 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-23 16:00:00: Chop_Low -> Bull
[2026-05-15 01:18:34,208 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-24 13:00:00: Bull -> Chop_Low
[2026-05-15 01:18:34,233 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:18:34,249 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:18:34,579 INFO] src.engine_xgb: XGB Train Acc: 0.8149 | Test Acc: 0.8149
[2026-05-15 01:18:34,579 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11280734), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1294992), 'atr_normalized': np.float32(0.11948203), 'prev_log_return': np.float32(0.12877962), 'usdchf_log_return': np.float32(0.13145548), 'xagusd_log_return': np.float32(0.12431539), 'xtiusd_log_return': np.float32(0.129636), 'synth_vix_zscore': np.float32(0.124024965)}
[2026-05-15 01:18:34,580 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:18:34,908 INFO] src.engine_xgb: XGB Train Acc: 0.7874 | Test Acc: 0.7874
[2026-05-15 01:18:34,909 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10873027), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1235793), 'atr_normalized': np.float32(0.12870307), 'prev_log_return': np.float32(0.121732086), 'usdchf_log_return': np.float32(0.1306607), 'xagusd_log_return': np.float32(0.123257205), 'xtiusd_log_return': np.float32(0.13075517), 'synth_vix_zscore': np.float32(0.13258223)}
[2026-05-15 01:18:34,910 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:18:35,232 INFO] src.engine_xgb: XGB Train Acc: 0.7937 | Test Acc: 0.7937
[2026-05-15 01:18:35,233 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09748528), 'gmm_vol_cluster': np.float32(0.119499795), 'rsi_slope': np.float32(0.10701658), 'atr_normalized': np.float32(0.109012105), 'prev_log_return': np.float32(0.10765255), 'usdchf_log_return': np.float32(0.114669584), 'xagusd_log_return': np.float32(0.11203437), 'xtiusd_log_return': np.float32(0.117933236), 'synth_vix_zscore': np.float32(0.11469642)}
[2026-05-15 01:18:35,233 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:18:35,235 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.73608, -0.15122) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:35,364 INFO] src.backtester: Backtest [H1]: Sharpe=-1.714 | MaxDD=0.099 | WR=0.341 | Return=-8.2% | Trades=164
[2026-05-15 01:18:35,365 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:35,772 INFO] src.engine_xgb: XGB Train Acc: 0.7546 | Test Acc: 0.7546
[2026-05-15 01:18:35,773 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1245345), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12844661), 'atr_normalized': np.float32(0.11886026), 'prev_log_return': np.float32(0.124348916), 'usdchf_log_return': np.float32(0.12673934), 'xagusd_log_return': np.float32(0.12167534), 'xtiusd_log_return': np.float32(0.12685707), 'synth_vix_zscore': np.float32(0.12853797)}
[2026-05-15 01:18:35,773 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:18:36,151 INFO] src.engine_xgb: XGB Train Acc: 0.7393 | Test Acc: 0.7393
[2026-05-15 01:18:36,151 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.098705836), 'gmm_vol_cluster': np.float32(0.13738282), 'rsi_slope': np.float32(0.10565171), 'atr_normalized': np.float32(0.10837979), 'prev_log_return': np.float32(0.11117091), 'usdchf_log_return': np.float32(0.10923589), 'xagusd_log_return': np.float32(0.11244549), 'xtiusd_log_return': np.float32(0.10878538), 'synth_vix_zscore': np.float32(0.10824218)}
[2026-05-15 01:18:36,152 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:18:36,517 INFO] src.engine_xgb: XGB Train Acc: 0.7380 | Test Acc: 0.7380
[2026-05-15 01:18:36,517 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10737233), 'gmm_vol_cluster': np.float32(0.10402958), 'rsi_slope': np.float32(0.12185627), 'atr_normalized': np.float32(0.11361816), 'prev_log_return': np.float32(0.11219779), 'usdchf_log_return': np.float32(0.11011574), 'xagusd_log_return': np.float32(0.11333687), 'xtiusd_log_return': np.float32(0.108688205), 'synth_vix_zscore': np.float32(0.10878497)}
[2026-05-15 01:18:36,518 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:18:36,520 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53526, 0.16378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:36,655 INFO] src.backtester: Backtest [H1]: Sharpe=-4.828 | MaxDD=0.200 | WR=0.281 | Return=-17.3% | Trades=160
[2026-05-15 01:18:36,656 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:37,092 INFO] src.engine_xgb: XGB Train Acc: 0.6953 | Test Acc: 0.6953
[2026-05-15 01:18:37,093 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12350139), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1253338), 'atr_normalized': np.float32(0.12724346), 'prev_log_return': np.float32(0.12618448), 'usdchf_log_return': np.float32(0.13135199), 'xagusd_log_return': np.float32(0.12166367), 'xtiusd_log_return': np.float32(0.1205684), 'synth_vix_zscore': np.float32(0.12415282)}
[2026-05-15 01:18:37,093 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:18:37,518 INFO] src.engine_xgb: XGB Train Acc: 0.7014 | Test Acc: 0.7014
[2026-05-15 01:18:37,519 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10488474), 'gmm_vol_cluster': np.float32(0.10949786), 'rsi_slope': np.float32(0.11085416), 'atr_normalized': np.float32(0.11119423), 'prev_log_return': np.float32(0.113231376), 'usdchf_log_return': np.float32(0.11233623), 'xagusd_log_return': np.float32(0.112868115), 'xtiusd_log_return': np.float32(0.11293406), 'synth_vix_zscore': np.float32(0.11219929)}
[2026-05-15 01:18:37,519 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:18:37,933 INFO] src.engine_xgb: XGB Train Acc: 0.6844 | Test Acc: 0.6844
[2026-05-15 01:18:37,933 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.113469005), 'gmm_vol_cluster': np.float32(0.09910319), 'rsi_slope': np.float32(0.11922522), 'atr_normalized': np.float32(0.11884437), 'prev_log_return': np.float32(0.1088021), 'usdchf_log_return': np.float32(0.10987375), 'xagusd_log_return': np.float32(0.11057434), 'xtiusd_log_return': np.float32(0.110377155), 'synth_vix_zscore': np.float32(0.109730884)}
[2026-05-15 01:18:37,934 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:18:37,935 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.43440, 0.22813) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:38,027 INFO] src.backtester: Backtest [H1]: Sharpe=-4.013 | MaxDD=0.190 | WR=0.381 | Return=-16.0% | Trades=84
[2026-05-15 01:18:38,028 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:38,043 INFO] src.optimizer: WFO [H1] window start=43200: trades=84 sharpe=-4.013 cv_sharpe=-3.271 score=-50.000
[2026-05-15 01:18:38,044 INFO] src.optimizer: WFO [H1]: 7/8 valid | median_trades=107 | score=-1.169 | std_sharpe=2.843 | WFE=0.79 | window_scores=[1.785, -0.5, -1.0, -0.5, -0.5, -0.5, -0.5, -50.0]
[2026-05-15 01:18:38,093 INFO] src.optimizer: Trial 28 [H1/headway_cent $15 standard]: score=-2.091 | valid=7/8 | std_sharpe=2.843 | median_trades=107 | WFE=0.79 | scores=[1.785, -0.5, -1.0, -0.5, -0.5, -0.5, -0.5, -50.0]
Best trial: 23. Best value: -0.320363: 14%|█████████▊ | 29/200 [16:37<1:53:43, 39.91s/it][2026-05-15 01:18:40,371 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:18:40,372 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:18:40,372 INFO] src.engine_hmm: Bull 0.9732 0.0102 0.0145 0.0021
[2026-05-15 01:18:40,373 INFO] src.engine_hmm: Bear 0.0066 0.9675 0.0000 0.0259
[2026-05-15 01:18:40,373 INFO] src.engine_hmm: Chop_Low 0.0100 0.0006 0.9707 0.0187
[2026-05-15 01:18:40,374 INFO] src.engine_hmm: Chop_High 0.0042 0.0112 0.0201 0.9645
[2026-05-15 01:18:40,374 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:18:40,374 INFO] src.engine_hmm: Bull: return=1.221950, vol=0.809944, rsi_slope=-0.050595
[2026-05-15 01:18:40,375 INFO] src.engine_hmm: Bear: return=-1.188210, vol=0.951043, rsi_slope=0.051840
[2026-05-15 01:18:40,375 INFO] src.engine_hmm: Chop_Low: return=0.333082, vol=-0.643272, rsi_slope=-0.024205
[2026-05-15 01:18:40,375 INFO] src.engine_hmm: Chop_High: return=-0.487649, vol=-0.444743, rsi_slope=0.029319
[2026-05-15 01:18:40,376 INFO] src.engine_hmm: Total regime transitions: 304
[2026-05-15 01:18:40,376 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-25 06:00:00: Chop_Low -> Chop_High
[2026-05-15 01:18:40,377 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-27 15:00:00: Chop_High -> Bear
[2026-05-15 01:18:40,377 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-28 02:00:00: Bear -> Chop_High
[2026-05-15 01:18:40,378 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-02 19:00:00: Chop_High -> Bear
[2026-05-15 01:18:40,378 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-03 09:00:00: Bear -> Chop_High
[2026-05-15 01:18:40,379 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-03 16:00:00: Chop_High -> Chop_Low
[2026-05-15 01:18:40,379 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-03 19:00:00: Chop_Low -> Bull
[2026-05-15 01:18:40,380 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-04 16:00:00: Bull -> Chop_Low
[2026-05-15 01:18:40,380 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-10 11:00:00: Chop_Low -> Chop_High
[2026-05-15 01:18:40,381 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-11 03:00:00: Chop_High -> Bear
[2026-05-15 01:18:40,415 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:18:40,431 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:18:40,677 INFO] src.engine_xgb: XGB Train Acc: 0.6391 | Test Acc: 0.6391
[2026-05-15 01:18:40,677 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12521805), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11888752), 'atr_normalized': np.float32(0.11758066), 'prev_log_return': np.float32(0.13648713), 'usdchf_log_return': np.float32(0.116430186), 'xagusd_log_return': np.float32(0.13716109), 'xtiusd_log_return': np.float32(0.12301821), 'synth_vix_zscore': np.float32(0.12521715)}
[2026-05-15 01:18:40,678 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:18:40,933 INFO] src.engine_xgb: XGB Train Acc: 0.6555 | Test Acc: 0.6555
[2026-05-15 01:18:40,933 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11830821), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15570624), 'atr_normalized': np.float32(0.10141693), 'prev_log_return': np.float32(0.12170236), 'usdchf_log_return': np.float32(0.12584317), 'xagusd_log_return': np.float32(0.120701715), 'xtiusd_log_return': np.float32(0.1259308), 'synth_vix_zscore': np.float32(0.13039058)}
[2026-05-15 01:18:40,933 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:18:41,151 INFO] src.engine_xgb: XGB Train Acc: 0.7053 | Test Acc: 0.7053
[2026-05-15 01:18:41,151 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.121621914), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14222124), 'atr_normalized': np.float32(0.11966217), 'prev_log_return': np.float32(0.1184871), 'usdchf_log_return': np.float32(0.11897029), 'xagusd_log_return': np.float32(0.13062815), 'xtiusd_log_return': np.float32(0.13341226), 'synth_vix_zscore': np.float32(0.11499686)}
[2026-05-15 01:18:41,151 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:18:41,153 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.38336, 0.21891) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:41,281 INFO] src.backtester: Backtest [H1]: Sharpe=-3.711 | MaxDD=0.075 | WR=0.181 | Return=-7.2% | Trades=105
[2026-05-15 01:18:41,282 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:41,571 INFO] src.engine_xgb: XGB Train Acc: 0.5888 | Test Acc: 0.5888
[2026-05-15 01:18:41,571 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13505071), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.115272805), 'atr_normalized': np.float32(0.1341249), 'prev_log_return': np.float32(0.12167756), 'usdchf_log_return': np.float32(0.120233595), 'xagusd_log_return': np.float32(0.13273445), 'xtiusd_log_return': np.float32(0.12926538), 'synth_vix_zscore': np.float32(0.1116406)}
[2026-05-15 01:18:41,572 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:18:41,826 INFO] src.engine_xgb: XGB Train Acc: 0.5631 | Test Acc: 0.5631
[2026-05-15 01:18:41,826 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11070483), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15257534), 'atr_normalized': np.float32(0.11414282), 'prev_log_return': np.float32(0.11253287), 'usdchf_log_return': np.float32(0.11883289), 'xagusd_log_return': np.float32(0.13013944), 'xtiusd_log_return': np.float32(0.12482143), 'synth_vix_zscore': np.float32(0.13625039)}
[2026-05-15 01:18:41,826 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:18:42,076 INFO] src.engine_xgb: XGB Train Acc: 0.6034 | Test Acc: 0.6034
[2026-05-15 01:18:42,076 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10800499), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14220333), 'atr_normalized': np.float32(0.11626782), 'prev_log_return': np.float32(0.12007812), 'usdchf_log_return': np.float32(0.12345937), 'xagusd_log_return': np.float32(0.13848443), 'xtiusd_log_return': np.float32(0.1355182), 'synth_vix_zscore': np.float32(0.11598375)}
[2026-05-15 01:18:42,077 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:18:42,079 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53107, 0.07740) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:42,212 INFO] src.backtester: Backtest [H1]: Sharpe=-2.742 | MaxDD=0.105 | WR=0.242 | Return=-8.3% | Trades=95
[2026-05-15 01:18:42,213 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:42,541 INFO] src.engine_xgb: XGB Train Acc: 0.5521 | Test Acc: 0.5521
[2026-05-15 01:18:42,541 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1451838), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12544118), 'atr_normalized': np.float32(0.117964685), 'prev_log_return': np.float32(0.12352126), 'usdchf_log_return': np.float32(0.120020464), 'xagusd_log_return': np.float32(0.12489641), 'xtiusd_log_return': np.float32(0.12352424), 'synth_vix_zscore': np.float32(0.119447924)}
[2026-05-15 01:18:42,542 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:18:42,873 INFO] src.engine_xgb: XGB Train Acc: 0.5993 | Test Acc: 0.5993
[2026-05-15 01:18:42,874 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11678799), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1367372), 'atr_normalized': np.float32(0.10798974), 'prev_log_return': np.float32(0.118821), 'usdchf_log_return': np.float32(0.13512142), 'xagusd_log_return': np.float32(0.12698136), 'xtiusd_log_return': np.float32(0.12829308), 'synth_vix_zscore': np.float32(0.12926818)}
[2026-05-15 01:18:42,874 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:18:43,220 INFO] src.engine_xgb: XGB Train Acc: 0.5843 | Test Acc: 0.5843
[2026-05-15 01:18:43,221 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.108521335), 'gmm_vol_cluster': np.float32(0.10303351), 'rsi_slope': np.float32(0.13449448), 'atr_normalized': np.float32(0.10980809), 'prev_log_return': np.float32(0.10282535), 'usdchf_log_return': np.float32(0.10902857), 'xagusd_log_return': np.float32(0.10940714), 'xtiusd_log_return': np.float32(0.10806022), 'synth_vix_zscore': np.float32(0.114821255)}
[2026-05-15 01:18:43,221 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:18:43,223 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.38300, 0.44275) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:43,305 INFO] src.backtester: Backtest [H1]: Sharpe=0.238 | MaxDD=0.077 | WR=0.323 | Return=1.4% | Trades=62
[2026-05-15 01:18:43,305 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:43,316 INFO] src.optimizer: WFO [H1] window start=12960: trades=62 sharpe=0.238 cv_sharpe=-3.227 score=0.155
[2026-05-15 01:18:45,014 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:18:45,015 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:18:45,015 INFO] src.engine_hmm: Bull 0.9707 0.0097 0.0116 0.0080
[2026-05-15 01:18:45,015 INFO] src.engine_hmm: Bear 0.0062 0.9749 0.0146 0.0043
[2026-05-15 01:18:45,016 INFO] src.engine_hmm: Chop_Low 0.0097 0.0096 0.9806 0.0000
[2026-05-15 01:18:45,016 INFO] src.engine_hmm: Chop_High 0.0214 0.0029 0.0000 0.9757
[2026-05-15 01:18:45,016 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:18:45,016 INFO] src.engine_hmm: Bull: return=0.597704, vol=0.083641, rsi_slope=-0.020419
[2026-05-15 01:18:45,017 INFO] src.engine_hmm: Bear: return=-0.813060, vol=-0.071238, rsi_slope=0.028186
[2026-05-15 01:18:45,017 INFO] src.engine_hmm: Chop_Low: return=0.006861, vol=-0.679465, rsi_slope=0.005131
[2026-05-15 01:18:45,018 INFO] src.engine_hmm: Chop_High: return=0.344193, vol=1.804909, rsi_slope=-0.027050
[2026-05-15 01:18:45,018 INFO] src.engine_hmm: Total regime transitions: 243
[2026-05-15 01:18:45,019 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-20 20:00:00: Chop_Low -> Bull
[2026-05-15 01:18:45,019 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-21 21:00:00: Bull -> Chop_Low
[2026-05-15 01:18:45,019 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-27 19:00:00: Chop_Low -> Bear
[2026-05-15 01:18:45,020 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-02 15:00:00: Bear -> Chop_Low
[2026-05-15 01:18:45,020 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-04 15:00:00: Chop_Low -> Bear
[2026-05-15 01:18:45,021 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-04 20:00:00: Bear -> Chop_Low
[2026-05-15 01:18:45,021 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-11 15:00:00: Chop_Low -> Bear
[2026-05-15 01:18:45,022 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-18 11:00:00: Bear -> Chop_Low
[2026-05-15 01:18:45,022 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-23 14:00:00: Chop_Low -> Bear
[2026-05-15 01:18:45,023 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-24 10:00:00: Bear -> Chop_Low
[2026-05-15 01:18:45,063 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:18:45,080 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:18:45,340 INFO] src.engine_xgb: XGB Train Acc: 0.6935 | Test Acc: 0.6935
[2026-05-15 01:18:45,341 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12227273), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12022482), 'atr_normalized': np.float32(0.12743111), 'prev_log_return': np.float32(0.1164167), 'usdchf_log_return': np.float32(0.12501186), 'xagusd_log_return': np.float32(0.12799238), 'xtiusd_log_return': np.float32(0.12961753), 'synth_vix_zscore': np.float32(0.13103293)}
[2026-05-15 01:18:45,341 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:18:45,589 INFO] src.engine_xgb: XGB Train Acc: 0.6408 | Test Acc: 0.6408
[2026-05-15 01:18:45,589 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10879805), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11403607), 'atr_normalized': np.float32(0.13665617), 'prev_log_return': np.float32(0.12730712), 'usdchf_log_return': np.float32(0.12525763), 'xagusd_log_return': np.float32(0.12661922), 'xtiusd_log_return': np.float32(0.13783789), 'synth_vix_zscore': np.float32(0.123487875)}
[2026-05-15 01:18:45,589 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:18:45,818 INFO] src.engine_xgb: XGB Train Acc: 0.6169 | Test Acc: 0.6169
[2026-05-15 01:18:45,818 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.096546985), 'gmm_vol_cluster': np.float32(0.1025199), 'rsi_slope': np.float32(0.12748775), 'atr_normalized': np.float32(0.101786755), 'prev_log_return': np.float32(0.10969811), 'usdchf_log_return': np.float32(0.113618135), 'xagusd_log_return': np.float32(0.11167889), 'xtiusd_log_return': np.float32(0.124845445), 'synth_vix_zscore': np.float32(0.11181805)}
[2026-05-15 01:18:45,819 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:18:45,820 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.50441, -0.08685) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:45,954 INFO] src.backtester: Backtest [H1]: Sharpe=-0.552 | MaxDD=0.131 | WR=0.278 | Return=-2.8% | Trades=108
[2026-05-15 01:18:45,955 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:46,185 INFO] src.engine_xgb: XGB Train Acc: 0.6264 | Test Acc: 0.6264
[2026-05-15 01:18:46,186 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11412748), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12940483), 'atr_normalized': np.float32(0.11968713), 'prev_log_return': np.float32(0.124693595), 'usdchf_log_return': np.float32(0.12255386), 'xagusd_log_return': np.float32(0.12872499), 'xtiusd_log_return': np.float32(0.12419689), 'synth_vix_zscore': np.float32(0.13661116)}
[2026-05-15 01:18:46,186 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:18:46,469 INFO] src.engine_xgb: XGB Train Acc: 0.5954 | Test Acc: 0.5954
[2026-05-15 01:18:46,470 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1124738), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12099219), 'atr_normalized': np.float32(0.13142864), 'prev_log_return': np.float32(0.12883742), 'usdchf_log_return': np.float32(0.12276676), 'xagusd_log_return': np.float32(0.13288888), 'xtiusd_log_return': np.float32(0.12802824), 'synth_vix_zscore': np.float32(0.12258401)}
[2026-05-15 01:18:46,471 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:18:46,752 INFO] src.engine_xgb: XGB Train Acc: 0.5852 | Test Acc: 0.5852
[2026-05-15 01:18:46,752 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10701995), 'gmm_vol_cluster': np.float32(0.07885777), 'rsi_slope': np.float32(0.1346734), 'atr_normalized': np.float32(0.097422466), 'prev_log_return': np.float32(0.10688594), 'usdchf_log_return': np.float32(0.110734366), 'xagusd_log_return': np.float32(0.13333482), 'xtiusd_log_return': np.float32(0.122139506), 'synth_vix_zscore': np.float32(0.108931705)}
[2026-05-15 01:18:46,753 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:18:46,755 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.49357, -0.10582) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:46,888 INFO] src.backtester: Backtest [H1]: Sharpe=-4.587 | MaxDD=0.227 | WR=0.220 | Return=-19.8% | Trades=100
[2026-05-15 01:18:46,888 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:47,219 INFO] src.engine_xgb: XGB Train Acc: 0.6323 | Test Acc: 0.6323
[2026-05-15 01:18:47,220 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12945284), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.120723546), 'atr_normalized': np.float32(0.11938837), 'prev_log_return': np.float32(0.12505883), 'usdchf_log_return': np.float32(0.1248142), 'xagusd_log_return': np.float32(0.13072738), 'xtiusd_log_return': np.float32(0.121721625), 'synth_vix_zscore': np.float32(0.1281132)}
[2026-05-15 01:18:47,220 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:18:47,575 INFO] src.engine_xgb: XGB Train Acc: 0.6100 | Test Acc: 0.6100
[2026-05-15 01:18:47,575 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11307175), 'gmm_vol_cluster': np.float32(0.10480838), 'rsi_slope': np.float32(0.119606994), 'atr_normalized': np.float32(0.108159184), 'prev_log_return': np.float32(0.10964813), 'usdchf_log_return': np.float32(0.113183096), 'xagusd_log_return': np.float32(0.11400211), 'xtiusd_log_return': np.float32(0.11023211), 'synth_vix_zscore': np.float32(0.107288234)}
[2026-05-15 01:18:47,576 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:18:47,900 INFO] src.engine_xgb: XGB Train Acc: 0.5903 | Test Acc: 0.5903
[2026-05-15 01:18:47,900 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10430313), 'gmm_vol_cluster': np.float32(0.11492091), 'rsi_slope': np.float32(0.11653346), 'atr_normalized': np.float32(0.10439856), 'prev_log_return': np.float32(0.10160811), 'usdchf_log_return': np.float32(0.11445079), 'xagusd_log_return': np.float32(0.12664348), 'xtiusd_log_return': np.float32(0.11226912), 'synth_vix_zscore': np.float32(0.10487244)}
[2026-05-15 01:18:47,901 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:18:47,902 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.36542, 0.20284) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:47,997 INFO] src.backtester: Backtest [H1]: Sharpe=-1.800 | MaxDD=0.057 | WR=0.226 | Return=-3.8% | Trades=62
[2026-05-15 01:18:47,997 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:48,010 INFO] src.optimizer: WFO [H1] window start=17280: trades=62 sharpe=-1.800 cv_sharpe=-2.569 score=-0.500
[2026-05-15 01:18:48,832 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:18:48,832 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:18:48,832 INFO] src.engine_hmm: Bull 0.9755 0.0119 0.0125 0.0000
[2026-05-15 01:18:48,833 INFO] src.engine_hmm: Bear 0.0100 0.9618 0.0158 0.0124
[2026-05-15 01:18:48,833 INFO] src.engine_hmm: Chop_Low 0.0105 0.0119 0.9776 0.0000
[2026-05-15 01:18:48,833 INFO] src.engine_hmm: Chop_High 0.0000 0.0244 0.0000 0.9756
[2026-05-15 01:18:48,834 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:18:48,834 INFO] src.engine_hmm: Bull: return=0.732022, vol=-0.282140, rsi_slope=-0.035002
[2026-05-15 01:18:48,835 INFO] src.engine_hmm: Bear: return=-0.594100, vol=0.215516, rsi_slope=0.038847
[2026-05-15 01:18:48,835 INFO] src.engine_hmm: Chop_Low: return=-0.065390, vol=-0.683755, rsi_slope=0.002041
[2026-05-15 01:18:48,835 INFO] src.engine_hmm: Chop_High: return=-0.020500, vol=1.747788, rsi_slope=-0.016887
[2026-05-15 01:18:48,836 INFO] src.engine_hmm: Total regime transitions: 282
[2026-05-15 01:18:48,836 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 15:00:00: Chop_Low -> Bear
[2026-05-15 01:18:48,837 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-13 13:00:00: Bear -> Chop_Low
[2026-05-15 01:18:48,837 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-24 17:00:00: Chop_Low -> Bull
[2026-05-15 01:18:48,838 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-27 22:00:00: Bull -> Chop_Low
[2026-05-15 01:18:48,838 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-31 03:00:00: Chop_Low -> Bull
[2026-05-15 01:18:48,839 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-31 14:00:00: Bull -> Chop_Low
[2026-05-15 01:18:48,839 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-02 15:00:00: Chop_Low -> Bull
[2026-05-15 01:18:48,840 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 01:00:00: Bull -> Bear
[2026-05-15 01:18:48,841 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 02:00:00: Bear -> Chop_High
[2026-05-15 01:18:48,841 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 20:00:00: Chop_High -> Bear
[2026-05-15 01:18:48,877 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:18:48,893 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:18:49,130 INFO] src.engine_xgb: XGB Train Acc: 0.7458 | Test Acc: 0.7458
[2026-05-15 01:18:49,131 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14804418), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12075277), 'atr_normalized': np.float32(0.11217245), 'prev_log_return': np.float32(0.11946302), 'usdchf_log_return': np.float32(0.11996493), 'xagusd_log_return': np.float32(0.13337462), 'xtiusd_log_return': np.float32(0.12879843), 'synth_vix_zscore': np.float32(0.11742962)}
[2026-05-15 01:18:49,132 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:18:49,370 INFO] src.engine_xgb: XGB Train Acc: 0.7173 | Test Acc: 0.7173
[2026-05-15 01:18:49,371 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11023241), 'gmm_vol_cluster': np.float32(0.14845471), 'rsi_slope': np.float32(0.11364178), 'atr_normalized': np.float32(0.10669273), 'prev_log_return': np.float32(0.10411119), 'usdchf_log_return': np.float32(0.10052396), 'xagusd_log_return': np.float32(0.110269584), 'xtiusd_log_return': np.float32(0.10123541), 'synth_vix_zscore': np.float32(0.104838304)}
[2026-05-15 01:18:49,371 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:18:49,585 INFO] src.engine_xgb: XGB Train Acc: 0.6565 | Test Acc: 0.6565
[2026-05-15 01:18:49,586 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10072934), 'gmm_vol_cluster': np.float32(0.119116224), 'rsi_slope': np.float32(0.11544011), 'atr_normalized': np.float32(0.10882663), 'prev_log_return': np.float32(0.097506724), 'usdchf_log_return': np.float32(0.10770084), 'xagusd_log_return': np.float32(0.11969294), 'xtiusd_log_return': np.float32(0.11611334), 'synth_vix_zscore': np.float32(0.11487386)}
[2026-05-15 01:18:49,586 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:18:49,588 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.54544, 0.24324) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:49,722 INFO] src.backtester: Backtest [H1]: Sharpe=-2.511 | MaxDD=0.110 | WR=0.228 | Return=-9.4% | Trades=101
[2026-05-15 01:18:49,723 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:50,050 INFO] src.engine_xgb: XGB Train Acc: 0.6623 | Test Acc: 0.6623
[2026-05-15 01:18:50,051 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15911749), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12656507), 'atr_normalized': np.float32(0.11084004), 'prev_log_return': np.float32(0.12183402), 'usdchf_log_return': np.float32(0.11672203), 'xagusd_log_return': np.float32(0.12457503), 'xtiusd_log_return': np.float32(0.12396365), 'synth_vix_zscore': np.float32(0.11638267)}
[2026-05-15 01:18:50,051 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:18:50,294 INFO] src.engine_xgb: XGB Train Acc: 0.6580 | Test Acc: 0.6580
[2026-05-15 01:18:50,295 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09228655), 'gmm_vol_cluster': np.float32(0.13319468), 'rsi_slope': np.float32(0.12388153), 'atr_normalized': np.float32(0.10645467), 'prev_log_return': np.float32(0.108536236), 'usdchf_log_return': np.float32(0.10772509), 'xagusd_log_return': np.float32(0.11210353), 'xtiusd_log_return': np.float32(0.103551574), 'synth_vix_zscore': np.float32(0.11226622)}
[2026-05-15 01:18:50,295 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:18:50,559 INFO] src.engine_xgb: XGB Train Acc: 0.6019 | Test Acc: 0.6019
[2026-05-15 01:18:50,559 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11403085), 'gmm_vol_cluster': np.float32(0.117263585), 'rsi_slope': np.float32(0.10977525), 'atr_normalized': np.float32(0.10737097), 'prev_log_return': np.float32(0.100686856), 'usdchf_log_return': np.float32(0.10630346), 'xagusd_log_return': np.float32(0.11778549), 'xtiusd_log_return': np.float32(0.11329179), 'synth_vix_zscore': np.float32(0.11349176)}
[2026-05-15 01:18:50,560 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:18:50,561 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.48586, 0.08539) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:50,691 INFO] src.backtester: Backtest [H1]: Sharpe=0.616 | MaxDD=0.051 | WR=0.307 | Return=1.9% | Trades=75
[2026-05-15 01:18:50,692 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:51,024 INFO] src.engine_xgb: XGB Train Acc: 0.6337 | Test Acc: 0.6337
[2026-05-15 01:18:51,024 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15532559), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1306212), 'atr_normalized': np.float32(0.11525954), 'prev_log_return': np.float32(0.12106917), 'usdchf_log_return': np.float32(0.11633745), 'xagusd_log_return': np.float32(0.1293817), 'xtiusd_log_return': np.float32(0.1150126), 'synth_vix_zscore': np.float32(0.11699276)}
[2026-05-15 01:18:51,026 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:18:51,349 INFO] src.engine_xgb: XGB Train Acc: 0.6457 | Test Acc: 0.6457
[2026-05-15 01:18:51,350 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11518256), 'gmm_vol_cluster': np.float32(0.10327701), 'rsi_slope': np.float32(0.11611115), 'atr_normalized': np.float32(0.110633), 'prev_log_return': np.float32(0.11056773), 'usdchf_log_return': np.float32(0.10796758), 'xagusd_log_return': np.float32(0.11780462), 'xtiusd_log_return': np.float32(0.10591597), 'synth_vix_zscore': np.float32(0.11254037)}
[2026-05-15 01:18:51,351 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:18:51,691 INFO] src.engine_xgb: XGB Train Acc: 0.6048 | Test Acc: 0.6048
[2026-05-15 01:18:51,691 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11305088), 'gmm_vol_cluster': np.float32(0.09876178), 'rsi_slope': np.float32(0.114940204), 'atr_normalized': np.float32(0.115959056), 'prev_log_return': np.float32(0.10537292), 'usdchf_log_return': np.float32(0.106035545), 'xagusd_log_return': np.float32(0.11970252), 'xtiusd_log_return': np.float32(0.11304454), 'synth_vix_zscore': np.float32(0.11313257)}
[2026-05-15 01:18:51,692 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:18:51,694 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.51495, -0.03378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:51,797 INFO] src.backtester: Backtest [H1]: Sharpe=-3.162 | MaxDD=0.057 | WR=0.293 | Return=-5.2% | Trades=58
[2026-05-15 01:18:51,798 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:51,811 INFO] src.optimizer: WFO [H1] window start=21600: trades=58 sharpe=-3.162 cv_sharpe=-0.948 score=-1.000
[2026-05-15 01:18:52,775 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:18:52,776 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:18:52,776 INFO] src.engine_hmm: Bull 0.9743 0.0081 0.0141 0.0035
[2026-05-15 01:18:52,777 INFO] src.engine_hmm: Bear 0.0000 0.9536 0.0000 0.0464
[2026-05-15 01:18:52,777 INFO] src.engine_hmm: Chop_Low 0.0131 0.0066 0.9663 0.0140
[2026-05-15 01:18:52,778 INFO] src.engine_hmm: Chop_High 0.0107 0.0069 0.0253 0.9572
[2026-05-15 01:18:52,778 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:18:52,778 INFO] src.engine_hmm: Bull: return=0.912866, vol=-0.410378, rsi_slope=-0.039402
[2026-05-15 01:18:52,779 INFO] src.engine_hmm: Bear: return=-0.677912, vol=1.729860, rsi_slope=-0.018652
[2026-05-15 01:18:52,779 INFO] src.engine_hmm: Chop_Low: return=-0.087426, vol=-0.605646, rsi_slope=0.008484
[2026-05-15 01:18:52,780 INFO] src.engine_hmm: Chop_High: return=-0.478265, vol=0.273824, rsi_slope=0.038519
[2026-05-15 01:18:52,781 INFO] src.engine_hmm: Total regime transitions: 358
[2026-05-15 01:18:52,781 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-07 16:00:00: Chop_High -> Chop_Low
[2026-05-15 01:18:52,782 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-08 12:00:00: Chop_Low -> Chop_High
[2026-05-15 01:18:52,782 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 12:00:00: Chop_High -> Bull
[2026-05-15 01:18:52,783 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 21:00:00: Bull -> Chop_High
[2026-05-15 01:18:52,784 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-14 16:00:00: Chop_High -> Bull
[2026-05-15 01:18:52,784 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-15 16:00:00: Bull -> Bear
[2026-05-15 01:18:52,784 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-15 17:00:00: Bear -> Chop_High
[2026-05-15 01:18:52,785 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-16 10:00:00: Chop_High -> Bull
[2026-05-15 01:18:52,785 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-16 21:00:00: Bull -> Chop_Low
[2026-05-15 01:18:52,785 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-17 04:00:00: Chop_Low -> Chop_High
[2026-05-15 01:18:52,820 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:18:52,836 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:18:53,094 INFO] src.engine_xgb: XGB Train Acc: 0.6349 | Test Acc: 0.6349
[2026-05-15 01:18:53,094 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12088613), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.124198206), 'atr_normalized': np.float32(0.1203124), 'prev_log_return': np.float32(0.13114838), 'usdchf_log_return': np.float32(0.12522894), 'xagusd_log_return': np.float32(0.13079518), 'xtiusd_log_return': np.float32(0.12332166), 'synth_vix_zscore': np.float32(0.12410904)}
[2026-05-15 01:18:53,095 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:18:53,314 INFO] src.engine_xgb: XGB Train Acc: 0.6503 | Test Acc: 0.6503
[2026-05-15 01:18:53,315 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11234318), 'gmm_vol_cluster': np.float32(0.11217629), 'rsi_slope': np.float32(0.10918614), 'atr_normalized': np.float32(0.11390976), 'prev_log_return': np.float32(0.10109502), 'usdchf_log_return': np.float32(0.11547586), 'xagusd_log_return': np.float32(0.11788467), 'xtiusd_log_return': np.float32(0.106518105), 'synth_vix_zscore': np.float32(0.11141101)}
[2026-05-15 01:18:53,315 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:18:53,596 INFO] src.engine_xgb: XGB Train Acc: 0.6677 | Test Acc: 0.6677
[2026-05-15 01:18:53,597 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08413737), 'gmm_vol_cluster': np.float32(0.0987792), 'rsi_slope': np.float32(0.12110315), 'atr_normalized': np.float32(0.12436389), 'prev_log_return': np.float32(0.10714059), 'usdchf_log_return': np.float32(0.11116741), 'xagusd_log_return': np.float32(0.11580997), 'xtiusd_log_return': np.float32(0.11067759), 'synth_vix_zscore': np.float32(0.1268208)}
[2026-05-15 01:18:53,597 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:18:53,599 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.16146, 0.63340) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:53,731 INFO] src.backtester: Backtest [H1]: Sharpe=-0.423 | MaxDD=0.049 | WR=0.360 | Return=-1.8% | Trades=86
[2026-05-15 01:18:53,732 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:54,019 INFO] src.engine_xgb: XGB Train Acc: 0.5987 | Test Acc: 0.5987
[2026-05-15 01:18:54,020 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13498609), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12952635), 'atr_normalized': np.float32(0.1288324), 'prev_log_return': np.float32(0.12019556), 'usdchf_log_return': np.float32(0.1154159), 'xagusd_log_return': np.float32(0.13146557), 'xtiusd_log_return': np.float32(0.121662214), 'synth_vix_zscore': np.float32(0.11791586)}
[2026-05-15 01:18:54,020 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:18:54,300 INFO] src.engine_xgb: XGB Train Acc: 0.6048 | Test Acc: 0.6048
[2026-05-15 01:18:54,301 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10285896), 'gmm_vol_cluster': np.float32(0.15040638), 'rsi_slope': np.float32(0.10921888), 'atr_normalized': np.float32(0.11274136), 'prev_log_return': np.float32(0.11142001), 'usdchf_log_return': np.float32(0.09935711), 'xagusd_log_return': np.float32(0.10480486), 'xtiusd_log_return': np.float32(0.10608123), 'synth_vix_zscore': np.float32(0.1031113)}
[2026-05-15 01:18:54,302 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:18:54,575 INFO] src.engine_xgb: XGB Train Acc: 0.5933 | Test Acc: 0.5933
[2026-05-15 01:18:54,576 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10381669), 'gmm_vol_cluster': np.float32(0.10384204), 'rsi_slope': np.float32(0.1139161), 'atr_normalized': np.float32(0.11718326), 'prev_log_return': np.float32(0.10722911), 'usdchf_log_return': np.float32(0.11203884), 'xagusd_log_return': np.float32(0.11607743), 'xtiusd_log_return': np.float32(0.10448578), 'synth_vix_zscore': np.float32(0.121410765)}
[2026-05-15 01:18:54,576 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:18:54,578 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47142, 0.22575) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:54,695 INFO] src.backtester: Backtest [H1]: Sharpe=-3.930 | MaxDD=0.102 | WR=0.213 | Return=-9.7% | Trades=89
[2026-05-15 01:18:54,695 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:54,994 INFO] src.engine_xgb: XGB Train Acc: 0.5590 | Test Acc: 0.5590
[2026-05-15 01:18:54,995 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10474455), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14427675), 'atr_normalized': np.float32(0.12596954), 'prev_log_return': np.float32(0.120951265), 'usdchf_log_return': np.float32(0.12212381), 'xagusd_log_return': np.float32(0.12882854), 'xtiusd_log_return': np.float32(0.12501043), 'synth_vix_zscore': np.float32(0.12809509)}
[2026-05-15 01:18:54,996 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:18:55,281 INFO] src.engine_xgb: XGB Train Acc: 0.5796 | Test Acc: 0.5796
[2026-05-15 01:18:55,282 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11780092), 'gmm_vol_cluster': np.float32(0.12385454), 'rsi_slope': np.float32(0.11299715), 'atr_normalized': np.float32(0.109760284), 'prev_log_return': np.float32(0.113611765), 'usdchf_log_return': np.float32(0.10345075), 'xagusd_log_return': np.float32(0.110056125), 'xtiusd_log_return': np.float32(0.106726184), 'synth_vix_zscore': np.float32(0.10174224)}
[2026-05-15 01:18:55,282 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:18:55,631 INFO] src.engine_xgb: XGB Train Acc: 0.6263 | Test Acc: 0.6263
[2026-05-15 01:18:55,632 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09983343), 'gmm_vol_cluster': np.float32(0.10377816), 'rsi_slope': np.float32(0.11809163), 'atr_normalized': np.float32(0.117253765), 'prev_log_return': np.float32(0.10727032), 'usdchf_log_return': np.float32(0.11000052), 'xagusd_log_return': np.float32(0.11757511), 'xtiusd_log_return': np.float32(0.10193186), 'synth_vix_zscore': np.float32(0.12426512)}
[2026-05-15 01:18:55,632 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:18:55,634 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.62208, 0.06248) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:55,741 INFO] src.backtester: Backtest [H1]: Sharpe=-1.073 | MaxDD=0.078 | WR=0.311 | Return=-3.1% | Trades=74
[2026-05-15 01:18:55,742 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:55,756 INFO] src.optimizer: WFO [H1] window start=25920: trades=74 sharpe=-1.073 cv_sharpe=-2.176 score=-0.492
[2026-05-15 01:18:57,253 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:18:57,254 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:18:57,254 INFO] src.engine_hmm: Bull 0.9693 0.0000 0.0218 0.0090
[2026-05-15 01:18:57,255 INFO] src.engine_hmm: Bear 0.0000 0.9658 0.0258 0.0083
[2026-05-15 01:18:57,255 INFO] src.engine_hmm: Chop_Low 0.0178 0.0141 0.9630 0.0051
[2026-05-15 01:18:57,256 INFO] src.engine_hmm: Chop_High 0.0130 0.0318 0.0003 0.9549
[2026-05-15 01:18:57,256 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:18:57,256 INFO] src.engine_hmm: Bull: return=0.839146, vol=-0.490736, rsi_slope=-0.034947
[2026-05-15 01:18:57,257 INFO] src.engine_hmm: Bear: return=-0.766841, vol=0.185200, rsi_slope=0.026394
[2026-05-15 01:18:57,257 INFO] src.engine_hmm: Chop_Low: return=-0.066615, vol=-0.456482, rsi_slope=0.008533
[2026-05-15 01:18:57,257 INFO] src.engine_hmm: Chop_High: return=0.107050, vol=1.657621, rsi_slope=-0.007761
[2026-05-15 01:18:57,258 INFO] src.engine_hmm: Total regime transitions: 352
[2026-05-15 01:18:57,258 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-02 19:00:00: Chop_Low -> Bull
[2026-05-15 01:18:57,259 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 07:00:00: Bull -> Chop_Low
[2026-05-15 01:18:57,259 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 15:00:00: Chop_Low -> Bear
[2026-05-15 01:18:57,259 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-04 04:00:00: Bear -> Chop_High
[2026-05-15 01:18:57,260 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-04 12:00:00: Chop_High -> Bear
[2026-05-15 01:18:57,260 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 12:00:00: Bear -> Chop_Low
[2026-05-15 01:18:57,261 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 16:00:00: Chop_Low -> Bull
[2026-05-15 01:18:57,261 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-08 15:00:00: Bull -> Chop_Low
[2026-05-15 01:18:57,262 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 15:00:00: Chop_Low -> Chop_High
[2026-05-15 01:18:57,263 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 16:00:00: Chop_High -> Bear
[2026-05-15 01:18:57,304 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:18:57,325 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:18:57,592 INFO] src.engine_xgb: XGB Train Acc: 0.6004 | Test Acc: 0.6004
[2026-05-15 01:18:57,593 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11381219), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13873626), 'atr_normalized': np.float32(0.12764676), 'prev_log_return': np.float32(0.12693997), 'usdchf_log_return': np.float32(0.12961677), 'xagusd_log_return': np.float32(0.12874512), 'xtiusd_log_return': np.float32(0.11327361), 'synth_vix_zscore': np.float32(0.121229336)}
[2026-05-15 01:18:57,593 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:18:57,841 INFO] src.engine_xgb: XGB Train Acc: 0.6042 | Test Acc: 0.6042
[2026-05-15 01:18:57,842 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.110651135), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1344701), 'atr_normalized': np.float32(0.112209655), 'prev_log_return': np.float32(0.13096622), 'usdchf_log_return': np.float32(0.12547658), 'xagusd_log_return': np.float32(0.12208025), 'xtiusd_log_return': np.float32(0.12985422), 'synth_vix_zscore': np.float32(0.13429187)}
[2026-05-15 01:18:57,842 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:18:58,114 INFO] src.engine_xgb: XGB Train Acc: 0.6870 | Test Acc: 0.6870
[2026-05-15 01:18:58,114 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1216184), 'gmm_vol_cluster': np.float32(0.10579509), 'rsi_slope': np.float32(0.112768225), 'atr_normalized': np.float32(0.11086762), 'prev_log_return': np.float32(0.10748556), 'usdchf_log_return': np.float32(0.11496892), 'xagusd_log_return': np.float32(0.10973263), 'xtiusd_log_return': np.float32(0.113882415), 'synth_vix_zscore': np.float32(0.10288115)}
[2026-05-15 01:18:58,115 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:18:58,116 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.56732, -0.02191) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:58,233 INFO] src.backtester: Backtest [H1]: Sharpe=-0.932 | MaxDD=0.095 | WR=0.270 | Return=-3.7% | Trades=100
[2026-05-15 01:18:58,234 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:58,541 INFO] src.engine_xgb: XGB Train Acc: 0.5868 | Test Acc: 0.5868
[2026-05-15 01:18:58,542 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10227904), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14808504), 'atr_normalized': np.float32(0.12026113), 'prev_log_return': np.float32(0.13125041), 'usdchf_log_return': np.float32(0.11440186), 'xagusd_log_return': np.float32(0.13569726), 'xtiusd_log_return': np.float32(0.11405529), 'synth_vix_zscore': np.float32(0.13396998)}
[2026-05-15 01:18:58,542 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:18:58,824 INFO] src.engine_xgb: XGB Train Acc: 0.5865 | Test Acc: 0.5865
[2026-05-15 01:18:58,824 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11274076), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.124797605), 'atr_normalized': np.float32(0.121497184), 'prev_log_return': np.float32(0.12856327), 'usdchf_log_return': np.float32(0.12491468), 'xagusd_log_return': np.float32(0.13589214), 'xtiusd_log_return': np.float32(0.12448618), 'synth_vix_zscore': np.float32(0.12710819)}
[2026-05-15 01:18:58,825 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:18:59,117 INFO] src.engine_xgb: XGB Train Acc: 0.5852 | Test Acc: 0.5852
[2026-05-15 01:18:59,117 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10861288), 'gmm_vol_cluster': np.float32(0.12061137), 'rsi_slope': np.float32(0.11933917), 'atr_normalized': np.float32(0.10248402), 'prev_log_return': np.float32(0.1152832), 'usdchf_log_return': np.float32(0.10252245), 'xagusd_log_return': np.float32(0.1243758), 'xtiusd_log_return': np.float32(0.10210544), 'synth_vix_zscore': np.float32(0.10466561)}
[2026-05-15 01:18:59,118 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:18:59,119 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47816, 0.15210) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:18:59,250 INFO] src.backtester: Backtest [H1]: Sharpe=-0.230 | MaxDD=0.056 | WR=0.272 | Return=-0.9% | Trades=103
[2026-05-15 01:18:59,250 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:18:59,549 INFO] src.engine_xgb: XGB Train Acc: 0.5631 | Test Acc: 0.5631
[2026-05-15 01:18:59,550 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10975645), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13334344), 'atr_normalized': np.float32(0.12425925), 'prev_log_return': np.float32(0.1230024), 'usdchf_log_return': np.float32(0.12111826), 'xagusd_log_return': np.float32(0.13033079), 'xtiusd_log_return': np.float32(0.12369621), 'synth_vix_zscore': np.float32(0.13449319)}
[2026-05-15 01:18:59,551 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:18:59,875 INFO] src.engine_xgb: XGB Train Acc: 0.5478 | Test Acc: 0.5478
[2026-05-15 01:18:59,876 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10361066), 'gmm_vol_cluster': np.float32(0.14631695), 'rsi_slope': np.float32(0.110580206), 'atr_normalized': np.float32(0.106547624), 'prev_log_return': np.float32(0.110041305), 'usdchf_log_return': np.float32(0.10949077), 'xagusd_log_return': np.float32(0.112177685), 'xtiusd_log_return': np.float32(0.099736564), 'synth_vix_zscore': np.float32(0.10149828)}
[2026-05-15 01:18:59,876 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:19:00,202 INFO] src.engine_xgb: XGB Train Acc: 0.5870 | Test Acc: 0.5870
[2026-05-15 01:19:00,203 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10785986), 'gmm_vol_cluster': np.float32(0.10168434), 'rsi_slope': np.float32(0.12501995), 'atr_normalized': np.float32(0.11033089), 'prev_log_return': np.float32(0.118038155), 'usdchf_log_return': np.float32(0.107037514), 'xagusd_log_return': np.float32(0.108517244), 'xtiusd_log_return': np.float32(0.10861466), 'synth_vix_zscore': np.float32(0.11289738)}
[2026-05-15 01:19:00,203 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:19:00,205 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.40708, 0.22442) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:00,313 INFO] src.backtester: Backtest [H1]: Sharpe=-3.609 | MaxDD=0.101 | WR=0.254 | Return=-8.7% | Trades=67
[2026-05-15 01:19:00,313 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:00,328 INFO] src.optimizer: WFO [H1] window start=30240: trades=67 sharpe=-3.609 cv_sharpe=-0.581 score=-1.000
[2026-05-15 01:19:01,897 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:19:01,897 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:19:01,898 INFO] src.engine_hmm: Bull 0.9728 0.0090 0.0000 0.0182
[2026-05-15 01:19:01,898 INFO] src.engine_hmm: Bear 0.0037 0.9708 0.0215 0.0040
[2026-05-15 01:19:01,898 INFO] src.engine_hmm: Chop_Low 0.0048 0.0109 0.9643 0.0200
[2026-05-15 01:19:01,899 INFO] src.engine_hmm: Chop_High 0.0099 0.0080 0.0166 0.9655
[2026-05-15 01:19:01,899 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:19:01,899 INFO] src.engine_hmm: Bull: return=1.272162, vol=1.141442, rsi_slope=-0.026670
[2026-05-15 01:19:01,900 INFO] src.engine_hmm: Bear: return=-1.032578, vol=0.472635, rsi_slope=0.031157
[2026-05-15 01:19:01,900 INFO] src.engine_hmm: Chop_Low: return=-0.422585, vol=-0.720610, rsi_slope=0.031943
[2026-05-15 01:19:01,900 INFO] src.engine_hmm: Chop_High: return=0.432194, vol=-0.443444, rsi_slope=-0.038925
[2026-05-15 01:19:01,901 INFO] src.engine_hmm: Total regime transitions: 319
[2026-05-15 01:19:01,901 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-23 09:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:01,901 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-23 15:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:01,902 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-24 04:00:00: Chop_High -> Bull
[2026-05-15 01:19:01,902 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-25 18:00:00: Bull -> Bear
[2026-05-15 01:19:01,903 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-28 01:00:00: Bear -> Bull
[2026-05-15 01:19:01,903 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-03 06:00:00: Bull -> Chop_High
[2026-05-15 01:19:01,904 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-04 02:00:00: Chop_High -> Bull
[2026-05-15 01:19:01,904 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-10 23:00:00: Bull -> Bear
[2026-05-15 01:19:01,905 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-17 12:00:00: Bear -> Chop_High
[2026-05-15 01:19:01,905 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-18 04:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:01,944 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:19:01,964 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:19:02,221 INFO] src.engine_xgb: XGB Train Acc: 0.6851 | Test Acc: 0.6851
[2026-05-15 01:19:02,222 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14894451), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.117483795), 'atr_normalized': np.float32(0.11958632), 'prev_log_return': np.float32(0.114196725), 'usdchf_log_return': np.float32(0.12900573), 'xagusd_log_return': np.float32(0.118543826), 'xtiusd_log_return': np.float32(0.11493777), 'synth_vix_zscore': np.float32(0.1373013)}
[2026-05-15 01:19:02,222 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:19:02,415 INFO] src.engine_xgb: XGB Train Acc: 0.5916 | Test Acc: 0.5916
[2026-05-15 01:19:02,415 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10621455), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13092585), 'atr_normalized': np.float32(0.12888727), 'prev_log_return': np.float32(0.13579123), 'usdchf_log_return': np.float32(0.11850556), 'xagusd_log_return': np.float32(0.12888852), 'xtiusd_log_return': np.float32(0.1277555), 'synth_vix_zscore': np.float32(0.123031616)}
[2026-05-15 01:19:02,416 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:19:02,675 INFO] src.engine_xgb: XGB Train Acc: 0.6657 | Test Acc: 0.6657
[2026-05-15 01:19:02,676 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.112660505), 'gmm_vol_cluster': np.float32(0.09374397), 'rsi_slope': np.float32(0.11258668), 'atr_normalized': np.float32(0.118502125), 'prev_log_return': np.float32(0.11446655), 'usdchf_log_return': np.float32(0.10691017), 'xagusd_log_return': np.float32(0.1275287), 'xtiusd_log_return': np.float32(0.10551714), 'synth_vix_zscore': np.float32(0.1080842)}
[2026-05-15 01:19:02,677 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:19:02,678 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.42962, 0.34995) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:02,810 INFO] src.backtester: Backtest [H1]: Sharpe=-1.341 | MaxDD=0.129 | WR=0.317 | Return=-5.3% | Trades=120
[2026-05-15 01:19:02,811 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:03,119 INFO] src.engine_xgb: XGB Train Acc: 0.6113 | Test Acc: 0.6113
[2026-05-15 01:19:03,120 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13716385), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12816852), 'atr_normalized': np.float32(0.1199376), 'prev_log_return': np.float32(0.12083179), 'usdchf_log_return': np.float32(0.12454318), 'xagusd_log_return': np.float32(0.12338116), 'xtiusd_log_return': np.float32(0.11633642), 'synth_vix_zscore': np.float32(0.1296375)}
[2026-05-15 01:19:03,120 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:19:03,400 INFO] src.engine_xgb: XGB Train Acc: 0.5474 | Test Acc: 0.5474
[2026-05-15 01:19:03,400 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.095642276), 'gmm_vol_cluster': np.float32(0.13451521), 'rsi_slope': np.float32(0.11837957), 'atr_normalized': np.float32(0.101485364), 'prev_log_return': np.float32(0.10857121), 'usdchf_log_return': np.float32(0.112010874), 'xagusd_log_return': np.float32(0.11520349), 'xtiusd_log_return': np.float32(0.11114323), 'synth_vix_zscore': np.float32(0.103048764)}
[2026-05-15 01:19:03,401 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:19:03,696 INFO] src.engine_xgb: XGB Train Acc: 0.5610 | Test Acc: 0.5610
[2026-05-15 01:19:03,697 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13980378), 'gmm_vol_cluster': np.float32(0.08568993), 'rsi_slope': np.float32(0.10617183), 'atr_normalized': np.float32(0.109131835), 'prev_log_return': np.float32(0.11512316), 'usdchf_log_return': np.float32(0.1063491), 'xagusd_log_return': np.float32(0.11331954), 'xtiusd_log_return': np.float32(0.10866207), 'synth_vix_zscore': np.float32(0.115748726)}
[2026-05-15 01:19:03,698 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:19:03,700 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47849, 0.22854) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:03,818 INFO] src.backtester: Backtest [H1]: Sharpe=-1.473 | MaxDD=0.078 | WR=0.330 | Return=-4.4% | Trades=103
[2026-05-15 01:19:03,819 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:04,191 INFO] src.engine_xgb: XGB Train Acc: 0.5420 | Test Acc: 0.5420
[2026-05-15 01:19:04,194 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.118024595), 'gmm_vol_cluster': np.float32(0.12944192), 'rsi_slope': np.float32(0.10228411), 'atr_normalized': np.float32(0.10302249), 'prev_log_return': np.float32(0.10216247), 'usdchf_log_return': np.float32(0.11600285), 'xagusd_log_return': np.float32(0.1115308), 'xtiusd_log_return': np.float32(0.106939875), 'synth_vix_zscore': np.float32(0.11059088)}
[2026-05-15 01:19:04,194 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:19:04,590 INFO] src.engine_xgb: XGB Train Acc: 0.5574 | Test Acc: 0.5574
[2026-05-15 01:19:04,590 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.101236634), 'gmm_vol_cluster': np.float32(0.11081444), 'rsi_slope': np.float32(0.116143115), 'atr_normalized': np.float32(0.12086062), 'prev_log_return': np.float32(0.11252812), 'usdchf_log_return': np.float32(0.11478529), 'xagusd_log_return': np.float32(0.10721483), 'xtiusd_log_return': np.float32(0.10692884), 'synth_vix_zscore': np.float32(0.109488085)}
[2026-05-15 01:19:04,591 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:19:04,986 INFO] src.engine_xgb: XGB Train Acc: 0.5662 | Test Acc: 0.5662
[2026-05-15 01:19:04,986 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10235093), 'gmm_vol_cluster': np.float32(0.09968252), 'rsi_slope': np.float32(0.11105958), 'atr_normalized': np.float32(0.112094365), 'prev_log_return': np.float32(0.123068504), 'usdchf_log_return': np.float32(0.1098826), 'xagusd_log_return': np.float32(0.112762675), 'xtiusd_log_return': np.float32(0.11132741), 'synth_vix_zscore': np.float32(0.11777143)}
[2026-05-15 01:19:04,987 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:19:04,988 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.64128, 0.06038) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:05,100 INFO] src.backtester: Backtest [H1]: Sharpe=-5.524 | MaxDD=0.113 | WR=0.181 | Return=-10.1% | Trades=83
[2026-05-15 01:19:05,101 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:05,117 INFO] src.optimizer: WFO [H1] window start=34560: trades=83 sharpe=-5.524 cv_sharpe=-1.407 score=-0.500
[2026-05-15 01:19:06,961 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:19:06,961 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:19:06,962 INFO] src.engine_hmm: Bull 0.9764 0.0059 0.0000 0.0176
[2026-05-15 01:19:06,962 INFO] src.engine_hmm: Bear 0.0022 0.9712 0.0208 0.0058
[2026-05-15 01:19:06,963 INFO] src.engine_hmm: Chop_Low 0.0026 0.0125 0.9672 0.0177
[2026-05-15 01:19:06,963 INFO] src.engine_hmm: Chop_High 0.0078 0.0068 0.0144 0.9710
[2026-05-15 01:19:06,964 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:19:06,964 INFO] src.engine_hmm: Bull: return=1.472650, vol=1.200934, rsi_slope=-0.026886
[2026-05-15 01:19:06,964 INFO] src.engine_hmm: Bear: return=-1.054093, vol=0.472307, rsi_slope=0.029848
[2026-05-15 01:19:06,965 INFO] src.engine_hmm: Chop_Low: return=-0.446445, vol=-0.644124, rsi_slope=0.020835
[2026-05-15 01:19:06,965 INFO] src.engine_hmm: Chop_High: return=0.433310, vol=-0.365535, rsi_slope=-0.027084
[2026-05-15 01:19:06,966 INFO] src.engine_hmm: Total regime transitions: 280
[2026-05-15 01:19:06,966 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-16 06:00:00: Bull -> Chop_High
[2026-05-15 01:19:06,967 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-17 04:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:06,968 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-18 19:00:00: Chop_Low -> Bear
[2026-05-15 01:19:06,968 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-22 04:00:00: Bear -> Chop_Low
[2026-05-15 01:19:06,969 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-23 21:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:06,970 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-25 10:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:06,970 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-28 10:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:06,971 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-28 16:00:00: Chop_High -> Bear
[2026-05-15 01:19:06,972 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-29 06:00:00: Bear -> Chop_High
[2026-05-15 01:19:06,972 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 22:00:00: Chop_High -> Bull
[2026-05-15 01:19:07,012 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:19:07,033 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:19:07,274 INFO] src.engine_xgb: XGB Train Acc: 0.6883 | Test Acc: 0.6883
[2026-05-15 01:19:07,275 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.105682634), 'gmm_vol_cluster': np.float32(0.09002738), 'rsi_slope': np.float32(0.11106454), 'atr_normalized': np.float32(0.110708944), 'prev_log_return': np.float32(0.11215388), 'usdchf_log_return': np.float32(0.12310271), 'xagusd_log_return': np.float32(0.11160484), 'xtiusd_log_return': np.float32(0.12046105), 'synth_vix_zscore': np.float32(0.115193956)}
[2026-05-15 01:19:07,275 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:19:07,520 INFO] src.engine_xgb: XGB Train Acc: 0.6241 | Test Acc: 0.6241
[2026-05-15 01:19:07,520 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.094716474), 'gmm_vol_cluster': np.float32(0.14079279), 'rsi_slope': np.float32(0.11079593), 'atr_normalized': np.float32(0.113035776), 'prev_log_return': np.float32(0.106521755), 'usdchf_log_return': np.float32(0.10588202), 'xagusd_log_return': np.float32(0.11258735), 'xtiusd_log_return': np.float32(0.11724782), 'synth_vix_zscore': np.float32(0.09842007)}
[2026-05-15 01:19:07,521 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:19:07,824 INFO] src.engine_xgb: XGB Train Acc: 0.6870 | Test Acc: 0.6870
[2026-05-15 01:19:07,825 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10880144), 'gmm_vol_cluster': np.float32(0.11336026), 'rsi_slope': np.float32(0.11771001), 'atr_normalized': np.float32(0.10491146), 'prev_log_return': np.float32(0.11154435), 'usdchf_log_return': np.float32(0.112828225), 'xagusd_log_return': np.float32(0.11639024), 'xtiusd_log_return': np.float32(0.104719676), 'synth_vix_zscore': np.float32(0.10973433)}
[2026-05-15 01:19:07,826 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:19:07,827 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.13686, 0.71017) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:07,957 INFO] src.backtester: Backtest [H1]: Sharpe=-3.993 | MaxDD=0.108 | WR=0.218 | Return=-10.0% | Trades=101
[2026-05-15 01:19:07,958 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:08,264 INFO] src.engine_xgb: XGB Train Acc: 0.5565 | Test Acc: 0.5565
[2026-05-15 01:19:08,264 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12694609), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12616257), 'atr_normalized': np.float32(0.11942804), 'prev_log_return': np.float32(0.1269433), 'usdchf_log_return': np.float32(0.11534617), 'xagusd_log_return': np.float32(0.13148679), 'xtiusd_log_return': np.float32(0.1287729), 'synth_vix_zscore': np.float32(0.12491411)}
[2026-05-15 01:19:08,265 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:19:08,524 INFO] src.engine_xgb: XGB Train Acc: 0.6189 | Test Acc: 0.6189
[2026-05-15 01:19:08,524 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09239179), 'gmm_vol_cluster': np.float32(0.13120364), 'rsi_slope': np.float32(0.1080775), 'atr_normalized': np.float32(0.10665747), 'prev_log_return': np.float32(0.1105765), 'usdchf_log_return': np.float32(0.115919866), 'xagusd_log_return': np.float32(0.1097156), 'xtiusd_log_return': np.float32(0.11617058), 'synth_vix_zscore': np.float32(0.10928711)}
[2026-05-15 01:19:08,525 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:19:08,829 INFO] src.engine_xgb: XGB Train Acc: 0.5584 | Test Acc: 0.5584
[2026-05-15 01:19:08,830 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11347634), 'gmm_vol_cluster': np.float32(0.10418333), 'rsi_slope': np.float32(0.11076794), 'atr_normalized': np.float32(0.11484246), 'prev_log_return': np.float32(0.11787945), 'usdchf_log_return': np.float32(0.103983805), 'xagusd_log_return': np.float32(0.10656147), 'xtiusd_log_return': np.float32(0.11396938), 'synth_vix_zscore': np.float32(0.11433578)}
[2026-05-15 01:19:08,830 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:19:08,832 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.51565, 0.29314) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:08,969 INFO] src.backtester: Backtest [H1]: Sharpe=-4.165 | MaxDD=0.144 | WR=0.291 | Return=-12.9% | Trades=110
[2026-05-15 01:19:08,970 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:09,295 INFO] src.engine_xgb: XGB Train Acc: 0.5441 | Test Acc: 0.5441
[2026-05-15 01:19:09,295 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12649317), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.120441526), 'atr_normalized': np.float32(0.12814915), 'prev_log_return': np.float32(0.123158254), 'usdchf_log_return': np.float32(0.12372999), 'xagusd_log_return': np.float32(0.1288798), 'xtiusd_log_return': np.float32(0.12917611), 'synth_vix_zscore': np.float32(0.119971976)}
[2026-05-15 01:19:09,296 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:19:09,624 INFO] src.engine_xgb: XGB Train Acc: 0.5803 | Test Acc: 0.5803
[2026-05-15 01:19:09,624 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.093281776), 'gmm_vol_cluster': np.float32(0.1364649), 'rsi_slope': np.float32(0.10829944), 'atr_normalized': np.float32(0.10341809), 'prev_log_return': np.float32(0.112460375), 'usdchf_log_return': np.float32(0.11722878), 'xagusd_log_return': np.float32(0.10829402), 'xtiusd_log_return': np.float32(0.11359065), 'synth_vix_zscore': np.float32(0.10696194)}
[2026-05-15 01:19:09,625 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:19:09,975 INFO] src.engine_xgb: XGB Train Acc: 0.5927 | Test Acc: 0.5927
[2026-05-15 01:19:09,975 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11572437), 'gmm_vol_cluster': np.float32(0.10991225), 'rsi_slope': np.float32(0.11519488), 'atr_normalized': np.float32(0.11992427), 'prev_log_return': np.float32(0.10649362), 'usdchf_log_return': np.float32(0.11214117), 'xagusd_log_return': np.float32(0.101932414), 'xtiusd_log_return': np.float32(0.110436164), 'synth_vix_zscore': np.float32(0.108240835)}
[2026-05-15 01:19:09,976 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:19:09,977 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.46960, 0.34543) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:10,085 INFO] src.backtester: Backtest [H1]: Sharpe=-5.396 | MaxDD=0.122 | WR=0.267 | Return=-11.5% | Trades=86
[2026-05-15 01:19:10,085 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:10,101 INFO] src.optimizer: WFO [H1] window start=38880: trades=86 sharpe=-5.396 cv_sharpe=-4.079 score=-0.500
[2026-05-15 01:19:12,957 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:19:12,957 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:19:12,958 INFO] src.engine_hmm: Bull 0.9770 0.0000 0.0178 0.0053
[2026-05-15 01:19:12,958 INFO] src.engine_hmm: Bear 0.0000 0.9674 0.0251 0.0075
[2026-05-15 01:19:12,959 INFO] src.engine_hmm: Chop_Low 0.0156 0.0174 0.9635 0.0035
[2026-05-15 01:19:12,959 INFO] src.engine_hmm: Chop_High 0.0106 0.0180 0.0008 0.9705
[2026-05-15 01:19:12,960 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:19:12,960 INFO] src.engine_hmm: Bull: return=1.034993, vol=-0.080433, rsi_slope=-0.032354
[2026-05-15 01:19:12,960 INFO] src.engine_hmm: Bear: return=-0.746333, vol=-0.233708, rsi_slope=0.043696
[2026-05-15 01:19:12,961 INFO] src.engine_hmm: Chop_Low: return=0.032918, vol=-0.508745, rsi_slope=-0.000443
[2026-05-15 01:19:12,961 INFO] src.engine_hmm: Chop_High: return=-0.718210, vol=1.587637, rsi_slope=-0.012795
[2026-05-15 01:19:12,962 INFO] src.engine_hmm: Total regime transitions: 303
[2026-05-15 01:19:12,963 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-21 20:00:00: Bear -> Chop_Low
[2026-05-15 01:19:12,963 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-23 16:00:00: Chop_Low -> Bull
[2026-05-15 01:19:12,963 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-24 14:00:00: Bull -> Chop_Low
[2026-05-15 01:19:12,964 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-29 17:00:00: Chop_Low -> Bull
[2026-05-15 01:19:12,964 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-31 12:00:00: Bull -> Chop_Low
[2026-05-15 01:19:12,965 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-05 11:00:00: Chop_Low -> Bear
[2026-05-15 01:19:12,965 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-08 03:00:00: Bear -> Chop_Low
[2026-05-15 01:19:12,965 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-08 18:00:00: Chop_Low -> Bear
[2026-05-15 01:19:12,965 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-11 05:00:00: Bear -> Chop_Low
[2026-05-15 01:19:12,966 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-12 10:00:00: Chop_Low -> Bear
[2026-05-15 01:19:13,001 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:19:13,023 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:19:13,286 INFO] src.engine_xgb: XGB Train Acc: 0.6245 | Test Acc: 0.6245
[2026-05-15 01:19:13,286 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11153107), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12969965), 'atr_normalized': np.float32(0.12178465), 'prev_log_return': np.float32(0.13050878), 'usdchf_log_return': np.float32(0.12959129), 'xagusd_log_return': np.float32(0.119264275), 'xtiusd_log_return': np.float32(0.13159582), 'synth_vix_zscore': np.float32(0.12602445)}
[2026-05-15 01:19:13,287 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:19:13,503 INFO] src.engine_xgb: XGB Train Acc: 0.7026 | Test Acc: 0.7026
[2026-05-15 01:19:13,503 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.108280614), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12335873), 'atr_normalized': np.float32(0.12583), 'prev_log_return': np.float32(0.11634723), 'usdchf_log_return': np.float32(0.12793745), 'xagusd_log_return': np.float32(0.12695912), 'xtiusd_log_return': np.float32(0.12733692), 'synth_vix_zscore': np.float32(0.14394997)}
[2026-05-15 01:19:13,504 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:19:13,754 INFO] src.engine_xgb: XGB Train Acc: 0.6626 | Test Acc: 0.6626
[2026-05-15 01:19:13,755 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09097361), 'gmm_vol_cluster': np.float32(0.10039905), 'rsi_slope': np.float32(0.104876705), 'atr_normalized': np.float32(0.10806056), 'prev_log_return': np.float32(0.110326566), 'usdchf_log_return': np.float32(0.12331829), 'xagusd_log_return': np.float32(0.11236716), 'xtiusd_log_return': np.float32(0.13451901), 'synth_vix_zscore': np.float32(0.11515905)}
[2026-05-15 01:19:13,755 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:19:13,757 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.73608, -0.15122) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:13,889 INFO] src.backtester: Backtest [H1]: Sharpe=-3.673 | MaxDD=0.139 | WR=0.209 | Return=-12.4% | Trades=110
[2026-05-15 01:19:13,890 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:14,190 INFO] src.engine_xgb: XGB Train Acc: 0.5956 | Test Acc: 0.5956
[2026-05-15 01:19:14,191 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12718762), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.122869276), 'atr_normalized': np.float32(0.11718831), 'prev_log_return': np.float32(0.1254399), 'usdchf_log_return': np.float32(0.11653047), 'xagusd_log_return': np.float32(0.12484068), 'xtiusd_log_return': np.float32(0.13551137), 'synth_vix_zscore': np.float32(0.13043237)}
[2026-05-15 01:19:14,192 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:19:14,410 INFO] src.engine_xgb: XGB Train Acc: 0.5965 | Test Acc: 0.5965
[2026-05-15 01:19:14,411 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.121703975), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12974785), 'atr_normalized': np.float32(0.11619237), 'prev_log_return': np.float32(0.12549236), 'usdchf_log_return': np.float32(0.13244472), 'xagusd_log_return': np.float32(0.12234319), 'xtiusd_log_return': np.float32(0.120104246), 'synth_vix_zscore': np.float32(0.13197124)}
[2026-05-15 01:19:14,411 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:19:14,696 INFO] src.engine_xgb: XGB Train Acc: 0.6464 | Test Acc: 0.6464
[2026-05-15 01:19:14,697 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1271605), 'gmm_vol_cluster': np.float32(0.08660036), 'rsi_slope': np.float32(0.11609154), 'atr_normalized': np.float32(0.11927036), 'prev_log_return': np.float32(0.10921952), 'usdchf_log_return': np.float32(0.11668487), 'xagusd_log_return': np.float32(0.114832826), 'xtiusd_log_return': np.float32(0.10524218), 'synth_vix_zscore': np.float32(0.10489785)}
[2026-05-15 01:19:14,698 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:19:14,699 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53526, 0.16378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:14,808 INFO] src.backtester: Backtest [H1]: Sharpe=-1.033 | MaxDD=0.040 | WR=0.308 | Return=-2.7% | Trades=78
[2026-05-15 01:19:14,808 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:15,103 INFO] src.engine_xgb: XGB Train Acc: 0.6396 | Test Acc: 0.6396
[2026-05-15 01:19:15,103 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12334618), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11990919), 'atr_normalized': np.float32(0.13043511), 'prev_log_return': np.float32(0.12608175), 'usdchf_log_return': np.float32(0.12706178), 'xagusd_log_return': np.float32(0.11885998), 'xtiusd_log_return': np.float32(0.12913387), 'synth_vix_zscore': np.float32(0.12517212)}
[2026-05-15 01:19:15,104 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:19:15,368 INFO] src.engine_xgb: XGB Train Acc: 0.5976 | Test Acc: 0.5976
[2026-05-15 01:19:15,369 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13029408), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11975871), 'atr_normalized': np.float32(0.12469028), 'prev_log_return': np.float32(0.12358971), 'usdchf_log_return': np.float32(0.12596361), 'xagusd_log_return': np.float32(0.122866996), 'xtiusd_log_return': np.float32(0.121368386), 'synth_vix_zscore': np.float32(0.13146819)}
[2026-05-15 01:19:15,369 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:19:15,710 INFO] src.engine_xgb: XGB Train Acc: 0.6414 | Test Acc: 0.6414
[2026-05-15 01:19:15,710 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11436325), 'gmm_vol_cluster': np.float32(0.11248616), 'rsi_slope': np.float32(0.11589829), 'atr_normalized': np.float32(0.11785749), 'prev_log_return': np.float32(0.10400695), 'usdchf_log_return': np.float32(0.108489215), 'xagusd_log_return': np.float32(0.11190003), 'xtiusd_log_return': np.float32(0.10881005), 'synth_vix_zscore': np.float32(0.10618851)}
[2026-05-15 01:19:15,711 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:19:15,712 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.43440, 0.22813) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:15,817 INFO] src.backtester: Backtest [H1]: Sharpe=-0.648 | MaxDD=0.085 | WR=0.263 | Return=-2.1% | Trades=57
[2026-05-15 01:19:15,817 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:15,833 INFO] src.optimizer: WFO [H1] window start=43200: trades=57 sharpe=-0.648 cv_sharpe=-2.353 score=-0.321
[2026-05-15 01:19:15,834 INFO] src.optimizer: WFO [H1]: 8/8 valid | median_trades=64 | score=-0.569 | std_sharpe=2.017 | WFE=1.21 | window_scores=[0.155, -0.5, -1.0, -0.492, -1.0, -0.5, -0.5, -0.321]
[2026-05-15 01:19:15,884 INFO] src.optimizer: Trial 29 [H1/headway_cent $15 standard]: score=-1.077 | valid=8/8 | std_sharpe=2.017 | median_trades=64 | WFE=1.21 | scores=[0.155, -0.5, -1.0, -0.492, -1.0, -0.5, -0.5, -0.321]
[ 30/200] Best Score: -0.320 | ETA: 1h 37m RAM: 62%
Best trial: 23. Best value: -0.320363: 15%|██████████▏ | 30/200 [17:15<1:51:17, 39.28s/it][2026-05-15 01:19:18,958 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:19:18,958 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:19:18,959 INFO] src.engine_hmm: Bull 0.9685 0.0130 0.0108 0.0078
[2026-05-15 01:19:18,959 INFO] src.engine_hmm: Bear 0.0085 0.9630 0.0000 0.0285
[2026-05-15 01:19:18,960 INFO] src.engine_hmm: Chop_Low 0.0075 0.0000 0.9706 0.0219
[2026-05-15 01:19:18,960 INFO] src.engine_hmm: Chop_High 0.0070 0.0130 0.0305 0.9495
[2026-05-15 01:19:18,961 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:19:18,961 INFO] src.engine_hmm: Bull: return=1.197664, vol=0.920208, rsi_slope=-0.031256
[2026-05-15 01:19:18,961 INFO] src.engine_hmm: Bear: return=-1.212916, vol=1.011758, rsi_slope=0.038580
[2026-05-15 01:19:18,962 INFO] src.engine_hmm: Chop_Low: return=0.242415, vol=-0.709308, rsi_slope=-0.014072
[2026-05-15 01:19:18,962 INFO] src.engine_hmm: Chop_High: return=-0.421524, vol=-0.319699, rsi_slope=0.016886
[2026-05-15 01:19:18,963 INFO] src.engine_hmm: Total regime transitions: 365
[2026-05-15 01:19:18,963 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-25 13:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:18,964 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-29 08:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:18,964 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-02 08:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:18,965 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-03 15:00:00: Chop_High -> Bull
[2026-05-15 01:19:18,965 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-04 16:00:00: Bull -> Chop_Low
[2026-05-15 01:19:18,966 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-06 04:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:18,966 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-06 09:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:18,967 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-10 11:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:18,968 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-10 14:00:00: Chop_High -> Bear
[2026-05-15 01:19:18,969 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-11 10:00:00: Bear -> Chop_High
[2026-05-15 01:19:19,006 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:19:19,022 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:19:19,233 INFO] src.engine_xgb: XGB Train Acc: 0.7333 | Test Acc: 0.7333
[2026-05-15 01:19:19,234 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11257681), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.115039036), 'atr_normalized': np.float32(0.12761176), 'prev_log_return': np.float32(0.13195083), 'usdchf_log_return': np.float32(0.12694183), 'xagusd_log_return': np.float32(0.12585238), 'xtiusd_log_return': np.float32(0.13264757), 'synth_vix_zscore': np.float32(0.12737982)}
[2026-05-15 01:19:19,234 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:19:19,437 INFO] src.engine_xgb: XGB Train Acc: 0.7529 | Test Acc: 0.7529
[2026-05-15 01:19:19,438 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10495802), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15794599), 'atr_normalized': np.float32(0.09882514), 'prev_log_return': np.float32(0.12128006), 'usdchf_log_return': np.float32(0.1257489), 'xagusd_log_return': np.float32(0.11677032), 'xtiusd_log_return': np.float32(0.12515222), 'synth_vix_zscore': np.float32(0.14931937)}
[2026-05-15 01:19:19,438 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:19:19,644 INFO] src.engine_xgb: XGB Train Acc: 0.7795 | Test Acc: 0.7795
[2026-05-15 01:19:19,644 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.117009506), 'gmm_vol_cluster': np.float32(0.079683), 'rsi_slope': np.float32(0.12708052), 'atr_normalized': np.float32(0.11413404), 'prev_log_return': np.float32(0.108694755), 'usdchf_log_return': np.float32(0.10173751), 'xagusd_log_return': np.float32(0.11648103), 'xtiusd_log_return': np.float32(0.123805806), 'synth_vix_zscore': np.float32(0.11137379)}
[2026-05-15 01:19:19,645 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:19:19,646 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.38336, 0.21891) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:19,736 INFO] src.backtester: Backtest [H1]: Sharpe=-3.915 | MaxDD=0.101 | WR=0.201 | Return=-8.7% | Trades=134
[2026-05-15 01:19:19,736 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:19,954 INFO] src.engine_xgb: XGB Train Acc: 0.7212 | Test Acc: 0.7212
[2026-05-15 01:19:19,955 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12191424), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.118936814), 'atr_normalized': np.float32(0.13025157), 'prev_log_return': np.float32(0.13296217), 'usdchf_log_return': np.float32(0.12348327), 'xagusd_log_return': np.float32(0.12126968), 'xtiusd_log_return': np.float32(0.13294457), 'synth_vix_zscore': np.float32(0.11823771)}
[2026-05-15 01:19:19,955 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:19:20,216 INFO] src.engine_xgb: XGB Train Acc: 0.7211 | Test Acc: 0.7211
[2026-05-15 01:19:20,217 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.120907135), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13468255), 'atr_normalized': np.float32(0.114568286), 'prev_log_return': np.float32(0.12648529), 'usdchf_log_return': np.float32(0.1220974), 'xagusd_log_return': np.float32(0.131049), 'xtiusd_log_return': np.float32(0.11892775), 'synth_vix_zscore': np.float32(0.13128252)}
[2026-05-15 01:19:20,217 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:19:20,437 INFO] src.engine_xgb: XGB Train Acc: 0.7724 | Test Acc: 0.7724
[2026-05-15 01:19:20,437 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1014953), 'gmm_vol_cluster': np.float32(0.12800896), 'rsi_slope': np.float32(0.12061284), 'atr_normalized': np.float32(0.10434636), 'prev_log_return': np.float32(0.10820572), 'usdchf_log_return': np.float32(0.10448794), 'xagusd_log_return': np.float32(0.11088285), 'xtiusd_log_return': np.float32(0.11662155), 'synth_vix_zscore': np.float32(0.1053385)}
[2026-05-15 01:19:20,438 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:19:20,439 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53107, 0.07740) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:20,563 INFO] src.backtester: Backtest [H1]: Sharpe=-1.558 | MaxDD=0.072 | WR=0.280 | Return=-4.6% | Trades=100
[2026-05-15 01:19:20,564 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:20,837 INFO] src.engine_xgb: XGB Train Acc: 0.6659 | Test Acc: 0.6659
[2026-05-15 01:19:20,838 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12978308), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12167463), 'atr_normalized': np.float32(0.12234386), 'prev_log_return': np.float32(0.12704308), 'usdchf_log_return': np.float32(0.11616235), 'xagusd_log_return': np.float32(0.12756923), 'xtiusd_log_return': np.float32(0.13376544), 'synth_vix_zscore': np.float32(0.12165837)}
[2026-05-15 01:19:20,838 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:19:21,111 INFO] src.engine_xgb: XGB Train Acc: 0.7398 | Test Acc: 0.7398
[2026-05-15 01:19:21,112 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11458553), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13630481), 'atr_normalized': np.float32(0.11066812), 'prev_log_return': np.float32(0.12445639), 'usdchf_log_return': np.float32(0.12419055), 'xagusd_log_return': np.float32(0.12233671), 'xtiusd_log_return': np.float32(0.13241382), 'synth_vix_zscore': np.float32(0.13504404)}
[2026-05-15 01:19:21,112 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:19:21,397 INFO] src.engine_xgb: XGB Train Acc: 0.6605 | Test Acc: 0.6605
[2026-05-15 01:19:21,397 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11485057), 'gmm_vol_cluster': np.float32(0.09482281), 'rsi_slope': np.float32(0.12858422), 'atr_normalized': np.float32(0.106510416), 'prev_log_return': np.float32(0.10743711), 'usdchf_log_return': np.float32(0.107598566), 'xagusd_log_return': np.float32(0.10956405), 'xtiusd_log_return': np.float32(0.111200616), 'synth_vix_zscore': np.float32(0.11943161)}
[2026-05-15 01:19:21,397 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:19:21,399 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.38300, 0.44275) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:21,493 INFO] src.backtester: Backtest [H1]: Sharpe=-0.012 | MaxDD=0.069 | WR=0.354 | Return=-0.1% | Trades=82
[2026-05-15 01:19:21,494 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:21,506 INFO] src.optimizer: WFO [H1] window start=12960: trades=82 sharpe=-0.012 cv_sharpe=-2.737 score=-0.009
[2026-05-15 01:19:23,665 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:19:23,666 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:19:23,666 INFO] src.engine_hmm: Bull 0.9677 0.0010 0.0234 0.0080
[2026-05-15 01:19:23,667 INFO] src.engine_hmm: Bear 0.0031 0.9799 0.0171 0.0000
[2026-05-15 01:19:23,667 INFO] src.engine_hmm: Chop_Low 0.0162 0.0186 0.9631 0.0020
[2026-05-15 01:19:23,667 INFO] src.engine_hmm: Chop_High 0.0266 0.0000 0.0012 0.9722
[2026-05-15 01:19:23,668 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:19:23,668 INFO] src.engine_hmm: Bull: return=0.033292, vol=0.414057, rsi_slope=-0.021416
[2026-05-15 01:19:23,669 INFO] src.engine_hmm: Bear: return=-0.045551, vol=-0.777775, rsi_slope=0.005105
[2026-05-15 01:19:23,669 INFO] src.engine_hmm: Chop_Low: return=0.015442, vol=-0.292072, rsi_slope=0.017080
[2026-05-15 01:19:23,669 INFO] src.engine_hmm: Chop_High: return=0.001969, vol=2.193069, rsi_slope=-0.011703
[2026-05-15 01:19:23,670 INFO] src.engine_hmm: Total regime transitions: 294
[2026-05-15 01:19:23,670 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-20 20:00:00: Bear -> Bull
[2026-05-15 01:19:23,671 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-21 18:00:00: Bull -> Chop_Low
[2026-05-15 01:19:23,671 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-22 14:00:00: Chop_Low -> Bear
[2026-05-15 01:19:23,672 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-28 14:00:00: Bear -> Chop_Low
[2026-05-15 01:19:23,672 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-01 12:00:00: Chop_Low -> Bear
[2026-05-15 01:19:23,673 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-01 18:00:00: Bear -> Chop_Low
[2026-05-15 01:19:23,673 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-02 12:00:00: Chop_Low -> Bear
[2026-05-15 01:19:23,674 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-04 17:00:00: Bear -> Chop_Low
[2026-05-15 01:19:23,674 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-05 13:00:00: Chop_Low -> Bear
[2026-05-15 01:19:23,674 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-11 15:00:00: Bear -> Chop_Low
[2026-05-15 01:19:23,706 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:19:23,724 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:19:23,944 INFO] src.engine_xgb: XGB Train Acc: 0.7887 | Test Acc: 0.7887
[2026-05-15 01:19:23,945 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14471412), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12025073), 'atr_normalized': np.float32(0.11923473), 'prev_log_return': np.float32(0.11751046), 'usdchf_log_return': np.float32(0.12521471), 'xagusd_log_return': np.float32(0.11434922), 'xtiusd_log_return': np.float32(0.1299733), 'synth_vix_zscore': np.float32(0.12875278)}
[2026-05-15 01:19:23,946 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:19:24,133 INFO] src.engine_xgb: XGB Train Acc: 0.7592 | Test Acc: 0.7592
[2026-05-15 01:19:24,134 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10107379), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11894035), 'atr_normalized': np.float32(0.13367409), 'prev_log_return': np.float32(0.12137895), 'usdchf_log_return': np.float32(0.13343917), 'xagusd_log_return': np.float32(0.1230649), 'xtiusd_log_return': np.float32(0.14148296), 'synth_vix_zscore': np.float32(0.12694584)}
[2026-05-15 01:19:24,134 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:19:24,311 INFO] src.engine_xgb: XGB Train Acc: 0.7104 | Test Acc: 0.7104
[2026-05-15 01:19:24,312 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10025522), 'gmm_vol_cluster': np.float32(0.09582908), 'rsi_slope': np.float32(0.1294172), 'atr_normalized': np.float32(0.10234591), 'prev_log_return': np.float32(0.11506062), 'usdchf_log_return': np.float32(0.11250464), 'xagusd_log_return': np.float32(0.11274764), 'xtiusd_log_return': np.float32(0.12436164), 'synth_vix_zscore': np.float32(0.107477985)}
[2026-05-15 01:19:24,312 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:19:24,314 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.50441, -0.08685) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:24,408 INFO] src.backtester: Backtest [H1]: Sharpe=-1.815 | MaxDD=0.159 | WR=0.231 | Return=-8.5% | Trades=121
[2026-05-15 01:19:24,408 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:24,662 INFO] src.engine_xgb: XGB Train Acc: 0.7827 | Test Acc: 0.7827
[2026-05-15 01:19:24,662 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12587401), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12704276), 'atr_normalized': np.float32(0.12254833), 'prev_log_return': np.float32(0.11895558), 'usdchf_log_return': np.float32(0.12029543), 'xagusd_log_return': np.float32(0.12874985), 'xtiusd_log_return': np.float32(0.114865005), 'synth_vix_zscore': np.float32(0.14166906)}
[2026-05-15 01:19:24,663 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:19:24,910 INFO] src.engine_xgb: XGB Train Acc: 0.7377 | Test Acc: 0.7377
[2026-05-15 01:19:24,910 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12386682), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.122570366), 'atr_normalized': np.float32(0.12451095), 'prev_log_return': np.float32(0.12176111), 'usdchf_log_return': np.float32(0.13384241), 'xagusd_log_return': np.float32(0.1242128), 'xtiusd_log_return': np.float32(0.12564382), 'synth_vix_zscore': np.float32(0.1235917)}
[2026-05-15 01:19:24,911 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:19:25,156 INFO] src.engine_xgb: XGB Train Acc: 0.6834 | Test Acc: 0.6834
[2026-05-15 01:19:25,156 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09106821), 'gmm_vol_cluster': np.float32(0.08559321), 'rsi_slope': np.float32(0.13222554), 'atr_normalized': np.float32(0.10027269), 'prev_log_return': np.float32(0.110598706), 'usdchf_log_return': np.float32(0.11756154), 'xagusd_log_return': np.float32(0.13006024), 'xtiusd_log_return': np.float32(0.11947012), 'synth_vix_zscore': np.float32(0.11314976)}
[2026-05-15 01:19:25,157 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:19:25,158 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.49357, -0.10582) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:25,288 INFO] src.backtester: Backtest [H1]: Sharpe=-4.772 | MaxDD=0.213 | WR=0.252 | Return=-18.4% | Trades=103
[2026-05-15 01:19:25,289 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:25,571 INFO] src.engine_xgb: XGB Train Acc: 0.7665 | Test Acc: 0.7665
[2026-05-15 01:19:25,572 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14962852), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.120240495), 'atr_normalized': np.float32(0.12320699), 'prev_log_return': np.float32(0.1191492), 'usdchf_log_return': np.float32(0.11910865), 'xagusd_log_return': np.float32(0.12420287), 'xtiusd_log_return': np.float32(0.11920651), 'synth_vix_zscore': np.float32(0.1252567)}
[2026-05-15 01:19:25,572 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:19:25,857 INFO] src.engine_xgb: XGB Train Acc: 0.7522 | Test Acc: 0.7522
[2026-05-15 01:19:25,857 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10447839), 'gmm_vol_cluster': np.float32(0.10563179), 'rsi_slope': np.float32(0.12789181), 'atr_normalized': np.float32(0.1101305), 'prev_log_return': np.float32(0.10988584), 'usdchf_log_return': np.float32(0.1163099), 'xagusd_log_return': np.float32(0.11051896), 'xtiusd_log_return': np.float32(0.10433411), 'synth_vix_zscore': np.float32(0.11081866)}
[2026-05-15 01:19:25,858 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:19:26,141 INFO] src.engine_xgb: XGB Train Acc: 0.6931 | Test Acc: 0.6931
[2026-05-15 01:19:26,142 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.100655496), 'gmm_vol_cluster': np.float32(0.08525086), 'rsi_slope': np.float32(0.12724596), 'atr_normalized': np.float32(0.1068915), 'prev_log_return': np.float32(0.111350864), 'usdchf_log_return': np.float32(0.114600755), 'xagusd_log_return': np.float32(0.12666678), 'xtiusd_log_return': np.float32(0.116647445), 'synth_vix_zscore': np.float32(0.11069036)}
[2026-05-15 01:19:26,142 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:19:26,144 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.36542, 0.20284) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:26,253 INFO] src.backtester: Backtest [H1]: Sharpe=-1.672 | MaxDD=0.065 | WR=0.403 | Return=-3.9% | Trades=62
[2026-05-15 01:19:26,253 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:26,267 INFO] src.optimizer: WFO [H1] window start=17280: trades=62 sharpe=-1.672 cv_sharpe=-3.293 score=-0.500
[2026-05-15 01:19:27,085 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:19:27,085 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:19:27,086 INFO] src.engine_hmm: Bull 0.9682 0.0141 0.0177 0.0000
[2026-05-15 01:19:27,086 INFO] src.engine_hmm: Bear 0.0111 0.9583 0.0174 0.0132
[2026-05-15 01:19:27,087 INFO] src.engine_hmm: Chop_Low 0.0143 0.0130 0.9727 0.0000
[2026-05-15 01:19:27,087 INFO] src.engine_hmm: Chop_High 0.0000 0.0284 0.0000 0.9716
[2026-05-15 01:19:27,087 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:19:27,087 INFO] src.engine_hmm: Bull: return=0.758495, vol=-0.253968, rsi_slope=-0.011107
[2026-05-15 01:19:27,088 INFO] src.engine_hmm: Bear: return=-0.510290, vol=0.214287, rsi_slope=0.011527
[2026-05-15 01:19:27,088 INFO] src.engine_hmm: Chop_Low: return=-0.046224, vol=-0.698155, rsi_slope=-0.001797
[2026-05-15 01:19:27,088 INFO] src.engine_hmm: Chop_High: return=-0.240251, vol=1.850543, rsi_slope=0.001271
[2026-05-15 01:19:27,089 INFO] src.engine_hmm: Total regime transitions: 328
[2026-05-15 01:19:27,089 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-11 21:00:00: Chop_Low -> Bull
[2026-05-15 01:19:27,090 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 07:00:00: Bull -> Chop_Low
[2026-05-15 01:19:27,091 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 15:00:00: Chop_Low -> Bear
[2026-05-15 01:19:27,091 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-13 13:00:00: Bear -> Chop_Low
[2026-05-15 01:19:27,091 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-24 17:00:00: Chop_Low -> Bull
[2026-05-15 01:19:27,092 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-27 14:00:00: Bull -> Chop_Low
[2026-05-15 01:19:27,092 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-02 16:00:00: Chop_Low -> Bull
[2026-05-15 01:19:27,092 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 01:00:00: Bull -> Bear
[2026-05-15 01:19:27,093 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 02:00:00: Bear -> Chop_High
[2026-05-15 01:19:27,093 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 18:00:00: Chop_High -> Bear
[2026-05-15 01:19:27,127 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:19:27,143 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:19:27,354 INFO] src.engine_xgb: XGB Train Acc: 0.7741 | Test Acc: 0.7741
[2026-05-15 01:19:27,355 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12822847), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12007897), 'atr_normalized': np.float32(0.1219619), 'prev_log_return': np.float32(0.12187318), 'usdchf_log_return': np.float32(0.1302069), 'xagusd_log_return': np.float32(0.13651903), 'xtiusd_log_return': np.float32(0.1256622), 'synth_vix_zscore': np.float32(0.11546935)}
[2026-05-15 01:19:27,356 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:19:27,537 INFO] src.engine_xgb: XGB Train Acc: 0.8021 | Test Acc: 0.8021
[2026-05-15 01:19:27,537 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11000719), 'gmm_vol_cluster': np.float32(0.101640046), 'rsi_slope': np.float32(0.11581763), 'atr_normalized': np.float32(0.117325135), 'prev_log_return': np.float32(0.11130722), 'usdchf_log_return': np.float32(0.10696582), 'xagusd_log_return': np.float32(0.116077885), 'xtiusd_log_return': np.float32(0.10649885), 'synth_vix_zscore': np.float32(0.11436022)}
[2026-05-15 01:19:27,538 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:19:27,738 INFO] src.engine_xgb: XGB Train Acc: 0.7622 | Test Acc: 0.7622
[2026-05-15 01:19:27,739 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1031307), 'gmm_vol_cluster': np.float32(0.12716733), 'rsi_slope': np.float32(0.11403426), 'atr_normalized': np.float32(0.108017534), 'prev_log_return': np.float32(0.10247972), 'usdchf_log_return': np.float32(0.10835756), 'xagusd_log_return': np.float32(0.115112975), 'xtiusd_log_return': np.float32(0.11593239), 'synth_vix_zscore': np.float32(0.10576752)}
[2026-05-15 01:19:27,740 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:19:27,741 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.54544, 0.24324) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:27,864 INFO] src.backtester: Backtest [H1]: Sharpe=-1.932 | MaxDD=0.094 | WR=0.243 | Return=-7.2% | Trades=103
[2026-05-15 01:19:27,864 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:28,137 INFO] src.engine_xgb: XGB Train Acc: 0.7801 | Test Acc: 0.7801
[2026-05-15 01:19:28,138 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15376258), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12880012), 'atr_normalized': np.float32(0.11638861), 'prev_log_return': np.float32(0.11991067), 'usdchf_log_return': np.float32(0.12080774), 'xagusd_log_return': np.float32(0.12300816), 'xtiusd_log_return': np.float32(0.11872154), 'synth_vix_zscore': np.float32(0.118600614)}
[2026-05-15 01:19:28,139 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:19:28,387 INFO] src.engine_xgb: XGB Train Acc: 0.7821 | Test Acc: 0.7821
[2026-05-15 01:19:28,388 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08772209), 'gmm_vol_cluster': np.float32(0.13384247), 'rsi_slope': np.float32(0.11701447), 'atr_normalized': np.float32(0.10899465), 'prev_log_return': np.float32(0.10984978), 'usdchf_log_return': np.float32(0.113515), 'xagusd_log_return': np.float32(0.11331963), 'xtiusd_log_return': np.float32(0.10880513), 'synth_vix_zscore': np.float32(0.10693679)}
[2026-05-15 01:19:28,388 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:19:28,593 INFO] src.engine_xgb: XGB Train Acc: 0.7425 | Test Acc: 0.7425
[2026-05-15 01:19:28,594 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10015021), 'gmm_vol_cluster': np.float32(0.09425154), 'rsi_slope': np.float32(0.12299082), 'atr_normalized': np.float32(0.11100802), 'prev_log_return': np.float32(0.11210627), 'usdchf_log_return': np.float32(0.1130229), 'xagusd_log_return': np.float32(0.11304839), 'xtiusd_log_return': np.float32(0.11640924), 'synth_vix_zscore': np.float32(0.117012605)}
[2026-05-15 01:19:28,594 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:19:28,596 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.48586, 0.08539) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:28,723 INFO] src.backtester: Backtest [H1]: Sharpe=0.018 | MaxDD=0.085 | WR=0.267 | Return=0.1% | Trades=120
[2026-05-15 01:19:28,724 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:29,003 INFO] src.engine_xgb: XGB Train Acc: 0.7676 | Test Acc: 0.7676
[2026-05-15 01:19:29,005 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.116954125), 'gmm_vol_cluster': np.float32(0.07140905), 'rsi_slope': np.float32(0.122052684), 'atr_normalized': np.float32(0.11306297), 'prev_log_return': np.float32(0.11606598), 'usdchf_log_return': np.float32(0.11047123), 'xagusd_log_return': np.float32(0.123616174), 'xtiusd_log_return': np.float32(0.11743276), 'synth_vix_zscore': np.float32(0.10893512)}
[2026-05-15 01:19:29,005 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:19:29,304 INFO] src.engine_xgb: XGB Train Acc: 0.7574 | Test Acc: 0.7574
[2026-05-15 01:19:29,304 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11451679), 'gmm_vol_cluster': np.float32(0.11059106), 'rsi_slope': np.float32(0.11558472), 'atr_normalized': np.float32(0.107081994), 'prev_log_return': np.float32(0.10945315), 'usdchf_log_return': np.float32(0.11156428), 'xagusd_log_return': np.float32(0.118540525), 'xtiusd_log_return': np.float32(0.10387006), 'synth_vix_zscore': np.float32(0.108797416)}
[2026-05-15 01:19:29,305 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:19:29,577 INFO] src.engine_xgb: XGB Train Acc: 0.7465 | Test Acc: 0.7465
[2026-05-15 01:19:29,578 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1161619), 'gmm_vol_cluster': np.float32(0.10004057), 'rsi_slope': np.float32(0.119967066), 'atr_normalized': np.float32(0.11574111), 'prev_log_return': np.float32(0.102870315), 'usdchf_log_return': np.float32(0.1083439), 'xagusd_log_return': np.float32(0.11858185), 'xtiusd_log_return': np.float32(0.10876452), 'synth_vix_zscore': np.float32(0.10952875)}
[2026-05-15 01:19:29,578 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:19:29,580 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.51495, -0.03378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:29,683 INFO] src.backtester: Backtest [H1]: Sharpe=-4.297 | MaxDD=0.126 | WR=0.203 | Return=-11.5% | Trades=69
[2026-05-15 01:19:29,684 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:29,699 INFO] src.optimizer: WFO [H1] window start=21600: trades=69 sharpe=-4.297 cv_sharpe=-0.957 score=-1.000
[2026-05-15 01:19:30,978 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:19:30,979 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:19:30,980 INFO] src.engine_hmm: Bull 0.9606 0.0073 0.0241 0.0080
[2026-05-15 01:19:30,980 INFO] src.engine_hmm: Bear 0.0000 0.9523 0.0000 0.0477
[2026-05-15 01:19:30,981 INFO] src.engine_hmm: Chop_Low 0.0133 0.0094 0.9679 0.0094
[2026-05-15 01:19:30,981 INFO] src.engine_hmm: Chop_High 0.0125 0.0078 0.0266 0.9531
[2026-05-15 01:19:30,981 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:19:30,982 INFO] src.engine_hmm: Bull: return=0.990741, vol=-0.185647, rsi_slope=-0.019873
[2026-05-15 01:19:30,982 INFO] src.engine_hmm: Bear: return=-0.771674, vol=1.611812, rsi_slope=-0.017524
[2026-05-15 01:19:30,983 INFO] src.engine_hmm: Chop_Low: return=0.029038, vol=-0.695995, rsi_slope=-0.002048
[2026-05-15 01:19:30,983 INFO] src.engine_hmm: Chop_High: return=-0.388202, vol=0.229138, rsi_slope=0.028455
[2026-05-15 01:19:30,984 INFO] src.engine_hmm: Total regime transitions: 400
[2026-05-15 01:19:30,984 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-07 16:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:30,985 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-08 12:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:30,985 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 12:00:00: Chop_High -> Bull
[2026-05-15 01:19:30,986 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 22:00:00: Bull -> Chop_High
[2026-05-15 01:19:30,986 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-14 16:00:00: Chop_High -> Bull
[2026-05-15 01:19:30,987 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-15 17:00:00: Bull -> Chop_High
[2026-05-15 01:19:30,988 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-16 13:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:30,988 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-17 04:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:30,989 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-18 03:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:30,989 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-21 11:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:31,029 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:19:31,048 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:19:31,213 INFO] src.engine_xgb: XGB Train Acc: 0.7448 | Test Acc: 0.7448
[2026-05-15 01:19:31,213 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13901976), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12459672), 'atr_normalized': np.float32(0.11879466), 'prev_log_return': np.float32(0.12671313), 'usdchf_log_return': np.float32(0.12309089), 'xagusd_log_return': np.float32(0.12094666), 'xtiusd_log_return': np.float32(0.12708266), 'synth_vix_zscore': np.float32(0.11975552)}
[2026-05-15 01:19:31,214 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:19:31,403 INFO] src.engine_xgb: XGB Train Acc: 0.7770 | Test Acc: 0.7770
[2026-05-15 01:19:31,403 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12178259), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1321077), 'atr_normalized': np.float32(0.12791862), 'prev_log_return': np.float32(0.11378754), 'usdchf_log_return': np.float32(0.12680563), 'xagusd_log_return': np.float32(0.13365433), 'xtiusd_log_return': np.float32(0.11797044), 'synth_vix_zscore': np.float32(0.12597309)}
[2026-05-15 01:19:31,404 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:19:31,561 INFO] src.engine_xgb: XGB Train Acc: 0.7886 | Test Acc: 0.7886
[2026-05-15 01:19:31,562 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10115868), 'gmm_vol_cluster': np.float32(0.097316265), 'rsi_slope': np.float32(0.124427795), 'atr_normalized': np.float32(0.120855056), 'prev_log_return': np.float32(0.101421624), 'usdchf_log_return': np.float32(0.111346535), 'xagusd_log_return': np.float32(0.116801776), 'xtiusd_log_return': np.float32(0.10886342), 'synth_vix_zscore': np.float32(0.11780888)}
[2026-05-15 01:19:31,563 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:19:31,564 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.16146, 0.63340) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:31,703 INFO] src.backtester: Backtest [H1]: Sharpe=-1.674 | MaxDD=0.075 | WR=0.356 | Return=-7.2% | Trades=118
[2026-05-15 01:19:31,703 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:31,955 INFO] src.engine_xgb: XGB Train Acc: 0.7421 | Test Acc: 0.7421
[2026-05-15 01:19:31,956 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13045874), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1340834), 'atr_normalized': np.float32(0.124958724), 'prev_log_return': np.float32(0.12793566), 'usdchf_log_return': np.float32(0.115589134), 'xagusd_log_return': np.float32(0.13023177), 'xtiusd_log_return': np.float32(0.12210983), 'synth_vix_zscore': np.float32(0.11463271)}
[2026-05-15 01:19:31,956 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:19:32,193 INFO] src.engine_xgb: XGB Train Acc: 0.7424 | Test Acc: 0.7424
[2026-05-15 01:19:32,194 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10642485), 'gmm_vol_cluster': np.float32(0.10264126), 'rsi_slope': np.float32(0.11870598), 'atr_normalized': np.float32(0.121697776), 'prev_log_return': np.float32(0.115053736), 'usdchf_log_return': np.float32(0.10783231), 'xagusd_log_return': np.float32(0.111536615), 'xtiusd_log_return': np.float32(0.10642798), 'synth_vix_zscore': np.float32(0.10967955)}
[2026-05-15 01:19:32,194 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:19:32,420 INFO] src.engine_xgb: XGB Train Acc: 0.7638 | Test Acc: 0.7638
[2026-05-15 01:19:32,421 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11064814), 'gmm_vol_cluster': np.float32(0.09891076), 'rsi_slope': np.float32(0.11200786), 'atr_normalized': np.float32(0.11483679), 'prev_log_return': np.float32(0.10734406), 'usdchf_log_return': np.float32(0.119421914), 'xagusd_log_return': np.float32(0.11450818), 'xtiusd_log_return': np.float32(0.103485435), 'synth_vix_zscore': np.float32(0.11883684)}
[2026-05-15 01:19:32,421 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:19:32,422 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47142, 0.22575) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:32,514 INFO] src.backtester: Backtest [H1]: Sharpe=-2.885 | MaxDD=0.087 | WR=0.232 | Return=-6.9% | Trades=112
[2026-05-15 01:19:32,514 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:32,766 INFO] src.engine_xgb: XGB Train Acc: 0.6818 | Test Acc: 0.6818
[2026-05-15 01:19:32,766 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13482764), 'gmm_vol_cluster': np.float32(0.093847044), 'rsi_slope': np.float32(0.12375929), 'atr_normalized': np.float32(0.11445126), 'prev_log_return': np.float32(0.10327682), 'usdchf_log_return': np.float32(0.10486295), 'xagusd_log_return': np.float32(0.111710966), 'xtiusd_log_return': np.float32(0.10267926), 'synth_vix_zscore': np.float32(0.11058474)}
[2026-05-15 01:19:32,767 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:19:32,983 INFO] src.engine_xgb: XGB Train Acc: 0.7294 | Test Acc: 0.7294
[2026-05-15 01:19:32,983 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12166342), 'gmm_vol_cluster': np.float32(0.083661884), 'rsi_slope': np.float32(0.119005), 'atr_normalized': np.float32(0.116226315), 'prev_log_return': np.float32(0.11942739), 'usdchf_log_return': np.float32(0.11001263), 'xagusd_log_return': np.float32(0.111329), 'xtiusd_log_return': np.float32(0.10909608), 'synth_vix_zscore': np.float32(0.1095783)}
[2026-05-15 01:19:32,984 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:19:33,265 INFO] src.engine_xgb: XGB Train Acc: 0.7488 | Test Acc: 0.7488
[2026-05-15 01:19:33,266 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.094605304), 'gmm_vol_cluster': np.float32(0.110797495), 'rsi_slope': np.float32(0.11793826), 'atr_normalized': np.float32(0.11879305), 'prev_log_return': np.float32(0.10881939), 'usdchf_log_return': np.float32(0.11244089), 'xagusd_log_return': np.float32(0.11576804), 'xtiusd_log_return': np.float32(0.10552129), 'synth_vix_zscore': np.float32(0.11531628)}
[2026-05-15 01:19:33,266 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:19:33,268 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.62208, 0.06248) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:33,366 INFO] src.backtester: Backtest [H1]: Sharpe=-2.173 | MaxDD=0.099 | WR=0.260 | Return=-6.1% | Trades=77
[2026-05-15 01:19:33,366 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:33,376 INFO] src.optimizer: WFO [H1] window start=25920: trades=77 sharpe=-2.173 cv_sharpe=-2.279 score=-0.500
[2026-05-15 01:19:36,002 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:19:36,003 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:19:36,003 INFO] src.engine_hmm: Bull 0.9632 0.0018 0.0244 0.0105
[2026-05-15 01:19:36,003 INFO] src.engine_hmm: Bear 0.0094 0.9570 0.0280 0.0055
[2026-05-15 01:19:36,004 INFO] src.engine_hmm: Chop_Low 0.0280 0.0114 0.9539 0.0068
[2026-05-15 01:19:36,004 INFO] src.engine_hmm: Chop_High 0.0052 0.0579 0.0009 0.9360
[2026-05-15 01:19:36,004 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:19:36,005 INFO] src.engine_hmm: Bull: return=0.614094, vol=-0.585426, rsi_slope=-0.017086
[2026-05-15 01:19:36,005 INFO] src.engine_hmm: Bear: return=-0.442047, vol=0.439137, rsi_slope=0.019268
[2026-05-15 01:19:36,005 INFO] src.engine_hmm: Chop_Low: return=-0.276167, vol=-0.379958, rsi_slope=0.011071
[2026-05-15 01:19:36,005 INFO] src.engine_hmm: Chop_High: return=-0.007865, vol=1.881166, rsi_slope=-0.025619
[2026-05-15 01:19:36,006 INFO] src.engine_hmm: Total regime transitions: 418
[2026-05-15 01:19:36,006 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-02 15:00:00: Chop_Low -> Bull
[2026-05-15 01:19:36,006 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 09:00:00: Bull -> Chop_Low
[2026-05-15 01:19:36,006 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 16:00:00: Chop_Low -> Bear
[2026-05-15 01:19:36,007 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-04 04:00:00: Bear -> Chop_High
[2026-05-15 01:19:36,007 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-04 12:00:00: Chop_High -> Bear
[2026-05-15 01:19:36,007 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 12:00:00: Bear -> Bull
[2026-05-15 01:19:36,008 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-08 16:00:00: Bull -> Chop_Low
[2026-05-15 01:19:36,008 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-09 14:00:00: Chop_Low -> Bull
[2026-05-15 01:19:36,008 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 10:00:00: Bull -> Chop_Low
[2026-05-15 01:19:36,009 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 15:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:36,033 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:19:36,046 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:19:36,218 INFO] src.engine_xgb: XGB Train Acc: 0.7301 | Test Acc: 0.7301
[2026-05-15 01:19:36,218 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12411616), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1262807), 'atr_normalized': np.float32(0.12596588), 'prev_log_return': np.float32(0.12563413), 'usdchf_log_return': np.float32(0.12802283), 'xagusd_log_return': np.float32(0.12755287), 'xtiusd_log_return': np.float32(0.115266666), 'synth_vix_zscore': np.float32(0.12716068)}
[2026-05-15 01:19:36,219 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:19:36,373 INFO] src.engine_xgb: XGB Train Acc: 0.7414 | Test Acc: 0.7414
[2026-05-15 01:19:36,373 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10655894), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13613775), 'atr_normalized': np.float32(0.12282037), 'prev_log_return': np.float32(0.12400475), 'usdchf_log_return': np.float32(0.12853533), 'xagusd_log_return': np.float32(0.11973188), 'xtiusd_log_return': np.float32(0.12314454), 'synth_vix_zscore': np.float32(0.13906644)}
[2026-05-15 01:19:36,374 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:19:36,522 INFO] src.engine_xgb: XGB Train Acc: 0.7886 | Test Acc: 0.7886
[2026-05-15 01:19:36,523 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12061641), 'gmm_vol_cluster': np.float32(0.086023375), 'rsi_slope': np.float32(0.11694594), 'atr_normalized': np.float32(0.1040712), 'prev_log_return': np.float32(0.11398096), 'usdchf_log_return': np.float32(0.11818973), 'xagusd_log_return': np.float32(0.1104604), 'xtiusd_log_return': np.float32(0.114267595), 'synth_vix_zscore': np.float32(0.1154444)}
[2026-05-15 01:19:36,523 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:19:36,524 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.56732, -0.02191) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:36,637 INFO] src.backtester: Backtest [H1]: Sharpe=-1.402 | MaxDD=0.073 | WR=0.277 | Return=-5.0% | Trades=94
[2026-05-15 01:19:36,638 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:36,877 INFO] src.engine_xgb: XGB Train Acc: 0.7337 | Test Acc: 0.7337
[2026-05-15 01:19:36,878 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11861569), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12797137), 'atr_normalized': np.float32(0.12696801), 'prev_log_return': np.float32(0.13044192), 'usdchf_log_return': np.float32(0.1187217), 'xagusd_log_return': np.float32(0.12663595), 'xtiusd_log_return': np.float32(0.113608405), 'synth_vix_zscore': np.float32(0.13703704)}
[2026-05-15 01:19:36,878 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:19:37,111 INFO] src.engine_xgb: XGB Train Acc: 0.7445 | Test Acc: 0.7445
[2026-05-15 01:19:37,111 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09104151), 'gmm_vol_cluster': np.float32(0.13334602), 'rsi_slope': np.float32(0.113040775), 'atr_normalized': np.float32(0.10859534), 'prev_log_return': np.float32(0.11511297), 'usdchf_log_return': np.float32(0.1117711), 'xagusd_log_return': np.float32(0.1114815), 'xtiusd_log_return': np.float32(0.10497431), 'synth_vix_zscore': np.float32(0.11063646)}
[2026-05-15 01:19:37,112 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:19:37,332 INFO] src.engine_xgb: XGB Train Acc: 0.7274 | Test Acc: 0.7274
[2026-05-15 01:19:37,333 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10730986), 'gmm_vol_cluster': np.float32(0.11947298), 'rsi_slope': np.float32(0.11637808), 'atr_normalized': np.float32(0.10669729), 'prev_log_return': np.float32(0.11860654), 'usdchf_log_return': np.float32(0.10249365), 'xagusd_log_return': np.float32(0.11562282), 'xtiusd_log_return': np.float32(0.104886904), 'synth_vix_zscore': np.float32(0.10853193)}
[2026-05-15 01:19:37,333 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:19:37,335 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47816, 0.15210) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:37,467 INFO] src.backtester: Backtest [H1]: Sharpe=-0.823 | MaxDD=0.058 | WR=0.264 | Return=-2.6% | Trades=91
[2026-05-15 01:19:37,467 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:37,736 INFO] src.engine_xgb: XGB Train Acc: 0.6925 | Test Acc: 0.6925
[2026-05-15 01:19:37,737 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10960067), 'gmm_vol_cluster': np.float32(0.08582186), 'rsi_slope': np.float32(0.11566674), 'atr_normalized': np.float32(0.11278882), 'prev_log_return': np.float32(0.112306654), 'usdchf_log_return': np.float32(0.10977301), 'xagusd_log_return': np.float32(0.12220843), 'xtiusd_log_return': np.float32(0.11408879), 'synth_vix_zscore': np.float32(0.11774495)}
[2026-05-15 01:19:37,737 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:19:37,975 INFO] src.engine_xgb: XGB Train Acc: 0.6522 | Test Acc: 0.6522
[2026-05-15 01:19:37,975 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.107320756), 'gmm_vol_cluster': np.float32(0.117478974), 'rsi_slope': np.float32(0.1142071), 'atr_normalized': np.float32(0.10895516), 'prev_log_return': np.float32(0.111919135), 'usdchf_log_return': np.float32(0.11415145), 'xagusd_log_return': np.float32(0.11962046), 'xtiusd_log_return': np.float32(0.10194887), 'synth_vix_zscore': np.float32(0.10439807)}
[2026-05-15 01:19:37,976 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:19:38,251 INFO] src.engine_xgb: XGB Train Acc: 0.7042 | Test Acc: 0.7042
[2026-05-15 01:19:38,252 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.116411716), 'gmm_vol_cluster': np.float32(0.10198516), 'rsi_slope': np.float32(0.115909114), 'atr_normalized': np.float32(0.109759755), 'prev_log_return': np.float32(0.12439151), 'usdchf_log_return': np.float32(0.10554556), 'xagusd_log_return': np.float32(0.109766796), 'xtiusd_log_return': np.float32(0.10558035), 'synth_vix_zscore': np.float32(0.11065006)}
[2026-05-15 01:19:38,252 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:19:38,254 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.40708, 0.22442) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:38,361 INFO] src.backtester: Backtest [H1]: Sharpe=-2.047 | MaxDD=0.050 | WR=0.283 | Return=-3.9% | Trades=60
[2026-05-15 01:19:38,362 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:38,376 INFO] src.optimizer: WFO [H1] window start=30240: trades=60 sharpe=-2.047 cv_sharpe=-1.113 score=-0.500
[2026-05-15 01:19:39,499 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:19:39,499 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:19:39,499 INFO] src.engine_hmm: Bull 0.9605 0.0159 0.0000 0.0236
[2026-05-15 01:19:39,500 INFO] src.engine_hmm: Bear 0.0055 0.9633 0.0289 0.0022
[2026-05-15 01:19:39,500 INFO] src.engine_hmm: Chop_Low 0.0049 0.0146 0.9541 0.0264
[2026-05-15 01:19:39,500 INFO] src.engine_hmm: Chop_High 0.0131 0.0029 0.0282 0.9559
[2026-05-15 01:19:39,501 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:19:39,501 INFO] src.engine_hmm: Bull: return=1.219077, vol=1.282811, rsi_slope=-0.005875
[2026-05-15 01:19:39,501 INFO] src.engine_hmm: Bear: return=-1.057810, vol=0.523320, rsi_slope=0.018363
[2026-05-15 01:19:39,501 INFO] src.engine_hmm: Chop_Low: return=-0.371825, vol=-0.623667, rsi_slope=0.010201
[2026-05-15 01:19:39,502 INFO] src.engine_hmm: Chop_High: return=0.513561, vol=-0.451825, rsi_slope=-0.021778
[2026-05-15 01:19:39,502 INFO] src.engine_hmm: Total regime transitions: 423
[2026-05-15 01:19:39,502 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-23 16:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:39,502 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-24 04:00:00: Chop_High -> Bull
[2026-05-15 01:19:39,503 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-25 18:00:00: Bull -> Bear
[2026-05-15 01:19:39,503 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-28 01:00:00: Bear -> Bull
[2026-05-15 01:19:39,503 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-02 13:00:00: Bull -> Bear
[2026-05-15 01:19:39,503 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-03 09:00:00: Bear -> Chop_High
[2026-05-15 01:19:39,504 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-04 02:00:00: Chop_High -> Bull
[2026-05-15 01:19:39,504 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-10 21:00:00: Bull -> Bear
[2026-05-15 01:19:39,504 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-17 03:00:00: Bear -> Bull
[2026-05-15 01:19:39,504 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-17 18:00:00: Bull -> Chop_High
[2026-05-15 01:19:39,531 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:19:39,545 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:19:39,696 INFO] src.engine_xgb: XGB Train Acc: 0.7657 | Test Acc: 0.7657
[2026-05-15 01:19:39,696 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12390626), 'gmm_vol_cluster': np.float32(0.0958672), 'rsi_slope': np.float32(0.09851948), 'atr_normalized': np.float32(0.11168114), 'prev_log_return': np.float32(0.11512992), 'usdchf_log_return': np.float32(0.12171619), 'xagusd_log_return': np.float32(0.1101622), 'xtiusd_log_return': np.float32(0.10949545), 'synth_vix_zscore': np.float32(0.11352224)}
[2026-05-15 01:19:39,696 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:19:39,835 INFO] src.engine_xgb: XGB Train Acc: 0.7131 | Test Acc: 0.7131
[2026-05-15 01:19:39,835 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09142503), 'gmm_vol_cluster': np.float32(0.11670022), 'rsi_slope': np.float32(0.11436896), 'atr_normalized': np.float32(0.11092687), 'prev_log_return': np.float32(0.1188417), 'usdchf_log_return': np.float32(0.10945559), 'xagusd_log_return': np.float32(0.112208314), 'xtiusd_log_return': np.float32(0.11489314), 'synth_vix_zscore': np.float32(0.11118019)}
[2026-05-15 01:19:39,836 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:19:39,977 INFO] src.engine_xgb: XGB Train Acc: 0.7764 | Test Acc: 0.7764
[2026-05-15 01:19:39,977 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.116361804), 'gmm_vol_cluster': np.float32(0.1019286), 'rsi_slope': np.float32(0.116933), 'atr_normalized': np.float32(0.11927158), 'prev_log_return': np.float32(0.11230689), 'usdchf_log_return': np.float32(0.10333961), 'xagusd_log_return': np.float32(0.12010236), 'xtiusd_log_return': np.float32(0.10681335), 'synth_vix_zscore': np.float32(0.10294272)}
[2026-05-15 01:19:39,978 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:19:39,979 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.42962, 0.34995) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:40,071 INFO] src.backtester: Backtest [H1]: Sharpe=-2.645 | MaxDD=0.161 | WR=0.270 | Return=-9.8% | Trades=141
[2026-05-15 01:19:40,071 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:40,274 INFO] src.engine_xgb: XGB Train Acc: 0.7754 | Test Acc: 0.7754
[2026-05-15 01:19:40,274 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11920117), 'gmm_vol_cluster': np.float32(0.08767472), 'rsi_slope': np.float32(0.10927064), 'atr_normalized': np.float32(0.11543543), 'prev_log_return': np.float32(0.10946836), 'usdchf_log_return': np.float32(0.11868316), 'xagusd_log_return': np.float32(0.11730049), 'xtiusd_log_return': np.float32(0.10663357), 'synth_vix_zscore': np.float32(0.116332516)}
[2026-05-15 01:19:40,275 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:19:40,500 INFO] src.engine_xgb: XGB Train Acc: 0.6794 | Test Acc: 0.6794
[2026-05-15 01:19:40,500 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.103651285), 'gmm_vol_cluster': np.float32(0.118002266), 'rsi_slope': np.float32(0.11729464), 'atr_normalized': np.float32(0.10626465), 'prev_log_return': np.float32(0.109795794), 'usdchf_log_return': np.float32(0.1137015), 'xagusd_log_return': np.float32(0.110239476), 'xtiusd_log_return': np.float32(0.10859782), 'synth_vix_zscore': np.float32(0.11245256)}
[2026-05-15 01:19:40,501 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:19:40,709 INFO] src.engine_xgb: XGB Train Acc: 0.7304 | Test Acc: 0.7304
[2026-05-15 01:19:40,710 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.116724215), 'gmm_vol_cluster': np.float32(0.10742734), 'rsi_slope': np.float32(0.10805274), 'atr_normalized': np.float32(0.10754613), 'prev_log_return': np.float32(0.11652885), 'usdchf_log_return': np.float32(0.106994174), 'xagusd_log_return': np.float32(0.11254186), 'xtiusd_log_return': np.float32(0.109687515), 'synth_vix_zscore': np.float32(0.1144972)}
[2026-05-15 01:19:40,710 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:19:40,712 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47849, 0.22854) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:40,851 INFO] src.backtester: Backtest [H1]: Sharpe=-2.842 | MaxDD=0.103 | WR=0.277 | Return=-8.6% | Trades=130
[2026-05-15 01:19:40,851 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:41,132 INFO] src.engine_xgb: XGB Train Acc: 0.6776 | Test Acc: 0.6776
[2026-05-15 01:19:41,133 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10885199), 'gmm_vol_cluster': np.float32(0.11810742), 'rsi_slope': np.float32(0.10609926), 'atr_normalized': np.float32(0.10151418), 'prev_log_return': np.float32(0.1125328), 'usdchf_log_return': np.float32(0.11250336), 'xagusd_log_return': np.float32(0.110567085), 'xtiusd_log_return': np.float32(0.1130881), 'synth_vix_zscore': np.float32(0.11673586)}
[2026-05-15 01:19:41,134 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:19:41,410 INFO] src.engine_xgb: XGB Train Acc: 0.6824 | Test Acc: 0.6824
[2026-05-15 01:19:41,411 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10868703), 'gmm_vol_cluster': np.float32(0.11546244), 'rsi_slope': np.float32(0.11260635), 'atr_normalized': np.float32(0.117004946), 'prev_log_return': np.float32(0.10676459), 'usdchf_log_return': np.float32(0.10774199), 'xagusd_log_return': np.float32(0.118463375), 'xtiusd_log_return': np.float32(0.10395734), 'synth_vix_zscore': np.float32(0.10931196)}
[2026-05-15 01:19:41,411 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:19:41,695 INFO] src.engine_xgb: XGB Train Acc: 0.7176 | Test Acc: 0.7176
[2026-05-15 01:19:41,695 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.107371986), 'gmm_vol_cluster': np.float32(0.103681915), 'rsi_slope': np.float32(0.11039487), 'atr_normalized': np.float32(0.11083599), 'prev_log_return': np.float32(0.12056901), 'usdchf_log_return': np.float32(0.11139024), 'xagusd_log_return': np.float32(0.111289084), 'xtiusd_log_return': np.float32(0.10940374), 'synth_vix_zscore': np.float32(0.11506316)}
[2026-05-15 01:19:41,696 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:19:41,698 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.64128, 0.06038) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:41,805 INFO] src.backtester: Backtest [H1]: Sharpe=-4.869 | MaxDD=0.103 | WR=0.183 | Return=-9.1% | Trades=82
[2026-05-15 01:19:41,805 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:41,822 INFO] src.optimizer: WFO [H1] window start=34560: trades=82 sharpe=-4.869 cv_sharpe=-2.743 score=-0.500
[2026-05-15 01:19:43,379 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:19:43,380 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:19:43,380 INFO] src.engine_hmm: Bull 0.9636 0.0119 0.0000 0.0246
[2026-05-15 01:19:43,380 INFO] src.engine_hmm: Bear 0.0054 0.9599 0.0039 0.0309
[2026-05-15 01:19:43,380 INFO] src.engine_hmm: Chop_Low 0.0087 0.0028 0.9689 0.0196
[2026-05-15 01:19:43,381 INFO] src.engine_hmm: Chop_High 0.0082 0.0081 0.0304 0.9533
[2026-05-15 01:19:43,381 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:19:43,381 INFO] src.engine_hmm: Bull: return=1.265021, vol=1.075342, rsi_slope=-0.014785
[2026-05-15 01:19:43,381 INFO] src.engine_hmm: Bear: return=-1.333116, vol=0.890287, rsi_slope=0.025422
[2026-05-15 01:19:43,382 INFO] src.engine_hmm: Chop_Low: return=-0.137066, vol=-0.856540, rsi_slope=-0.004758
[2026-05-15 01:19:43,382 INFO] src.engine_hmm: Chop_High: return=0.039878, vol=-0.077791, rsi_slope=0.001834
[2026-05-15 01:19:43,383 INFO] src.engine_hmm: Total regime transitions: 378
[2026-05-15 01:19:43,383 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-16 06:00:00: Bull -> Chop_High
[2026-05-15 01:19:43,384 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-18 12:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:43,384 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-18 17:00:00: Chop_Low -> Bear
[2026-05-15 01:19:43,384 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-21 22:00:00: Bear -> Chop_High
[2026-05-15 01:19:43,386 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-22 15:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:43,386 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-23 09:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:43,387 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-24 18:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:43,388 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-28 01:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:43,388 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 03:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:43,389 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 13:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:43,423 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:19:43,441 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:19:43,677 INFO] src.engine_xgb: XGB Train Acc: 0.8002 | Test Acc: 0.8002
[2026-05-15 01:19:43,677 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13159943), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11970282), 'atr_normalized': np.float32(0.12204139), 'prev_log_return': np.float32(0.12145679), 'usdchf_log_return': np.float32(0.12861003), 'xagusd_log_return': np.float32(0.12383066), 'xtiusd_log_return': np.float32(0.12829885), 'synth_vix_zscore': np.float32(0.12445999)}
[2026-05-15 01:19:43,678 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:19:43,856 INFO] src.engine_xgb: XGB Train Acc: 0.7403 | Test Acc: 0.7403
[2026-05-15 01:19:43,856 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10655393), 'gmm_vol_cluster': np.float32(0.13080896), 'rsi_slope': np.float32(0.10655899), 'atr_normalized': np.float32(0.114419706), 'prev_log_return': np.float32(0.11520978), 'usdchf_log_return': np.float32(0.109125555), 'xagusd_log_return': np.float32(0.0997651), 'xtiusd_log_return': np.float32(0.114790335), 'synth_vix_zscore': np.float32(0.10276759)}
[2026-05-15 01:19:43,857 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:19:44,017 INFO] src.engine_xgb: XGB Train Acc: 0.8161 | Test Acc: 0.8161
[2026-05-15 01:19:44,018 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10818926), 'gmm_vol_cluster': np.float32(0.10277973), 'rsi_slope': np.float32(0.11864221), 'atr_normalized': np.float32(0.111182824), 'prev_log_return': np.float32(0.10786574), 'usdchf_log_return': np.float32(0.109779365), 'xagusd_log_return': np.float32(0.12362051), 'xtiusd_log_return': np.float32(0.10584277), 'synth_vix_zscore': np.float32(0.112097606)}
[2026-05-15 01:19:44,018 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:19:44,019 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.13686, 0.71017) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:44,138 INFO] src.backtester: Backtest [H1]: Sharpe=-4.634 | MaxDD=0.113 | WR=0.213 | Return=-10.5% | Trades=108
[2026-05-15 01:19:44,139 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:44,358 INFO] src.engine_xgb: XGB Train Acc: 0.7004 | Test Acc: 0.7004
[2026-05-15 01:19:44,358 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12078004), 'gmm_vol_cluster': np.float32(0.10457015), 'rsi_slope': np.float32(0.110430844), 'atr_normalized': np.float32(0.1086345), 'prev_log_return': np.float32(0.11152147), 'usdchf_log_return': np.float32(0.11001534), 'xagusd_log_return': np.float32(0.11070274), 'xtiusd_log_return': np.float32(0.114694126), 'synth_vix_zscore': np.float32(0.108650774)}
[2026-05-15 01:19:44,359 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:19:44,593 INFO] src.engine_xgb: XGB Train Acc: 0.7946 | Test Acc: 0.7946
[2026-05-15 01:19:44,593 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10670508), 'gmm_vol_cluster': np.float32(0.11474168), 'rsi_slope': np.float32(0.114333004), 'atr_normalized': np.float32(0.104687065), 'prev_log_return': np.float32(0.112452745), 'usdchf_log_return': np.float32(0.108313784), 'xagusd_log_return': np.float32(0.109049305), 'xtiusd_log_return': np.float32(0.11748561), 'synth_vix_zscore': np.float32(0.11223179)}
[2026-05-15 01:19:44,594 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:19:44,828 INFO] src.engine_xgb: XGB Train Acc: 0.7086 | Test Acc: 0.7086
[2026-05-15 01:19:44,829 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11167563), 'gmm_vol_cluster': np.float32(0.11087043), 'rsi_slope': np.float32(0.11380481), 'atr_normalized': np.float32(0.114639066), 'prev_log_return': np.float32(0.114455655), 'usdchf_log_return': np.float32(0.10305405), 'xagusd_log_return': np.float32(0.10463366), 'xtiusd_log_return': np.float32(0.11195363), 'synth_vix_zscore': np.float32(0.11491304)}
[2026-05-15 01:19:44,829 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:19:44,831 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.51565, 0.29314) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:44,942 INFO] src.backtester: Backtest [H1]: Sharpe=-3.236 | MaxDD=0.124 | WR=0.226 | Return=-9.3% | Trades=115
[2026-05-15 01:19:44,943 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:45,165 INFO] src.engine_xgb: XGB Train Acc: 0.6724 | Test Acc: 0.6724
[2026-05-15 01:19:45,165 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10797232), 'gmm_vol_cluster': np.float32(0.08785006), 'rsi_slope': np.float32(0.1144455), 'atr_normalized': np.float32(0.11372423), 'prev_log_return': np.float32(0.11610039), 'usdchf_log_return': np.float32(0.11869553), 'xagusd_log_return': np.float32(0.11534831), 'xtiusd_log_return': np.float32(0.11275622), 'synth_vix_zscore': np.float32(0.11310745)}
[2026-05-15 01:19:45,166 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:19:45,381 INFO] src.engine_xgb: XGB Train Acc: 0.7422 | Test Acc: 0.7422
[2026-05-15 01:19:45,382 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10740611), 'gmm_vol_cluster': np.float32(0.122209094), 'rsi_slope': np.float32(0.109559245), 'atr_normalized': np.float32(0.10483124), 'prev_log_return': np.float32(0.11351196), 'usdchf_log_return': np.float32(0.11091018), 'xagusd_log_return': np.float32(0.11443265), 'xtiusd_log_return': np.float32(0.11094498), 'synth_vix_zscore': np.float32(0.10619457)}
[2026-05-15 01:19:45,382 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:19:45,638 INFO] src.engine_xgb: XGB Train Acc: 0.7485 | Test Acc: 0.7485
[2026-05-15 01:19:45,639 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11207534), 'gmm_vol_cluster': np.float32(0.106178656), 'rsi_slope': np.float32(0.117956765), 'atr_normalized': np.float32(0.1204138), 'prev_log_return': np.float32(0.109620236), 'usdchf_log_return': np.float32(0.10341961), 'xagusd_log_return': np.float32(0.108273365), 'xtiusd_log_return': np.float32(0.11039892), 'synth_vix_zscore': np.float32(0.111663334)}
[2026-05-15 01:19:45,639 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:19:45,641 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.46960, 0.34543) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:45,734 INFO] src.backtester: Backtest [H1]: Sharpe=-4.496 | MaxDD=0.080 | WR=0.176 | Return=-7.3% | Trades=68
[2026-05-15 01:19:45,734 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:45,749 INFO] src.optimizer: WFO [H1] window start=38880: trades=68 sharpe=-4.496 cv_sharpe=-3.935 score=-0.500
[2026-05-15 01:19:49,041 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:19:49,042 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:19:49,042 INFO] src.engine_hmm: Bull 0.9606 0.0059 0.0000 0.0336
[2026-05-15 01:19:49,042 INFO] src.engine_hmm: Bear 0.0106 0.9677 0.0062 0.0154
[2026-05-15 01:19:49,042 INFO] src.engine_hmm: Chop_Low 0.0051 0.0061 0.9627 0.0261
[2026-05-15 01:19:49,042 INFO] src.engine_hmm: Chop_High 0.0181 0.0062 0.0323 0.9434
[2026-05-15 01:19:49,042 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:19:49,043 INFO] src.engine_hmm: Bull: return=0.968339, vol=0.159099, rsi_slope=0.003808
[2026-05-15 01:19:49,043 INFO] src.engine_hmm: Bear: return=-0.678075, vol=1.566882, rsi_slope=-0.011986
[2026-05-15 01:19:49,043 INFO] src.engine_hmm: Chop_Low: return=-0.383596, vol=-0.780158, rsi_slope=-0.000642
[2026-05-15 01:19:49,043 INFO] src.engine_hmm: Chop_High: return=0.013939, vol=-0.154359, rsi_slope=0.003913
[2026-05-15 01:19:49,043 INFO] src.engine_hmm: Total regime transitions: 416
[2026-05-15 01:19:49,044 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-10 19:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:49,044 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-11 14:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:49,045 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-21 14:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:49,045 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-23 13:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:49,045 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-23 16:00:00: Chop_Low -> Bull
[2026-05-15 01:19:49,046 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-24 13:00:00: Bull -> Chop_High
[2026-05-15 01:19:49,046 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-24 14:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:49,046 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-25 20:00:00: Chop_Low -> Chop_High
[2026-05-15 01:19:49,046 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-28 14:00:00: Chop_High -> Chop_Low
[2026-05-15 01:19:49,047 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-29 17:00:00: Chop_Low -> Bull
[2026-05-15 01:19:49,064 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:19:49,072 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:19:49,220 INFO] src.engine_xgb: XGB Train Acc: 0.7594 | Test Acc: 0.7594
[2026-05-15 01:19:49,221 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13406964), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12505142), 'atr_normalized': np.float32(0.11768), 'prev_log_return': np.float32(0.1276803), 'usdchf_log_return': np.float32(0.13125405), 'xagusd_log_return': np.float32(0.11865957), 'xtiusd_log_return': np.float32(0.12557065), 'synth_vix_zscore': np.float32(0.12003441)}
[2026-05-15 01:19:49,221 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:19:49,356 INFO] src.engine_xgb: XGB Train Acc: 0.7613 | Test Acc: 0.7613
[2026-05-15 01:19:49,357 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11550904), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11813108), 'atr_normalized': np.float32(0.123949535), 'prev_log_return': np.float32(0.11692934), 'usdchf_log_return': np.float32(0.12848438), 'xagusd_log_return': np.float32(0.12306424), 'xtiusd_log_return': np.float32(0.12924153), 'synth_vix_zscore': np.float32(0.14469084)}
[2026-05-15 01:19:49,357 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:19:49,487 INFO] src.engine_xgb: XGB Train Acc: 0.7429 | Test Acc: 0.7429
[2026-05-15 01:19:49,487 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1150592), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11588119), 'atr_normalized': np.float32(0.1314076), 'prev_log_return': np.float32(0.122447744), 'usdchf_log_return': np.float32(0.13015334), 'xagusd_log_return': np.float32(0.124718525), 'xtiusd_log_return': np.float32(0.13603286), 'synth_vix_zscore': np.float32(0.12429949)}
[2026-05-15 01:19:49,489 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:19:49,490 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.73608, -0.15122) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:49,576 INFO] src.backtester: Backtest [H1]: Sharpe=-2.877 | MaxDD=0.137 | WR=0.240 | Return=-11.3% | Trades=125
[2026-05-15 01:19:49,576 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:49,739 INFO] src.engine_xgb: XGB Train Acc: 0.7530 | Test Acc: 0.7530
[2026-05-15 01:19:49,740 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12408991), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.124603115), 'atr_normalized': np.float32(0.1192028), 'prev_log_return': np.float32(0.12903358), 'usdchf_log_return': np.float32(0.12405022), 'xagusd_log_return': np.float32(0.12475412), 'xtiusd_log_return': np.float32(0.12731129), 'synth_vix_zscore': np.float32(0.12695499)}
[2026-05-15 01:19:49,740 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:19:49,894 INFO] src.engine_xgb: XGB Train Acc: 0.7696 | Test Acc: 0.7696
[2026-05-15 01:19:49,894 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10091597), 'gmm_vol_cluster': np.float32(0.11506672), 'rsi_slope': np.float32(0.109657496), 'atr_normalized': np.float32(0.11309678), 'prev_log_return': np.float32(0.10912243), 'usdchf_log_return': np.float32(0.11096135), 'xagusd_log_return': np.float32(0.115368076), 'xtiusd_log_return': np.float32(0.11081399), 'synth_vix_zscore': np.float32(0.11499723)}
[2026-05-15 01:19:49,895 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:19:50,055 INFO] src.engine_xgb: XGB Train Acc: 0.7785 | Test Acc: 0.7785
[2026-05-15 01:19:50,056 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1264855), 'gmm_vol_cluster': np.float32(0.09008447), 'rsi_slope': np.float32(0.116129436), 'atr_normalized': np.float32(0.118825905), 'prev_log_return': np.float32(0.10487417), 'usdchf_log_return': np.float32(0.11821713), 'xagusd_log_return': np.float32(0.11396332), 'xtiusd_log_return': np.float32(0.10414691), 'synth_vix_zscore': np.float32(0.10727319)}
[2026-05-15 01:19:50,056 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:19:50,057 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53526, 0.16378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:50,145 INFO] src.backtester: Backtest [H1]: Sharpe=-2.367 | MaxDD=0.081 | WR=0.241 | Return=-4.8% | Trades=83
[2026-05-15 01:19:50,145 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:50,333 INFO] src.engine_xgb: XGB Train Acc: 0.7644 | Test Acc: 0.7644
[2026-05-15 01:19:50,335 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.115746684), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12265972), 'atr_normalized': np.float32(0.12604216), 'prev_log_return': np.float32(0.12805153), 'usdchf_log_return': np.float32(0.13162507), 'xagusd_log_return': np.float32(0.12177622), 'xtiusd_log_return': np.float32(0.12937029), 'synth_vix_zscore': np.float32(0.12472829)}
[2026-05-15 01:19:50,335 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:19:50,508 INFO] src.engine_xgb: XGB Train Acc: 0.7612 | Test Acc: 0.7612
[2026-05-15 01:19:50,508 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11693784), 'gmm_vol_cluster': np.float32(0.089298636), 'rsi_slope': np.float32(0.1130877), 'atr_normalized': np.float32(0.1161512), 'prev_log_return': np.float32(0.11164937), 'usdchf_log_return': np.float32(0.11469597), 'xagusd_log_return': np.float32(0.109710656), 'xtiusd_log_return': np.float32(0.11007689), 'synth_vix_zscore': np.float32(0.118391715)}
[2026-05-15 01:19:50,509 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:19:50,689 INFO] src.engine_xgb: XGB Train Acc: 0.7831 | Test Acc: 0.7831
[2026-05-15 01:19:50,689 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13489757), 'gmm_vol_cluster': np.float32(0.103251174), 'rsi_slope': np.float32(0.11586102), 'atr_normalized': np.float32(0.110950455), 'prev_log_return': np.float32(0.106341496), 'usdchf_log_return': np.float32(0.10873229), 'xagusd_log_return': np.float32(0.10837739), 'xtiusd_log_return': np.float32(0.10567437), 'synth_vix_zscore': np.float32(0.10591419)}
[2026-05-15 01:19:50,690 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:19:50,691 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.43440, 0.22813) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:50,759 INFO] src.backtester: Backtest [H1]: Sharpe=0.365 | MaxDD=0.033 | WR=0.333 | Return=0.5% | Trades=24
[2026-05-15 01:19:50,759 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:50,769 INFO] src.optimizer: WFO [H1] window start=43200: trades=24 sharpe=0.365 cv_sharpe=-2.622 score=0.152
[2026-05-15 01:19:50,770 INFO] src.optimizer: WFO [H1]: 8/8 valid | median_trades=68 | score=-0.566 | std_sharpe=1.876 | WFE=0.98 | window_scores=[-0.009, -0.5, -1.0, -0.5, -0.5, -0.5, -0.5, 0.152]
[2026-05-15 01:19:50,815 INFO] src.optimizer: Trial 30 [H1/headway_cent $15 standard]: score=-1.004 | valid=8/8 | std_sharpe=1.876 | median_trades=68 | WFE=0.98 | scores=[-0.009, -0.5, -1.0, -0.5, -0.5, -0.5, -0.5, 0.152]
Best trial: 23. Best value: -0.320363: 16%|██████████▌ | 31/200 [17:50<1:46:55, 37.96s/it][2026-05-15 01:19:52,693 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:19:52,693 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:19:52,693 INFO] src.engine_hmm: Bull 0.9756 0.0020 0.0224
[2026-05-15 01:19:52,693 INFO] src.engine_hmm: Bear 0.0069 0.9727 0.0203
[2026-05-15 01:19:52,693 INFO] src.engine_hmm: Chop 0.0136 0.0285 0.9579
[2026-05-15 01:19:52,694 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:19:52,694 INFO] src.engine_hmm: Bull: return=0.048624, vol=1.191440, rsi_slope=-0.000932
[2026-05-15 01:19:52,694 INFO] src.engine_hmm: Bear: return=-0.053936, vol=-0.780041, rsi_slope=-0.010158
[2026-05-15 01:19:52,694 INFO] src.engine_hmm: Chop: return=0.017318, vol=-0.175972, rsi_slope=0.012074
[2026-05-15 01:19:52,694 INFO] src.engine_hmm: Total regime transitions: 312
[2026-05-15 01:19:52,694 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-25 14:00:00: Bear -> Chop
[2026-05-15 01:19:52,695 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-28 11:00:00: Chop -> Bear
[2026-05-15 01:19:52,695 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-03 04:00:00: Bear -> Chop
[2026-05-15 01:19:52,695 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-05 05:00:00: Chop -> Bear
[2026-05-15 01:19:52,695 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-10 13:00:00: Bear -> Bull
[2026-05-15 01:19:52,695 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-11 08:00:00: Bull -> Chop
[2026-05-15 01:19:52,696 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-12 12:00:00: Chop -> Bear
[2026-05-15 01:19:52,696 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-13 15:00:00: Bear -> Bull
[2026-05-15 01:19:52,696 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-16 07:00:00: Bull -> Chop
[2026-05-15 01:19:52,696 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-16 12:00:00: Chop -> Bear
[2026-05-15 01:19:52,712 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:19:52,720 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:19:52,905 INFO] src.engine_xgb: XGB Train Acc: 0.7500 | Test Acc: 0.7500
[2026-05-15 01:19:52,906 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10965064), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.124854185), 'atr_normalized': np.float32(0.12412366), 'prev_log_return': np.float32(0.13115518), 'usdchf_log_return': np.float32(0.12168185), 'xagusd_log_return': np.float32(0.13120116), 'xtiusd_log_return': np.float32(0.12813713), 'synth_vix_zscore': np.float32(0.12919618)}
[2026-05-15 01:19:52,906 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:19:53,107 INFO] src.engine_xgb: XGB Train Acc: 0.7539 | Test Acc: 0.7539
[2026-05-15 01:19:53,108 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11832008), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14755556), 'atr_normalized': np.float32(0.11359454), 'prev_log_return': np.float32(0.11765997), 'usdchf_log_return': np.float32(0.12372393), 'xagusd_log_return': np.float32(0.117795944), 'xtiusd_log_return': np.float32(0.12598653), 'synth_vix_zscore': np.float32(0.1353635)}
[2026-05-15 01:19:53,108 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:19:53,330 INFO] src.engine_xgb: XGB Train Acc: 0.7236 | Test Acc: 0.7236
[2026-05-15 01:19:53,330 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12668462), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1411593), 'atr_normalized': np.float32(0.12651283), 'prev_log_return': np.float32(0.11103146), 'usdchf_log_return': np.float32(0.11765885), 'xagusd_log_return': np.float32(0.12995963), 'xtiusd_log_return': np.float32(0.12674585), 'synth_vix_zscore': np.float32(0.120247476)}
[2026-05-15 01:19:53,331 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:19:53,332 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.38336, 0.21891) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:53,447 INFO] src.backtester: Backtest [H1]: Sharpe=-3.192 | MaxDD=0.152 | WR=0.238 | Return=-9.7% | Trades=168
[2026-05-15 01:19:53,447 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:53,737 INFO] src.engine_xgb: XGB Train Acc: 0.6733 | Test Acc: 0.6733
[2026-05-15 01:19:53,737 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10839055), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11529793), 'atr_normalized': np.float32(0.13628829), 'prev_log_return': np.float32(0.12978084), 'usdchf_log_return': np.float32(0.12173476), 'xagusd_log_return': np.float32(0.13345747), 'xtiusd_log_return': np.float32(0.13301793), 'synth_vix_zscore': np.float32(0.12203218)}
[2026-05-15 01:19:53,738 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:19:54,011 INFO] src.engine_xgb: XGB Train Acc: 0.6710 | Test Acc: 0.6710
[2026-05-15 01:19:54,011 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09671385), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14711161), 'atr_normalized': np.float32(0.11434398), 'prev_log_return': np.float32(0.122258924), 'usdchf_log_return': np.float32(0.12762377), 'xagusd_log_return': np.float32(0.13219574), 'xtiusd_log_return': np.float32(0.12096758), 'synth_vix_zscore': np.float32(0.13878454)}
[2026-05-15 01:19:54,012 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:19:54,265 INFO] src.engine_xgb: XGB Train Acc: 0.6571 | Test Acc: 0.6571
[2026-05-15 01:19:54,266 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12023664), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13267882), 'atr_normalized': np.float32(0.12059468), 'prev_log_return': np.float32(0.12109872), 'usdchf_log_return': np.float32(0.12119299), 'xagusd_log_return': np.float32(0.12820423), 'xtiusd_log_return': np.float32(0.13699484), 'synth_vix_zscore': np.float32(0.11899911)}
[2026-05-15 01:19:54,266 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:19:54,267 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53107, 0.07740) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:54,381 INFO] src.backtester: Backtest [H1]: Sharpe=-3.133 | MaxDD=0.190 | WR=0.235 | Return=-15.3% | Trades=149
[2026-05-15 01:19:54,381 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:54,734 INFO] src.engine_xgb: XGB Train Acc: 0.6313 | Test Acc: 0.6313
[2026-05-15 01:19:54,734 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13407956), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11825133), 'atr_normalized': np.float32(0.12767996), 'prev_log_return': np.float32(0.11927453), 'usdchf_log_return': np.float32(0.121409334), 'xagusd_log_return': np.float32(0.12331929), 'xtiusd_log_return': np.float32(0.1360308), 'synth_vix_zscore': np.float32(0.119955204)}
[2026-05-15 01:19:54,735 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:19:55,061 INFO] src.engine_xgb: XGB Train Acc: 0.6260 | Test Acc: 0.6260
[2026-05-15 01:19:55,061 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10944025), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1367634), 'atr_normalized': np.float32(0.11038597), 'prev_log_return': np.float32(0.11759414), 'usdchf_log_return': np.float32(0.13227098), 'xagusd_log_return': np.float32(0.12726717), 'xtiusd_log_return': np.float32(0.13242672), 'synth_vix_zscore': np.float32(0.13385129)}
[2026-05-15 01:19:55,062 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:19:55,330 INFO] src.engine_xgb: XGB Train Acc: 0.6514 | Test Acc: 0.6514
[2026-05-15 01:19:55,331 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10736183), 'gmm_vol_cluster': np.float32(0.086111695), 'rsi_slope': np.float32(0.13290004), 'atr_normalized': np.float32(0.105964035), 'prev_log_return': np.float32(0.10857214), 'usdchf_log_return': np.float32(0.11256131), 'xagusd_log_return': np.float32(0.110349156), 'xtiusd_log_return': np.float32(0.11370582), 'synth_vix_zscore': np.float32(0.122473955)}
[2026-05-15 01:19:55,331 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:19:55,332 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.38300, 0.44275) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:55,423 INFO] src.backtester: Backtest [H1]: Sharpe=-0.562 | MaxDD=0.128 | WR=0.302 | Return=-3.8% | Trades=86
[2026-05-15 01:19:55,423 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:55,437 INFO] src.optimizer: WFO [H1] window start=12960: trades=86 sharpe=-0.562 cv_sharpe=-3.163 score=-0.306
[2026-05-15 01:19:56,243 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:19:56,243 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:19:56,243 INFO] src.engine_hmm: Bull 0.9827 0.0163 0.0010
[2026-05-15 01:19:56,243 INFO] src.engine_hmm: Bear 0.0166 0.9746 0.0088
[2026-05-15 01:19:56,243 INFO] src.engine_hmm: Chop 0.0000 0.0270 0.9730
[2026-05-15 01:19:56,244 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:19:56,244 INFO] src.engine_hmm: Bull: return=0.005877, vol=-0.694326, rsi_slope=0.012626
[2026-05-15 01:19:56,244 INFO] src.engine_hmm: Bear: return=-0.006034, vol=0.067204, rsi_slope=-0.010021
[2026-05-15 01:19:56,244 INFO] src.engine_hmm: Chop: return=0.000884, vol=1.681732, rsi_slope=-0.006240
[2026-05-15 01:19:56,244 INFO] src.engine_hmm: Total regime transitions: 219
[2026-05-15 01:19:56,245 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-20 20:00:00: Bull -> Bear
[2026-05-15 01:19:56,245 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-22 13:00:00: Bear -> Bull
[2026-05-15 01:19:56,245 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-28 14:00:00: Bull -> Bear
[2026-05-15 01:19:56,245 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-29 13:00:00: Bear -> Bull
[2026-05-15 01:19:56,245 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-11 15:00:00: Bull -> Bear
[2026-05-15 01:19:56,246 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-12 11:00:00: Bear -> Bull
[2026-05-15 01:19:56,246 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-16 16:00:00: Bull -> Bear
[2026-05-15 01:19:56,246 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-16 22:00:00: Bear -> Bull
[2026-05-15 01:19:56,247 INFO] src.engine_hmm: REGIME CHANGE at 2019-05-01 21:00:00: Bull -> Bear
[2026-05-15 01:19:56,247 INFO] src.engine_hmm: REGIME CHANGE at 2019-05-02 18:00:00: Bear -> Bull
[2026-05-15 01:19:56,264 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:19:56,271 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:19:56,453 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-15 01:19:56,454 INFO] src.engine_xgb: XGB Train Acc: 0.7270 | Test Acc: 0.7270
[2026-05-15 01:19:56,454 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14181145), 'atr_normalized': np.float32(0.14703886), 'prev_log_return': np.float32(0.13374926), 'usdchf_log_return': np.float32(0.14382416), 'xagusd_log_return': np.float32(0.1376571), 'xtiusd_log_return': np.float32(0.14130846), 'synth_vix_zscore': np.float32(0.15461062)}
[2026-05-15 01:19:56,454 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:19:56,661 INFO] src.engine_xgb: XGB Train Acc: 0.7246 | Test Acc: 0.7246
[2026-05-15 01:19:56,661 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.098884046), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.117588215), 'atr_normalized': np.float32(0.13726753), 'prev_log_return': np.float32(0.12502134), 'usdchf_log_return': np.float32(0.12902884), 'xagusd_log_return': np.float32(0.12440215), 'xtiusd_log_return': np.float32(0.13792987), 'synth_vix_zscore': np.float32(0.12987794)}
[2026-05-15 01:19:56,661 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:19:56,872 INFO] src.engine_xgb: XGB Train Acc: 0.7398 | Test Acc: 0.7398
[2026-05-15 01:19:56,873 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11373011), 'gmm_vol_cluster': np.float32(0.10724237), 'rsi_slope': np.float32(0.1196021), 'atr_normalized': np.float32(0.10315755), 'prev_log_return': np.float32(0.103835136), 'usdchf_log_return': np.float32(0.10788126), 'xagusd_log_return': np.float32(0.11496634), 'xtiusd_log_return': np.float32(0.11540381), 'synth_vix_zscore': np.float32(0.11418133)}
[2026-05-15 01:19:56,873 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:19:56,875 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.50441, -0.08685) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:56,985 INFO] src.backtester: Backtest [H1]: Sharpe=-4.060 | MaxDD=0.293 | WR=0.276 | Return=-23.2% | Trades=170
[2026-05-15 01:19:56,985 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:57,238 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-15 01:19:57,238 INFO] src.engine_xgb: XGB Train Acc: 0.6483 | Test Acc: 0.6483
[2026-05-15 01:19:57,238 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14317901), 'atr_normalized': np.float32(0.13568819), 'prev_log_return': np.float32(0.13472877), 'usdchf_log_return': np.float32(0.1385703), 'xagusd_log_return': np.float32(0.14993194), 'xtiusd_log_return': np.float32(0.13981812), 'synth_vix_zscore': np.float32(0.15808368)}
[2026-05-15 01:19:57,239 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:19:57,624 INFO] src.engine_xgb: XGB Train Acc: 0.6564 | Test Acc: 0.6564
[2026-05-15 01:19:57,625 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12206413), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1294826), 'atr_normalized': np.float32(0.12676226), 'prev_log_return': np.float32(0.12798436), 'usdchf_log_return': np.float32(0.12730381), 'xagusd_log_return': np.float32(0.12250304), 'xtiusd_log_return': np.float32(0.123782165), 'synth_vix_zscore': np.float32(0.1201176)}
[2026-05-15 01:19:57,625 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:19:57,872 INFO] src.engine_xgb: XGB Train Acc: 0.6737 | Test Acc: 0.6737
[2026-05-15 01:19:57,872 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09875003), 'gmm_vol_cluster': np.float32(0.090012565), 'rsi_slope': np.float32(0.13364029), 'atr_normalized': np.float32(0.10742429), 'prev_log_return': np.float32(0.10822472), 'usdchf_log_return': np.float32(0.11010316), 'xagusd_log_return': np.float32(0.12130519), 'xtiusd_log_return': np.float32(0.11829357), 'synth_vix_zscore': np.float32(0.112246215)}
[2026-05-15 01:19:57,873 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:19:57,874 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.49357, -0.10582) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:57,988 INFO] src.backtester: Backtest [H1]: Sharpe=-0.778 | MaxDD=0.119 | WR=0.312 | Return=-4.3% | Trades=128
[2026-05-15 01:19:57,989 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:58,300 INFO] src.engine_xgb: XGB Train Acc: 0.6050 | Test Acc: 0.6050
[2026-05-15 01:19:58,300 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16796283), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11781982), 'atr_normalized': np.float32(0.11688214), 'prev_log_return': np.float32(0.11519586), 'usdchf_log_return': np.float32(0.119702645), 'xagusd_log_return': np.float32(0.12601678), 'xtiusd_log_return': np.float32(0.11036254), 'synth_vix_zscore': np.float32(0.12605734)}
[2026-05-15 01:19:58,301 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:19:58,570 INFO] src.engine_xgb: XGB Train Acc: 0.6260 | Test Acc: 0.6260
[2026-05-15 01:19:58,570 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10684216), 'gmm_vol_cluster': np.float32(0.10583509), 'rsi_slope': np.float32(0.12400775), 'atr_normalized': np.float32(0.108753875), 'prev_log_return': np.float32(0.10807786), 'usdchf_log_return': np.float32(0.11953983), 'xagusd_log_return': np.float32(0.110761754), 'xtiusd_log_return': np.float32(0.110011294), 'synth_vix_zscore': np.float32(0.10617042)}
[2026-05-15 01:19:58,571 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:19:58,854 INFO] src.engine_xgb: XGB Train Acc: 0.6310 | Test Acc: 0.6310
[2026-05-15 01:19:58,854 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12385746), 'gmm_vol_cluster': np.float32(0.09874654), 'rsi_slope': np.float32(0.117757015), 'atr_normalized': np.float32(0.103790045), 'prev_log_return': np.float32(0.100452185), 'usdchf_log_return': np.float32(0.11074257), 'xagusd_log_return': np.float32(0.12275928), 'xtiusd_log_return': np.float32(0.113800764), 'synth_vix_zscore': np.float32(0.10809416)}
[2026-05-15 01:19:58,854 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:19:58,856 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.36542, 0.20284) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:19:58,944 INFO] src.backtester: Backtest [H1]: Sharpe=-6.528 | MaxDD=0.233 | WR=0.205 | Return=-19.9% | Trades=78
[2026-05-15 01:19:58,945 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:19:58,959 INFO] src.optimizer: WFO [H1] window start=17280: trades=78 sharpe=-6.528 cv_sharpe=-2.419 score=-50.000
[2026-05-15 01:19:59,827 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:19:59,827 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:19:59,828 INFO] src.engine_hmm: Bull 0.9801 0.0026 0.0174
[2026-05-15 01:19:59,828 INFO] src.engine_hmm: Bear 0.0002 0.9696 0.0302
[2026-05-15 01:19:59,828 INFO] src.engine_hmm: Chop 0.0223 0.0066 0.9711
[2026-05-15 01:19:59,828 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:19:59,828 INFO] src.engine_hmm: Bull: return=0.118225, vol=-0.645760, rsi_slope=-0.006624
[2026-05-15 01:19:59,828 INFO] src.engine_hmm: Bear: return=-0.604133, vol=1.928512, rsi_slope=-0.008341
[2026-05-15 01:19:59,829 INFO] src.engine_hmm: Chop: return=0.054888, vol=0.126348, rsi_slope=0.010036
[2026-05-15 01:19:59,829 INFO] src.engine_hmm: Total regime transitions: 247
[2026-05-15 01:19:59,829 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 16:00:00: Bull -> Bear
[2026-05-15 01:19:59,829 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 17:00:00: Bear -> Chop
[2026-05-15 01:19:59,829 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-13 13:00:00: Chop -> Bull
[2026-05-15 01:19:59,830 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 01:00:00: Bull -> Bear
[2026-05-15 01:19:59,830 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 08:00:00: Bear -> Chop
[2026-05-15 01:19:59,830 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-07 14:00:00: Chop -> Bull
[2026-05-15 01:19:59,830 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-08 01:00:00: Bull -> Bear
[2026-05-15 01:19:59,830 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-09 15:00:00: Bear -> Chop
[2026-05-15 01:19:59,830 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-10 11:00:00: Chop -> Bull
[2026-05-15 01:19:59,832 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-27 01:00:00: Bull -> Chop
[2026-05-15 01:19:59,847 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:19:59,854 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:00,032 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-15 01:20:00,033 INFO] src.engine_xgb: XGB Train Acc: 0.7134 | Test Acc: 0.7134
[2026-05-15 01:20:00,033 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14575736), 'atr_normalized': np.float32(0.13799958), 'prev_log_return': np.float32(0.13702106), 'usdchf_log_return': np.float32(0.14268409), 'xagusd_log_return': np.float32(0.15096188), 'xtiusd_log_return': np.float32(0.14597382), 'synth_vix_zscore': np.float32(0.13960226)}
[2026-05-15 01:20:00,034 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:00,233 INFO] src.engine_xgb: XGB Train Acc: 0.7414 | Test Acc: 0.7414
[2026-05-15 01:20:00,233 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09520141), 'gmm_vol_cluster': np.float32(0.119109705), 'rsi_slope': np.float32(0.11720088), 'atr_normalized': np.float32(0.11205805), 'prev_log_return': np.float32(0.1121955), 'usdchf_log_return': np.float32(0.11203698), 'xagusd_log_return': np.float32(0.116031595), 'xtiusd_log_return': np.float32(0.108404696), 'synth_vix_zscore': np.float32(0.10776115)}
[2026-05-15 01:20:00,234 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:00,444 INFO] src.engine_xgb: XGB Train Acc: 0.7236 | Test Acc: 0.7236
[2026-05-15 01:20:00,444 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09115049), 'gmm_vol_cluster': np.float32(0.11579992), 'rsi_slope': np.float32(0.1132784), 'atr_normalized': np.float32(0.115684405), 'prev_log_return': np.float32(0.10571225), 'usdchf_log_return': np.float32(0.110558204), 'xagusd_log_return': np.float32(0.11767908), 'xtiusd_log_return': np.float32(0.11753249), 'synth_vix_zscore': np.float32(0.11260475)}
[2026-05-15 01:20:00,445 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:00,447 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.54544, 0.24324) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:00,565 INFO] src.backtester: Backtest [H1]: Sharpe=-4.370 | MaxDD=0.264 | WR=0.310 | Return=-21.8% | Trades=158
[2026-05-15 01:20:00,565 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:00,825 INFO] src.engine_xgb: XGB Train Acc: 0.6425 | Test Acc: 0.6425
[2026-05-15 01:20:00,825 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.105758734), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12930545), 'atr_normalized': np.float32(0.12941858), 'prev_log_return': np.float32(0.12666532), 'usdchf_log_return': np.float32(0.1267231), 'xagusd_log_return': np.float32(0.13479207), 'xtiusd_log_return': np.float32(0.12187815), 'synth_vix_zscore': np.float32(0.12545855)}
[2026-05-15 01:20:00,826 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:01,074 INFO] src.engine_xgb: XGB Train Acc: 0.6444 | Test Acc: 0.6444
[2026-05-15 01:20:01,075 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08808479), 'gmm_vol_cluster': np.float32(0.11942954), 'rsi_slope': np.float32(0.120095655), 'atr_normalized': np.float32(0.110853985), 'prev_log_return': np.float32(0.11250405), 'usdchf_log_return': np.float32(0.112206176), 'xagusd_log_return': np.float32(0.11020554), 'xtiusd_log_return': np.float32(0.10809523), 'synth_vix_zscore': np.float32(0.118525065)}
[2026-05-15 01:20:01,075 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:01,316 INFO] src.engine_xgb: XGB Train Acc: 0.6591 | Test Acc: 0.6591
[2026-05-15 01:20:01,316 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.109926455), 'gmm_vol_cluster': np.float32(0.07840381), 'rsi_slope': np.float32(0.11060222), 'atr_normalized': np.float32(0.11398631), 'prev_log_return': np.float32(0.10824908), 'usdchf_log_return': np.float32(0.10546224), 'xagusd_log_return': np.float32(0.1244808), 'xtiusd_log_return': np.float32(0.12121444), 'synth_vix_zscore': np.float32(0.12767467)}
[2026-05-15 01:20:01,317 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:01,318 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.48586, 0.08539) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:01,432 INFO] src.backtester: Backtest [H1]: Sharpe=-3.511 | MaxDD=0.203 | WR=0.314 | Return=-16.8% | Trades=159
[2026-05-15 01:20:01,433 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:01,710 INFO] src.engine_xgb: XGB Train Acc: 0.6102 | Test Acc: 0.6102
[2026-05-15 01:20:01,710 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.097315215), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13598496), 'atr_normalized': np.float32(0.12859154), 'prev_log_return': np.float32(0.13120843), 'usdchf_log_return': np.float32(0.123850375), 'xagusd_log_return': np.float32(0.13980371), 'xtiusd_log_return': np.float32(0.12090688), 'synth_vix_zscore': np.float32(0.1223389)}
[2026-05-15 01:20:01,711 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:01,975 INFO] src.engine_xgb: XGB Train Acc: 0.6253 | Test Acc: 0.6253
[2026-05-15 01:20:01,975 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.098390505), 'gmm_vol_cluster': np.float32(0.1413949), 'rsi_slope': np.float32(0.118097864), 'atr_normalized': np.float32(0.10744326), 'prev_log_return': np.float32(0.11131305), 'usdchf_log_return': np.float32(0.102951005), 'xagusd_log_return': np.float32(0.11155939), 'xtiusd_log_return': np.float32(0.09904934), 'synth_vix_zscore': np.float32(0.10980066)}
[2026-05-15 01:20:01,976 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:02,244 INFO] src.engine_xgb: XGB Train Acc: 0.6232 | Test Acc: 0.6232
[2026-05-15 01:20:02,245 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11900887), 'gmm_vol_cluster': np.float32(0.09581116), 'rsi_slope': np.float32(0.11679548), 'atr_normalized': np.float32(0.11772246), 'prev_log_return': np.float32(0.10247573), 'usdchf_log_return': np.float32(0.10129881), 'xagusd_log_return': np.float32(0.12095292), 'xtiusd_log_return': np.float32(0.115427405), 'synth_vix_zscore': np.float32(0.11050717)}
[2026-05-15 01:20:02,245 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:02,246 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.51495, -0.03378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:02,335 INFO] src.backtester: Backtest [H1]: Sharpe=-3.498 | MaxDD=0.140 | WR=0.264 | Return=-11.7% | Trades=110
[2026-05-15 01:20:02,335 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:02,349 INFO] src.optimizer: WFO [H1] window start=21600: trades=110 sharpe=-3.498 cv_sharpe=-3.940 score=-0.500
[2026-05-15 01:20:03,158 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:20:03,159 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:20:03,159 INFO] src.engine_hmm: Bull 0.9618 0.0075 0.0307
[2026-05-15 01:20:03,159 INFO] src.engine_hmm: Bear 0.0435 0.9550 0.0015
[2026-05-15 01:20:03,159 INFO] src.engine_hmm: Chop 0.0169 0.0106 0.9725
[2026-05-15 01:20:03,159 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:20:03,159 INFO] src.engine_hmm: Bull: return=0.119791, vol=0.119598, rsi_slope=0.012136
[2026-05-15 01:20:03,160 INFO] src.engine_hmm: Bear: return=-0.536049, vol=1.507432, rsi_slope=0.007367
[2026-05-15 01:20:03,160 INFO] src.engine_hmm: Chop: return=0.099754, vol=-0.680780, rsi_slope=-0.013456
[2026-05-15 01:20:03,160 INFO] src.engine_hmm: Total regime transitions: 333
[2026-05-15 01:20:03,160 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-07 16:00:00: Bull -> Chop
[2026-05-15 01:20:03,160 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-08 12:00:00: Chop -> Bull
[2026-05-15 01:20:03,160 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-08 19:00:00: Bull -> Bear
[2026-05-15 01:20:03,161 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-09 23:00:00: Bear -> Bull
[2026-05-15 01:20:03,161 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 13:00:00: Bull -> Chop
[2026-05-15 01:20:03,161 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 15:00:00: Chop -> Bull
[2026-05-15 01:20:03,161 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-15 12:00:00: Bull -> Chop
[2026-05-15 01:20:03,161 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-15 16:00:00: Chop -> Bull
[2026-05-15 01:20:03,162 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-16 13:00:00: Bull -> Chop
[2026-05-15 01:20:03,162 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-17 04:00:00: Chop -> Bull
[2026-05-15 01:20:03,177 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:20:03,185 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:03,368 INFO] src.engine_xgb: XGB Train Acc: 0.7395 | Test Acc: 0.7395
[2026-05-15 01:20:03,368 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12156696), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12884514), 'atr_normalized': np.float32(0.12410913), 'prev_log_return': np.float32(0.13159187), 'usdchf_log_return': np.float32(0.12197121), 'xagusd_log_return': np.float32(0.12032045), 'xtiusd_log_return': np.float32(0.1229584), 'synth_vix_zscore': np.float32(0.1286368)}
[2026-05-15 01:20:03,368 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:03,567 INFO] src.engine_xgb: XGB Train Acc: 0.7497 | Test Acc: 0.7497
[2026-05-15 01:20:03,567 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11322594), 'gmm_vol_cluster': np.float32(0.12560283), 'rsi_slope': np.float32(0.11280533), 'atr_normalized': np.float32(0.11183862), 'prev_log_return': np.float32(0.103916496), 'usdchf_log_return': np.float32(0.10730061), 'xagusd_log_return': np.float32(0.11566919), 'xtiusd_log_return': np.float32(0.10068209), 'synth_vix_zscore': np.float32(0.10895891)}
[2026-05-15 01:20:03,568 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:03,781 INFO] src.engine_xgb: XGB Train Acc: 0.7215 | Test Acc: 0.7215
[2026-05-15 01:20:03,781 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10290589), 'gmm_vol_cluster': np.float32(0.1004211), 'rsi_slope': np.float32(0.11684651), 'atr_normalized': np.float32(0.120076835), 'prev_log_return': np.float32(0.106428765), 'usdchf_log_return': np.float32(0.11092606), 'xagusd_log_return': np.float32(0.11417453), 'xtiusd_log_return': np.float32(0.10558411), 'synth_vix_zscore': np.float32(0.12263617)}
[2026-05-15 01:20:03,782 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:03,783 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.16146, 0.63340) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:03,895 INFO] src.backtester: Backtest [H1]: Sharpe=-3.654 | MaxDD=0.180 | WR=0.303 | Return=-15.0% | Trades=185
[2026-05-15 01:20:03,895 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:04,150 INFO] src.engine_xgb: XGB Train Acc: 0.6717 | Test Acc: 0.6717
[2026-05-15 01:20:04,151 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12241872), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12882675), 'atr_normalized': np.float32(0.13260622), 'prev_log_return': np.float32(0.11972784), 'usdchf_log_return': np.float32(0.11140055), 'xagusd_log_return': np.float32(0.13830157), 'xtiusd_log_return': np.float32(0.122418836), 'synth_vix_zscore': np.float32(0.12429946)}
[2026-05-15 01:20:04,151 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:04,386 INFO] src.engine_xgb: XGB Train Acc: 0.6601 | Test Acc: 0.6601
[2026-05-15 01:20:04,387 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.121310994), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1289911), 'atr_normalized': np.float32(0.13265114), 'prev_log_return': np.float32(0.12850764), 'usdchf_log_return': np.float32(0.11582128), 'xagusd_log_return': np.float32(0.119985245), 'xtiusd_log_return': np.float32(0.1264209), 'synth_vix_zscore': np.float32(0.12631172)}
[2026-05-15 01:20:04,387 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:04,629 INFO] src.engine_xgb: XGB Train Acc: 0.6388 | Test Acc: 0.6388
[2026-05-15 01:20:04,630 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10540878), 'gmm_vol_cluster': np.float32(0.10424741), 'rsi_slope': np.float32(0.115264945), 'atr_normalized': np.float32(0.11549783), 'prev_log_return': np.float32(0.10511239), 'usdchf_log_return': np.float32(0.11373208), 'xagusd_log_return': np.float32(0.11450825), 'xtiusd_log_return': np.float32(0.10610645), 'synth_vix_zscore': np.float32(0.120121896)}
[2026-05-15 01:20:04,630 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:04,631 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47142, 0.22575) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:04,749 INFO] src.backtester: Backtest [H1]: Sharpe=-3.491 | MaxDD=0.149 | WR=0.247 | Return=-12.9% | Trades=178
[2026-05-15 01:20:04,749 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:05,057 INFO] src.engine_xgb: XGB Train Acc: 0.6340 | Test Acc: 0.6340
[2026-05-15 01:20:05,057 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11426759), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14447594), 'atr_normalized': np.float32(0.12829316), 'prev_log_return': np.float32(0.1193054), 'usdchf_log_return': np.float32(0.11628963), 'xagusd_log_return': np.float32(0.1282137), 'xtiusd_log_return': np.float32(0.11971975), 'synth_vix_zscore': np.float32(0.12943484)}
[2026-05-15 01:20:05,057 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:05,327 INFO] src.engine_xgb: XGB Train Acc: 0.6273 | Test Acc: 0.6273
[2026-05-15 01:20:05,327 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11968895), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13308935), 'atr_normalized': np.float32(0.1300206), 'prev_log_return': np.float32(0.13014606), 'usdchf_log_return': np.float32(0.12453533), 'xagusd_log_return': np.float32(0.12456513), 'xtiusd_log_return': np.float32(0.12335885), 'synth_vix_zscore': np.float32(0.11459574)}
[2026-05-15 01:20:05,328 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:05,654 INFO] src.engine_xgb: XGB Train Acc: 0.6246 | Test Acc: 0.6246
[2026-05-15 01:20:05,655 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.108927965), 'gmm_vol_cluster': np.float32(0.08995208), 'rsi_slope': np.float32(0.12526865), 'atr_normalized': np.float32(0.115099445), 'prev_log_return': np.float32(0.104156345), 'usdchf_log_return': np.float32(0.11021531), 'xagusd_log_return': np.float32(0.11302773), 'xtiusd_log_return': np.float32(0.10460333), 'synth_vix_zscore': np.float32(0.12874919)}
[2026-05-15 01:20:05,655 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:05,657 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.62208, 0.06248) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:05,753 INFO] src.backtester: Backtest [H1]: Sharpe=-2.443 | MaxDD=0.141 | WR=0.314 | Return=-9.2% | Trades=105
[2026-05-15 01:20:05,753 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:05,767 INFO] src.optimizer: WFO [H1] window start=25920: trades=105 sharpe=-2.443 cv_sharpe=-3.572 score=-0.500
[2026-05-15 01:20:06,612 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:20:06,613 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:20:06,613 INFO] src.engine_hmm: Bull 0.9725 0.0170 0.0105
[2026-05-15 01:20:06,613 INFO] src.engine_hmm: Bear 0.0298 0.9643 0.0059
[2026-05-15 01:20:06,613 INFO] src.engine_hmm: Chop 0.0040 0.0291 0.9669
[2026-05-15 01:20:06,613 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:20:06,613 INFO] src.engine_hmm: Bull: return=0.048102, vol=-0.675940, rsi_slope=-0.009875
[2026-05-15 01:20:06,614 INFO] src.engine_hmm: Bear: return=-0.067046, vol=0.032316, rsi_slope=-0.004974
[2026-05-15 01:20:06,614 INFO] src.engine_hmm: Chop: return=0.021157, vol=1.376466, rsi_slope=0.030127
[2026-05-15 01:20:06,614 INFO] src.engine_hmm: Total regime transitions: 304
[2026-05-15 01:20:06,614 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-02 13:00:00: Bear -> Bull
[2026-05-15 01:20:06,614 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 15:00:00: Bull -> Chop
[2026-05-15 01:20:06,615 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 01:00:00: Chop -> Bear
[2026-05-15 01:20:06,615 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 12:00:00: Bear -> Bull
[2026-05-15 01:20:06,615 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-08 16:00:00: Bull -> Bear
[2026-05-15 01:20:06,615 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-09 11:00:00: Bear -> Bull
[2026-05-15 01:20:06,616 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 15:00:00: Bull -> Chop
[2026-05-15 01:20:06,616 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-11 06:00:00: Chop -> Bear
[2026-05-15 01:20:06,616 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-11 12:00:00: Bear -> Bull
[2026-05-15 01:20:06,616 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-14 13:00:00: Bull -> Chop
[2026-05-15 01:20:06,632 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:20:06,640 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:06,819 INFO] src.engine_xgb: XGB Train Acc: 0.7552 | Test Acc: 0.7552
[2026-05-15 01:20:06,819 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11141558), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14123586), 'atr_normalized': np.float32(0.13371219), 'prev_log_return': np.float32(0.12749805), 'usdchf_log_return': np.float32(0.12176773), 'xagusd_log_return': np.float32(0.12823969), 'xtiusd_log_return': np.float32(0.11105048), 'synth_vix_zscore': np.float32(0.12508045)}
[2026-05-15 01:20:06,820 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:07,016 INFO] src.engine_xgb: XGB Train Acc: 0.7288 | Test Acc: 0.7288
[2026-05-15 01:20:07,017 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13397183), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12810759), 'atr_normalized': np.float32(0.12144598), 'prev_log_return': np.float32(0.11678657), 'usdchf_log_return': np.float32(0.120803036), 'xagusd_log_return': np.float32(0.11918847), 'xtiusd_log_return': np.float32(0.12726921), 'synth_vix_zscore': np.float32(0.13242733)}
[2026-05-15 01:20:07,017 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:07,237 INFO] src.engine_xgb: XGB Train Acc: 0.7165 | Test Acc: 0.7165
[2026-05-15 01:20:07,237 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1095266), 'gmm_vol_cluster': np.float32(0.122983515), 'rsi_slope': np.float32(0.11550183), 'atr_normalized': np.float32(0.10651388), 'prev_log_return': np.float32(0.106930554), 'usdchf_log_return': np.float32(0.11498137), 'xagusd_log_return': np.float32(0.11291236), 'xtiusd_log_return': np.float32(0.10559412), 'synth_vix_zscore': np.float32(0.1050558)}
[2026-05-15 01:20:07,238 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:07,239 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.56732, -0.02191) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:07,353 INFO] src.backtester: Backtest [H1]: Sharpe=-0.952 | MaxDD=0.092 | WR=0.289 | Return=-4.6% | Trades=166
[2026-05-15 01:20:07,353 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:07,615 INFO] src.engine_xgb: XGB Train Acc: 0.6727 | Test Acc: 0.6727
[2026-05-15 01:20:07,616 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12812868), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1423353), 'atr_normalized': np.float32(0.11728626), 'prev_log_return': np.float32(0.12743095), 'usdchf_log_return': np.float32(0.11710458), 'xagusd_log_return': np.float32(0.13169062), 'xtiusd_log_return': np.float32(0.11073387), 'synth_vix_zscore': np.float32(0.12528981)}
[2026-05-15 01:20:07,616 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:07,865 INFO] src.engine_xgb: XGB Train Acc: 0.6611 | Test Acc: 0.6611
[2026-05-15 01:20:07,865 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11148764), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12294638), 'atr_normalized': np.float32(0.12291339), 'prev_log_return': np.float32(0.12982014), 'usdchf_log_return': np.float32(0.122221805), 'xagusd_log_return': np.float32(0.13391818), 'xtiusd_log_return': np.float32(0.12625305), 'synth_vix_zscore': np.float32(0.13043933)}
[2026-05-15 01:20:07,866 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:08,108 INFO] src.engine_xgb: XGB Train Acc: 0.6601 | Test Acc: 0.6601
[2026-05-15 01:20:08,108 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10902663), 'gmm_vol_cluster': np.float32(0.10862329), 'rsi_slope': np.float32(0.120928906), 'atr_normalized': np.float32(0.103273965), 'prev_log_return': np.float32(0.11492014), 'usdchf_log_return': np.float32(0.10440981), 'xagusd_log_return': np.float32(0.12271527), 'xtiusd_log_return': np.float32(0.1081869), 'synth_vix_zscore': np.float32(0.10791516)}
[2026-05-15 01:20:08,108 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:08,110 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47816, 0.15210) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:08,225 INFO] src.backtester: Backtest [H1]: Sharpe=-2.792 | MaxDD=0.163 | WR=0.268 | Return=-12.6% | Trades=138
[2026-05-15 01:20:08,225 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:08,497 INFO] src.engine_xgb: XGB Train Acc: 0.6351 | Test Acc: 0.6351
[2026-05-15 01:20:08,497 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11648742), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.122513354), 'atr_normalized': np.float32(0.13344395), 'prev_log_return': np.float32(0.12044383), 'usdchf_log_return': np.float32(0.11826763), 'xagusd_log_return': np.float32(0.13487518), 'xtiusd_log_return': np.float32(0.12634316), 'synth_vix_zscore': np.float32(0.12762552)}
[2026-05-15 01:20:08,498 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:08,766 INFO] src.engine_xgb: XGB Train Acc: 0.6519 | Test Acc: 0.6519
[2026-05-15 01:20:08,766 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.108978696), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13302775), 'atr_normalized': np.float32(0.12972373), 'prev_log_return': np.float32(0.1288055), 'usdchf_log_return': np.float32(0.12661046), 'xagusd_log_return': np.float32(0.13084452), 'xtiusd_log_return': np.float32(0.12149506), 'synth_vix_zscore': np.float32(0.12051424)}
[2026-05-15 01:20:08,767 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:09,038 INFO] src.engine_xgb: XGB Train Acc: 0.6269 | Test Acc: 0.6269
[2026-05-15 01:20:09,039 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12284549), 'gmm_vol_cluster': np.float32(0.12634723), 'rsi_slope': np.float32(0.11582768), 'atr_normalized': np.float32(0.11034814), 'prev_log_return': np.float32(0.11095227), 'usdchf_log_return': np.float32(0.0994932), 'xagusd_log_return': np.float32(0.10201059), 'xtiusd_log_return': np.float32(0.100783646), 'synth_vix_zscore': np.float32(0.11139178)}
[2026-05-15 01:20:09,039 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:09,040 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.40708, 0.22442) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:09,128 INFO] src.backtester: Backtest [H1]: Sharpe=-2.640 | MaxDD=0.096 | WR=0.255 | Return=-7.3% | Trades=94
[2026-05-15 01:20:09,128 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:09,141 INFO] src.optimizer: WFO [H1] window start=30240: trades=94 sharpe=-2.640 cv_sharpe=-1.872 score=-0.500
[2026-05-15 01:20:10,294 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:20:10,294 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:20:10,294 INFO] src.engine_hmm: Bull 0.9697 0.0259 0.0045
[2026-05-15 01:20:10,294 INFO] src.engine_hmm: Bear 0.0105 0.9581 0.0314
[2026-05-15 01:20:10,295 INFO] src.engine_hmm: Chop 0.0113 0.0205 0.9683
[2026-05-15 01:20:10,295 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:20:10,295 INFO] src.engine_hmm: Bull: return=0.308613, vol=1.282288, rsi_slope=0.023364
[2026-05-15 01:20:10,295 INFO] src.engine_hmm: Bear: return=-0.115850, vol=-0.081353, rsi_slope=-0.013215
[2026-05-15 01:20:10,296 INFO] src.engine_hmm: Chop: return=-0.106075, vol=-0.809109, rsi_slope=-0.003938
[2026-05-15 01:20:10,296 INFO] src.engine_hmm: Total regime transitions: 343
[2026-05-15 01:20:10,296 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-23 07:00:00: Bear -> Chop
[2026-05-15 01:20:10,297 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-24 04:00:00: Chop -> Bull
[2026-05-15 01:20:10,297 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-03 06:00:00: Bull -> Bear
[2026-05-15 01:20:10,297 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-03 18:00:00: Bear -> Chop
[2026-05-15 01:20:10,298 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-04 02:00:00: Chop -> Bull
[2026-05-15 01:20:10,298 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-11 09:00:00: Bull -> Bear
[2026-05-15 01:20:10,298 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-11 13:00:00: Bear -> Bull
[2026-05-15 01:20:10,298 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-14 12:00:00: Bull -> Bear
[2026-05-15 01:20:10,299 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-15 07:00:00: Bear -> Bull
[2026-05-15 01:20:10,299 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-16 09:00:00: Bull -> Bear
[2026-05-15 01:20:10,319 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:20:10,330 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:10,564 INFO] src.engine_xgb: XGB Train Acc: 0.7322 | Test Acc: 0.7322
[2026-05-15 01:20:10,565 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.113975264), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1224555), 'atr_normalized': np.float32(0.13028282), 'prev_log_return': np.float32(0.11809087), 'usdchf_log_return': np.float32(0.1322637), 'xagusd_log_return': np.float32(0.12208926), 'xtiusd_log_return': np.float32(0.12296577), 'synth_vix_zscore': np.float32(0.1378768)}
[2026-05-15 01:20:10,565 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:10,776 INFO] src.engine_xgb: XGB Train Acc: 0.7571 | Test Acc: 0.7571
[2026-05-15 01:20:10,776 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11469761), 'gmm_vol_cluster': np.float32(0.11742892), 'rsi_slope': np.float32(0.10487422), 'atr_normalized': np.float32(0.105460025), 'prev_log_return': np.float32(0.11700245), 'usdchf_log_return': np.float32(0.112059586), 'xagusd_log_return': np.float32(0.10850769), 'xtiusd_log_return': np.float32(0.108728446), 'synth_vix_zscore': np.float32(0.11124105)}
[2026-05-15 01:20:10,777 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:11,043 INFO] src.engine_xgb: XGB Train Acc: 0.7175 | Test Acc: 0.7175
[2026-05-15 01:20:11,044 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12140734), 'gmm_vol_cluster': np.float32(0.109549105), 'rsi_slope': np.float32(0.11024859), 'atr_normalized': np.float32(0.111843795), 'prev_log_return': np.float32(0.111649044), 'usdchf_log_return': np.float32(0.10828184), 'xagusd_log_return': np.float32(0.12122378), 'xtiusd_log_return': np.float32(0.10425875), 'synth_vix_zscore': np.float32(0.10153775)}
[2026-05-15 01:20:11,044 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:11,046 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.42962, 0.34995) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:11,161 INFO] src.backtester: Backtest [H1]: Sharpe=-2.775 | MaxDD=0.156 | WR=0.293 | Return=-13.2% | Trades=174
[2026-05-15 01:20:11,161 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:11,434 INFO] src.engine_xgb: XGB Train Acc: 0.6655 | Test Acc: 0.6655
[2026-05-15 01:20:11,434 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09612407), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12805311), 'atr_normalized': np.float32(0.13037075), 'prev_log_return': np.float32(0.12189777), 'usdchf_log_return': np.float32(0.13858175), 'xagusd_log_return': np.float32(0.12351694), 'xtiusd_log_return': np.float32(0.12116142), 'synth_vix_zscore': np.float32(0.14029424)}
[2026-05-15 01:20:11,435 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:11,698 INFO] src.engine_xgb: XGB Train Acc: 0.6835 | Test Acc: 0.6835
[2026-05-15 01:20:11,699 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11476214), 'gmm_vol_cluster': np.float32(0.12861273), 'rsi_slope': np.float32(0.11647956), 'atr_normalized': np.float32(0.1053841), 'prev_log_return': np.float32(0.10133312), 'usdchf_log_return': np.float32(0.111359), 'xagusd_log_return': np.float32(0.10533755), 'xtiusd_log_return': np.float32(0.10848938), 'synth_vix_zscore': np.float32(0.10824242)}
[2026-05-15 01:20:11,699 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:11,975 INFO] src.engine_xgb: XGB Train Acc: 0.6596 | Test Acc: 0.6596
[2026-05-15 01:20:11,975 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.134187), 'gmm_vol_cluster': np.float32(0.09684361), 'rsi_slope': np.float32(0.11006374), 'atr_normalized': np.float32(0.10096603), 'prev_log_return': np.float32(0.11409386), 'usdchf_log_return': np.float32(0.109261066), 'xagusd_log_return': np.float32(0.11009434), 'xtiusd_log_return': np.float32(0.11019714), 'synth_vix_zscore': np.float32(0.114293225)}
[2026-05-15 01:20:11,976 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:11,977 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47849, 0.22854) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:12,093 INFO] src.backtester: Backtest [H1]: Sharpe=-0.695 | MaxDD=0.050 | WR=0.307 | Return=-2.7% | Trades=153
[2026-05-15 01:20:12,094 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:12,390 INFO] src.engine_xgb: XGB Train Acc: 0.6420 | Test Acc: 0.6420
[2026-05-15 01:20:12,390 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15032658), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.113447785), 'atr_normalized': np.float32(0.11620306), 'prev_log_return': np.float32(0.12233514), 'usdchf_log_return': np.float32(0.13109256), 'xagusd_log_return': np.float32(0.12328542), 'xtiusd_log_return': np.float32(0.11730492), 'synth_vix_zscore': np.float32(0.12600452)}
[2026-05-15 01:20:12,391 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:12,656 INFO] src.engine_xgb: XGB Train Acc: 0.6408 | Test Acc: 0.6408
[2026-05-15 01:20:12,657 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09963922), 'gmm_vol_cluster': np.float32(0.14355475), 'rsi_slope': np.float32(0.11805544), 'atr_normalized': np.float32(0.11916006), 'prev_log_return': np.float32(0.09977351), 'usdchf_log_return': np.float32(0.10891995), 'xagusd_log_return': np.float32(0.104703665), 'xtiusd_log_return': np.float32(0.10547845), 'synth_vix_zscore': np.float32(0.10071492)}
[2026-05-15 01:20:12,657 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:12,987 INFO] src.engine_xgb: XGB Train Acc: 0.6310 | Test Acc: 0.6310
[2026-05-15 01:20:12,988 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.120379746), 'gmm_vol_cluster': np.float32(0.09991566), 'rsi_slope': np.float32(0.11152483), 'atr_normalized': np.float32(0.10629272), 'prev_log_return': np.float32(0.11644214), 'usdchf_log_return': np.float32(0.10780973), 'xagusd_log_return': np.float32(0.1077932), 'xtiusd_log_return': np.float32(0.110318825), 'synth_vix_zscore': np.float32(0.119523145)}
[2026-05-15 01:20:12,988 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:12,989 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.64128, 0.06038) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:13,083 INFO] src.backtester: Backtest [H1]: Sharpe=-2.461 | MaxDD=0.081 | WR=0.245 | Return=-7.1% | Trades=98
[2026-05-15 01:20:13,083 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:13,097 INFO] src.optimizer: WFO [H1] window start=34560: trades=98 sharpe=-2.461 cv_sharpe=-1.735 score=-0.500
[2026-05-15 01:20:13,835 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:20:13,836 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:20:13,836 INFO] src.engine_hmm: Bull 0.9683 0.0035 0.0282
[2026-05-15 01:20:13,836 INFO] src.engine_hmm: Bear 0.0068 0.9693 0.0239
[2026-05-15 01:20:13,836 INFO] src.engine_hmm: Chop 0.0095 0.0273 0.9632
[2026-05-15 01:20:13,837 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:20:13,837 INFO] src.engine_hmm: Bull: return=0.305375, vol=1.484862, rsi_slope=-0.010387
[2026-05-15 01:20:13,837 INFO] src.engine_hmm: Bear: return=-0.103453, vol=-0.816227, rsi_slope=-0.001881
[2026-05-15 01:20:13,837 INFO] src.engine_hmm: Chop: return=-0.056948, vol=0.020343, rsi_slope=0.007062
[2026-05-15 01:20:13,837 INFO] src.engine_hmm: Total regime transitions: 328
[2026-05-15 01:20:13,838 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-16 06:00:00: Bull -> Chop
[2026-05-15 01:20:13,838 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-18 12:00:00: Chop -> Bear
[2026-05-15 01:20:13,838 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-18 16:00:00: Bear -> Chop
[2026-05-15 01:20:13,838 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-22 14:00:00: Chop -> Bear
[2026-05-15 01:20:13,839 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-23 10:00:00: Bear -> Chop
[2026-05-15 01:20:13,839 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-24 18:00:00: Chop -> Bear
[2026-05-15 01:20:13,839 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-28 03:00:00: Bear -> Chop
[2026-05-15 01:20:13,839 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 02:00:00: Chop -> Bear
[2026-05-15 01:20:13,840 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 17:00:00: Bear -> Chop
[2026-05-15 01:20:13,840 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 21:00:00: Chop -> Bull
[2026-05-15 01:20:13,858 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:20:13,867 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:14,087 INFO] src.engine_xgb: XGB Train Acc: 0.7238 | Test Acc: 0.7238
[2026-05-15 01:20:14,088 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13215332), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.120856136), 'atr_normalized': np.float32(0.123562604), 'prev_log_return': np.float32(0.11970717), 'usdchf_log_return': np.float32(0.1341516), 'xagusd_log_return': np.float32(0.1232098), 'xtiusd_log_return': np.float32(0.123531885), 'synth_vix_zscore': np.float32(0.122827515)}
[2026-05-15 01:20:14,088 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:14,305 INFO] src.engine_xgb: XGB Train Acc: 0.7466 | Test Acc: 0.7466
[2026-05-15 01:20:14,306 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.124947265), 'gmm_vol_cluster': np.float32(0.108364895), 'rsi_slope': np.float32(0.10874898), 'atr_normalized': np.float32(0.116173886), 'prev_log_return': np.float32(0.115722254), 'usdchf_log_return': np.float32(0.10230638), 'xagusd_log_return': np.float32(0.105533905), 'xtiusd_log_return': np.float32(0.111919574), 'synth_vix_zscore': np.float32(0.10628296)}
[2026-05-15 01:20:14,306 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:14,565 INFO] src.engine_xgb: XGB Train Acc: 0.7409 | Test Acc: 0.7409
[2026-05-15 01:20:14,566 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11083348), 'gmm_vol_cluster': np.float32(0.117003724), 'rsi_slope': np.float32(0.11541901), 'atr_normalized': np.float32(0.111393556), 'prev_log_return': np.float32(0.107418634), 'usdchf_log_return': np.float32(0.112160325), 'xagusd_log_return': np.float32(0.11505875), 'xtiusd_log_return': np.float32(0.10496875), 'synth_vix_zscore': np.float32(0.10574379)}
[2026-05-15 01:20:14,566 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:14,568 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.13686, 0.71017) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:14,689 INFO] src.backtester: Backtest [H1]: Sharpe=-1.698 | MaxDD=0.079 | WR=0.304 | Return=-4.7% | Trades=115
[2026-05-15 01:20:14,689 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:15,028 INFO] src.engine_xgb: XGB Train Acc: 0.6743 | Test Acc: 0.6743
[2026-05-15 01:20:15,028 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.111073256), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12494246), 'atr_normalized': np.float32(0.12697971), 'prev_log_return': np.float32(0.12889396), 'usdchf_log_return': np.float32(0.1211355), 'xagusd_log_return': np.float32(0.12743591), 'xtiusd_log_return': np.float32(0.13034461), 'synth_vix_zscore': np.float32(0.12919459)}
[2026-05-15 01:20:15,029 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:15,281 INFO] src.engine_xgb: XGB Train Acc: 0.6668 | Test Acc: 0.6668
[2026-05-15 01:20:15,282 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12314188), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12573352), 'atr_normalized': np.float32(0.121444754), 'prev_log_return': np.float32(0.123554155), 'usdchf_log_return': np.float32(0.13022497), 'xagusd_log_return': np.float32(0.11833332), 'xtiusd_log_return': np.float32(0.13463068), 'synth_vix_zscore': np.float32(0.122936696)}
[2026-05-15 01:20:15,282 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:15,534 INFO] src.engine_xgb: XGB Train Acc: 0.6722 | Test Acc: 0.6722
[2026-05-15 01:20:15,534 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10397181), 'gmm_vol_cluster': np.float32(0.10368613), 'rsi_slope': np.float32(0.11257833), 'atr_normalized': np.float32(0.11881844), 'prev_log_return': np.float32(0.11736738), 'usdchf_log_return': np.float32(0.105597645), 'xagusd_log_return': np.float32(0.10385029), 'xtiusd_log_return': np.float32(0.119408585), 'synth_vix_zscore': np.float32(0.114721395)}
[2026-05-15 01:20:15,535 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:15,536 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.51565, 0.29314) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:15,648 INFO] src.backtester: Backtest [H1]: Sharpe=-3.985 | MaxDD=0.200 | WR=0.232 | Return=-17.1% | Trades=142
[2026-05-15 01:20:15,649 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:15,919 INFO] src.engine_xgb: XGB Train Acc: 0.6392 | Test Acc: 0.6392
[2026-05-15 01:20:15,920 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1310953), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.124845736), 'atr_normalized': np.float32(0.124484524), 'prev_log_return': np.float32(0.12547694), 'usdchf_log_return': np.float32(0.12023476), 'xagusd_log_return': np.float32(0.12355207), 'xtiusd_log_return': np.float32(0.12560044), 'synth_vix_zscore': np.float32(0.1247102)}
[2026-05-15 01:20:15,920 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:16,198 INFO] src.engine_xgb: XGB Train Acc: 0.6408 | Test Acc: 0.6408
[2026-05-15 01:20:16,198 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12194253), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11964431), 'atr_normalized': np.float32(0.11321794), 'prev_log_return': np.float32(0.12895577), 'usdchf_log_return': np.float32(0.13169529), 'xagusd_log_return': np.float32(0.12776844), 'xtiusd_log_return': np.float32(0.13175955), 'synth_vix_zscore': np.float32(0.12501614)}
[2026-05-15 01:20:16,199 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:16,542 INFO] src.engine_xgb: XGB Train Acc: 0.6326 | Test Acc: 0.6326
[2026-05-15 01:20:16,543 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09887534), 'gmm_vol_cluster': np.float32(0.11359706), 'rsi_slope': np.float32(0.12243212), 'atr_normalized': np.float32(0.120955974), 'prev_log_return': np.float32(0.10901382), 'usdchf_log_return': np.float32(0.10907167), 'xagusd_log_return': np.float32(0.104118116), 'xtiusd_log_return': np.float32(0.106088474), 'synth_vix_zscore': np.float32(0.115847394)}
[2026-05-15 01:20:16,543 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:16,546 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.46960, 0.34543) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:16,642 INFO] src.backtester: Backtest [H1]: Sharpe=-2.488 | MaxDD=0.118 | WR=0.242 | Return=-6.5% | Trades=95
[2026-05-15 01:20:16,643 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:16,656 INFO] src.optimizer: WFO [H1] window start=38880: trades=95 sharpe=-2.488 cv_sharpe=-2.842 score=-0.500
[2026-05-15 01:20:17,339 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:20:17,339 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:20:17,340 INFO] src.engine_hmm: Bull 0.9663 0.0065 0.0272
[2026-05-15 01:20:17,340 INFO] src.engine_hmm: Bear 0.0294 0.9682 0.0025
[2026-05-15 01:20:17,340 INFO] src.engine_hmm: Chop 0.0225 0.0048 0.9727
[2026-05-15 01:20:17,340 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:20:17,340 INFO] src.engine_hmm: Bull: return=0.142371, vol=0.138488, rsi_slope=0.010721
[2026-05-15 01:20:17,340 INFO] src.engine_hmm: Bear: return=-0.310895, vol=1.702323, rsi_slope=-0.032421
[2026-05-15 01:20:17,340 INFO] src.engine_hmm: Chop: return=-0.029013, vol=-0.732301, rsi_slope=0.000980
[2026-05-15 01:20:17,340 INFO] src.engine_hmm: Total regime transitions: 308
[2026-05-15 01:20:17,342 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-10 20:00:00: Chop -> Bull
[2026-05-15 01:20:17,342 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-11 14:00:00: Bull -> Chop
[2026-05-15 01:20:17,342 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-21 15:00:00: Chop -> Bull
[2026-05-15 01:20:17,342 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-22 05:00:00: Bull -> Chop
[2026-05-15 01:20:17,342 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-23 16:00:00: Chop -> Bull
[2026-05-15 01:20:17,343 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-24 13:00:00: Bull -> Chop
[2026-05-15 01:20:17,343 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-25 18:00:00: Chop -> Bull
[2026-05-15 01:20:17,343 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-28 14:00:00: Bull -> Chop
[2026-05-15 01:20:17,343 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-29 17:00:00: Chop -> Bull
[2026-05-15 01:20:17,343 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-30 14:00:00: Bull -> Chop
[2026-05-15 01:20:17,361 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:20:17,369 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:17,551 INFO] src.engine_xgb: XGB Train Acc: 0.7563 | Test Acc: 0.7563
[2026-05-15 01:20:17,552 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1204973), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.124281205), 'atr_normalized': np.float32(0.124255225), 'prev_log_return': np.float32(0.121981196), 'usdchf_log_return': np.float32(0.13506904), 'xagusd_log_return': np.float32(0.12181542), 'xtiusd_log_return': np.float32(0.13001382), 'synth_vix_zscore': np.float32(0.12208681)}
[2026-05-15 01:20:17,552 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:17,755 INFO] src.engine_xgb: XGB Train Acc: 0.7194 | Test Acc: 0.7194
[2026-05-15 01:20:17,756 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12243155), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11978942), 'atr_normalized': np.float32(0.11979151), 'prev_log_return': np.float32(0.119770765), 'usdchf_log_return': np.float32(0.12024004), 'xagusd_log_return': np.float32(0.12341809), 'xtiusd_log_return': np.float32(0.13201493), 'synth_vix_zscore': np.float32(0.14254367)}
[2026-05-15 01:20:17,756 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:17,964 INFO] src.engine_xgb: XGB Train Acc: 0.7124 | Test Acc: 0.7124
[2026-05-15 01:20:17,965 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10005335), 'gmm_vol_cluster': np.float32(0.09700028), 'rsi_slope': np.float32(0.10197924), 'atr_normalized': np.float32(0.115626104), 'prev_log_return': np.float32(0.1141504), 'usdchf_log_return': np.float32(0.1233062), 'xagusd_log_return': np.float32(0.11337995), 'xtiusd_log_return': np.float32(0.12406015), 'synth_vix_zscore': np.float32(0.11044429)}
[2026-05-15 01:20:17,965 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:17,967 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.73608, -0.15122) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:18,077 INFO] src.backtester: Backtest [H1]: Sharpe=-1.972 | MaxDD=0.123 | WR=0.358 | Return=-9.9% | Trades=151
[2026-05-15 01:20:18,078 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:18,336 INFO] src.engine_xgb: XGB Train Acc: 0.6691 | Test Acc: 0.6691
[2026-05-15 01:20:18,336 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11401309), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11680517), 'atr_normalized': np.float32(0.12253884), 'prev_log_return': np.float32(0.13287605), 'usdchf_log_return': np.float32(0.124616), 'xagusd_log_return': np.float32(0.12572621), 'xtiusd_log_return': np.float32(0.13292667), 'synth_vix_zscore': np.float32(0.13049792)}
[2026-05-15 01:20:18,337 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:18,584 INFO] src.engine_xgb: XGB Train Acc: 0.6632 | Test Acc: 0.6632
[2026-05-15 01:20:18,585 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10847594), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12712729), 'atr_normalized': np.float32(0.1248776), 'prev_log_return': np.float32(0.13258772), 'usdchf_log_return': np.float32(0.12157676), 'xagusd_log_return': np.float32(0.12484625), 'xtiusd_log_return': np.float32(0.12524766), 'synth_vix_zscore': np.float32(0.13526078)}
[2026-05-15 01:20:18,585 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:18,857 INFO] src.engine_xgb: XGB Train Acc: 0.6510 | Test Acc: 0.6510
[2026-05-15 01:20:18,858 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11637175), 'gmm_vol_cluster': np.float32(0.11641089), 'rsi_slope': np.float32(0.11165131), 'atr_normalized': np.float32(0.11257169), 'prev_log_return': np.float32(0.111188374), 'usdchf_log_return': np.float32(0.11216126), 'xagusd_log_return': np.float32(0.113127366), 'xtiusd_log_return': np.float32(0.102817215), 'synth_vix_zscore': np.float32(0.10370011)}
[2026-05-15 01:20:18,858 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:18,860 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53526, 0.16378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:18,974 INFO] src.backtester: Backtest [H1]: Sharpe=-0.606 | MaxDD=0.072 | WR=0.311 | Return=-2.4% | Trades=151
[2026-05-15 01:20:18,974 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:19,257 INFO] src.engine_xgb: XGB Train Acc: 0.6295 | Test Acc: 0.6295
[2026-05-15 01:20:19,257 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12906095), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11976472), 'atr_normalized': np.float32(0.12255507), 'prev_log_return': np.float32(0.13388352), 'usdchf_log_return': np.float32(0.12716119), 'xagusd_log_return': np.float32(0.117958434), 'xtiusd_log_return': np.float32(0.13087167), 'synth_vix_zscore': np.float32(0.11874442)}
[2026-05-15 01:20:19,257 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:19,522 INFO] src.engine_xgb: XGB Train Acc: 0.6270 | Test Acc: 0.6270
[2026-05-15 01:20:19,523 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.119476005), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12848917), 'atr_normalized': np.float32(0.12385933), 'prev_log_return': np.float32(0.12072725), 'usdchf_log_return': np.float32(0.121821456), 'xagusd_log_return': np.float32(0.12750854), 'xtiusd_log_return': np.float32(0.1184969), 'synth_vix_zscore': np.float32(0.13962133)}
[2026-05-15 01:20:19,524 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:19,786 INFO] src.engine_xgb: XGB Train Acc: 0.6128 | Test Acc: 0.6128
[2026-05-15 01:20:19,786 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.112625964), 'gmm_vol_cluster': np.float32(0.11951398), 'rsi_slope': np.float32(0.11856738), 'atr_normalized': np.float32(0.113627695), 'prev_log_return': np.float32(0.10971179), 'usdchf_log_return': np.float32(0.1015337), 'xagusd_log_return': np.float32(0.10549327), 'xtiusd_log_return': np.float32(0.11019796), 'synth_vix_zscore': np.float32(0.10872824)}
[2026-05-15 01:20:19,787 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:19,788 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.43440, 0.22813) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:19,881 INFO] src.backtester: Backtest [H1]: Sharpe=-1.195 | MaxDD=0.076 | WR=0.342 | Return=-3.6% | Trades=73
[2026-05-15 01:20:19,882 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:19,896 INFO] src.optimizer: WFO [H1] window start=43200: trades=73 sharpe=-1.195 cv_sharpe=-1.289 score=-0.500
[2026-05-15 01:20:19,896 INFO] src.optimizer: WFO [H1]: 7/8 valid | median_trades=94 | score=-1.014 | std_sharpe=1.669 | WFE=1.05 | window_scores=[-0.306, -50.0, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5]
[2026-05-15 01:20:19,952 INFO] src.optimizer: Trial 31 [H1/headway_cent $15 standard]: score=-1.348 | valid=7/8 | std_sharpe=1.669 | median_trades=94 | WFE=1.05 | scores=[-0.306, -50.0, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5]
Best trial: 23. Best value: -0.320363: 16%|██████████▉ | 32/200 [18:19<1:38:53, 35.32s/it][2026-05-15 01:20:20,953 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:20:20,953 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:20:20,954 INFO] src.engine_hmm: Bull 0.9769 0.0159 0.0072
[2026-05-15 01:20:20,954 INFO] src.engine_hmm: Bear 0.0090 0.9659 0.0251
[2026-05-15 01:20:20,954 INFO] src.engine_hmm: Chop 0.0074 0.0136 0.9790
[2026-05-15 01:20:20,954 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:20:20,954 INFO] src.engine_hmm: Bull: return=0.226980, vol=1.276238, rsi_slope=-0.024752
[2026-05-15 01:20:20,954 INFO] src.engine_hmm: Bear: return=-0.524347, vol=-0.134719, rsi_slope=0.032540
[2026-05-15 01:20:20,955 INFO] src.engine_hmm: Chop: return=0.220778, vol=-0.649528, rsi_slope=-0.007516
[2026-05-15 01:20:20,955 INFO] src.engine_hmm: Total regime transitions: 249
[2026-05-15 01:20:20,955 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-25 14:00:00: Chop -> Bear
[2026-05-15 01:20:20,955 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-29 07:00:00: Bear -> Chop
[2026-05-15 01:20:20,956 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-02 18:00:00: Chop -> Bear
[2026-05-15 01:20:20,956 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-03 15:00:00: Bear -> Chop
[2026-05-15 01:20:20,956 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-10 11:00:00: Chop -> Bear
[2026-05-15 01:20:20,956 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-12 17:00:00: Bear -> Chop
[2026-05-15 01:20:20,956 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-13 10:00:00: Chop -> Bear
[2026-05-15 01:20:20,957 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-16 12:00:00: Bear -> Chop
[2026-05-15 01:20:20,957 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-17 16:00:00: Chop -> Bull
[2026-05-15 01:20:20,957 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-18 13:00:00: Bull -> Bear
[2026-05-15 01:20:20,974 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:20:20,983 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:21,146 INFO] src.engine_xgb: XGB Train Acc: 0.6140 | Test Acc: 0.6140
[2026-05-15 01:20:21,147 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12027824), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11863705), 'atr_normalized': np.float32(0.12382006), 'prev_log_return': np.float32(0.12875277), 'usdchf_log_return': np.float32(0.11821601), 'xagusd_log_return': np.float32(0.13311884), 'xtiusd_log_return': np.float32(0.12963323), 'synth_vix_zscore': np.float32(0.12754382)}
[2026-05-15 01:20:21,147 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:21,312 INFO] src.engine_xgb: XGB Train Acc: 0.6848 | Test Acc: 0.6848
[2026-05-15 01:20:21,312 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11707228), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15189753), 'atr_normalized': np.float32(0.105876304), 'prev_log_return': np.float32(0.11468302), 'usdchf_log_return': np.float32(0.12594026), 'xagusd_log_return': np.float32(0.12361089), 'xtiusd_log_return': np.float32(0.122118175), 'synth_vix_zscore': np.float32(0.13880156)}
[2026-05-15 01:20:21,313 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:21,491 INFO] src.engine_xgb: XGB Train Acc: 0.5935 | Test Acc: 0.5935
[2026-05-15 01:20:21,491 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12976064), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14286266), 'atr_normalized': np.float32(0.123821504), 'prev_log_return': np.float32(0.111541055), 'usdchf_log_return': np.float32(0.111810416), 'xagusd_log_return': np.float32(0.13379742), 'xtiusd_log_return': np.float32(0.13228478), 'synth_vix_zscore': np.float32(0.11412156)}
[2026-05-15 01:20:21,492 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:21,493 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.38336, 0.21891) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:21,600 INFO] src.backtester: Backtest [H1]: Sharpe=-1.827 | MaxDD=0.100 | WR=0.235 | Return=-4.7% | Trades=98
[2026-05-15 01:20:21,600 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:21,813 INFO] src.engine_xgb: XGB Train Acc: 0.5430 | Test Acc: 0.5430
[2026-05-15 01:20:21,814 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.121499375), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.116433874), 'atr_normalized': np.float32(0.13708772), 'prev_log_return': np.float32(0.1298652), 'usdchf_log_return': np.float32(0.12084002), 'xagusd_log_return': np.float32(0.12809156), 'xtiusd_log_return': np.float32(0.1291191), 'synth_vix_zscore': np.float32(0.11706309)}
[2026-05-15 01:20:21,814 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:22,019 INFO] src.engine_xgb: XGB Train Acc: 0.5725 | Test Acc: 0.5725
[2026-05-15 01:20:22,020 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12993261), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14591564), 'atr_normalized': np.float32(0.106901094), 'prev_log_return': np.float32(0.11621795), 'usdchf_log_return': np.float32(0.117059514), 'xagusd_log_return': np.float32(0.13142869), 'xtiusd_log_return': np.float32(0.11632468), 'synth_vix_zscore': np.float32(0.13621981)}
[2026-05-15 01:20:22,020 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:22,222 INFO] src.engine_xgb: XGB Train Acc: 0.5559 | Test Acc: 0.5559
[2026-05-15 01:20:22,223 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13499296), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13964666), 'atr_normalized': np.float32(0.11736522), 'prev_log_return': np.float32(0.112160824), 'usdchf_log_return': np.float32(0.11753642), 'xagusd_log_return': np.float32(0.13262835), 'xtiusd_log_return': np.float32(0.13173272), 'synth_vix_zscore': np.float32(0.11393697)}
[2026-05-15 01:20:22,223 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:22,225 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53107, 0.07740) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:22,334 INFO] src.backtester: Backtest [H1]: Sharpe=-2.194 | MaxDD=0.144 | WR=0.262 | Return=-11.1% | Trades=107
[2026-05-15 01:20:22,335 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:22,560 INFO] src.engine_xgb: XGB Train Acc: 0.5133 | Test Acc: 0.5133
[2026-05-15 01:20:22,561 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13552763), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11839289), 'atr_normalized': np.float32(0.12700133), 'prev_log_return': np.float32(0.12217005), 'usdchf_log_return': np.float32(0.11868022), 'xagusd_log_return': np.float32(0.12099703), 'xtiusd_log_return': np.float32(0.13396661), 'synth_vix_zscore': np.float32(0.12326422)}
[2026-05-15 01:20:22,561 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:22,791 INFO] src.engine_xgb: XGB Train Acc: 0.5384 | Test Acc: 0.5384
[2026-05-15 01:20:22,791 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09808627), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14706337), 'atr_normalized': np.float32(0.11068683), 'prev_log_return': np.float32(0.11325524), 'usdchf_log_return': np.float32(0.13670486), 'xagusd_log_return': np.float32(0.12205544), 'xtiusd_log_return': np.float32(0.13269201), 'synth_vix_zscore': np.float32(0.13945597)}
[2026-05-15 01:20:22,792 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:23,006 INFO] src.engine_xgb: XGB Train Acc: 0.5208 | Test Acc: 0.5208
[2026-05-15 01:20:23,007 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09980591), 'gmm_vol_cluster': np.float32(0.0939105), 'rsi_slope': np.float32(0.14606793), 'atr_normalized': np.float32(0.1003791), 'prev_log_return': np.float32(0.1065576), 'usdchf_log_return': np.float32(0.098777965), 'xagusd_log_return': np.float32(0.11159222), 'xtiusd_log_return': np.float32(0.114064194), 'synth_vix_zscore': np.float32(0.12884462)}
[2026-05-15 01:20:23,007 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:23,008 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.38300, 0.44275) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:23,096 INFO] src.backtester: Backtest [H1]: Sharpe=0.517 | MaxDD=0.081 | WR=0.333 | Return=3.7% | Trades=72
[2026-05-15 01:20:23,096 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:23,109 INFO] src.optimizer: WFO [H1] window start=12960: trades=72 sharpe=0.517 cv_sharpe=-2.010 score=0.348
[2026-05-15 01:20:23,682 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:20:23,682 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:20:23,682 INFO] src.engine_hmm: Bull 0.9764 0.0000 0.0236
[2026-05-15 01:20:23,682 INFO] src.engine_hmm: Bear 0.0000 0.9864 0.0136
[2026-05-15 01:20:23,682 INFO] src.engine_hmm: Chop 0.0074 0.0150 0.9776
[2026-05-15 01:20:23,683 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:20:23,683 INFO] src.engine_hmm: Bull: return=0.310763, vol=1.833639, rsi_slope=-0.025157
[2026-05-15 01:20:23,683 INFO] src.engine_hmm: Bear: return=-0.085840, vol=-0.653844, rsi_slope=0.010888
[2026-05-15 01:20:23,683 INFO] src.engine_hmm: Chop: return=-0.001700, vol=0.155277, rsi_slope=-0.004282
[2026-05-15 01:20:23,684 INFO] src.engine_hmm: Total regime transitions: 189
[2026-05-15 01:20:23,684 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-20 20:00:00: Bear -> Chop
[2026-05-15 01:20:23,684 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-21 21:00:00: Chop -> Bear
[2026-05-15 01:20:23,684 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-28 15:00:00: Bear -> Chop
[2026-05-15 01:20:23,685 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-29 13:00:00: Chop -> Bear
[2026-05-15 01:20:23,685 INFO] src.engine_hmm: REGIME CHANGE at 2019-05-13 15:00:00: Bear -> Chop
[2026-05-15 01:20:23,685 INFO] src.engine_hmm: REGIME CHANGE at 2019-05-14 12:00:00: Chop -> Bear
[2026-05-15 01:20:23,685 INFO] src.engine_hmm: REGIME CHANGE at 2019-05-31 17:00:00: Bear -> Chop
[2026-05-15 01:20:23,685 INFO] src.engine_hmm: REGIME CHANGE at 2019-06-06 14:00:00: Chop -> Bear
[2026-05-15 01:20:23,686 INFO] src.engine_hmm: REGIME CHANGE at 2019-06-07 15:00:00: Bear -> Chop
[2026-05-15 01:20:23,686 INFO] src.engine_hmm: REGIME CHANGE at 2019-06-10 16:00:00: Chop -> Bear
[2026-05-15 01:20:23,702 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:20:23,712 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:23,887 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-15 01:20:23,888 INFO] src.engine_xgb: XGB Train Acc: 0.5858 | Test Acc: 0.5858
[2026-05-15 01:20:23,888 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14243792), 'atr_normalized': np.float32(0.14268355), 'prev_log_return': np.float32(0.13852115), 'usdchf_log_return': np.float32(0.14371026), 'xagusd_log_return': np.float32(0.13962448), 'xtiusd_log_return': np.float32(0.1367808), 'synth_vix_zscore': np.float32(0.1562418)}
[2026-05-15 01:20:23,889 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:24,080 INFO] src.engine_xgb: XGB Train Acc: 0.6377 | Test Acc: 0.6377
[2026-05-15 01:20:24,080 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10113718), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.116586514), 'atr_normalized': np.float32(0.14086778), 'prev_log_return': np.float32(0.11968864), 'usdchf_log_return': np.float32(0.13372493), 'xagusd_log_return': np.float32(0.12392438), 'xtiusd_log_return': np.float32(0.13953258), 'synth_vix_zscore': np.float32(0.124538)}
[2026-05-15 01:20:24,080 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:24,267 INFO] src.engine_xgb: XGB Train Acc: 0.6352 | Test Acc: 0.6352
[2026-05-15 01:20:24,268 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11216519), 'gmm_vol_cluster': np.float32(0.107237116), 'rsi_slope': np.float32(0.12640509), 'atr_normalized': np.float32(0.09794246), 'prev_log_return': np.float32(0.10700634), 'usdchf_log_return': np.float32(0.105138645), 'xagusd_log_return': np.float32(0.11541501), 'xtiusd_log_return': np.float32(0.11786261), 'synth_vix_zscore': np.float32(0.11082754)}
[2026-05-15 01:20:24,268 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:24,270 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.50441, -0.08685) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:24,375 INFO] src.backtester: Backtest [H1]: Sharpe=-2.149 | MaxDD=0.176 | WR=0.317 | Return=-12.2% | Trades=63
[2026-05-15 01:20:24,376 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:24,594 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-15 01:20:24,594 INFO] src.engine_xgb: XGB Train Acc: 0.5352 | Test Acc: 0.5352
[2026-05-15 01:20:24,595 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13922136), 'atr_normalized': np.float32(0.13397813), 'prev_log_return': np.float32(0.1286173), 'usdchf_log_return': np.float32(0.13759387), 'xagusd_log_return': np.float32(0.15204805), 'xtiusd_log_return': np.float32(0.13958797), 'synth_vix_zscore': np.float32(0.16895337)}
[2026-05-15 01:20:24,595 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:24,793 INFO] src.engine_xgb: XGB Train Acc: 0.5308 | Test Acc: 0.5308
[2026-05-15 01:20:24,794 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1184882), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13431521), 'atr_normalized': np.float32(0.1250883), 'prev_log_return': np.float32(0.12499807), 'usdchf_log_return': np.float32(0.12765794), 'xagusd_log_return': np.float32(0.12497566), 'xtiusd_log_return': np.float32(0.12725605), 'synth_vix_zscore': np.float32(0.117220566)}
[2026-05-15 01:20:24,794 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:25,005 INFO] src.engine_xgb: XGB Train Acc: 0.5584 | Test Acc: 0.5584
[2026-05-15 01:20:25,006 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12811136), 'gmm_vol_cluster': np.float32(0.08835496), 'rsi_slope': np.float32(0.133579), 'atr_normalized': np.float32(0.09444454), 'prev_log_return': np.float32(0.101963766), 'usdchf_log_return': np.float32(0.105351456), 'xagusd_log_return': np.float32(0.13026819), 'xtiusd_log_return': np.float32(0.1127615), 'synth_vix_zscore': np.float32(0.10516525)}
[2026-05-15 01:20:25,006 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:25,007 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.49357, -0.10582) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:25,115 INFO] src.backtester: Backtest [H1]: Sharpe=0.379 | MaxDD=0.105 | WR=0.386 | Return=2.6% | Trades=88
[2026-05-15 01:20:25,115 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:25,373 INFO] src.engine_xgb: XGB Train Acc: 0.5282 | Test Acc: 0.5282
[2026-05-15 01:20:25,373 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16058566), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11654443), 'atr_normalized': np.float32(0.11281789), 'prev_log_return': np.float32(0.11675155), 'usdchf_log_return': np.float32(0.120754614), 'xagusd_log_return': np.float32(0.13293327), 'xtiusd_log_return': np.float32(0.11135409), 'synth_vix_zscore': np.float32(0.12825848)}
[2026-05-15 01:20:25,374 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:25,615 INFO] src.engine_xgb: XGB Train Acc: 0.5235 | Test Acc: 0.5235
[2026-05-15 01:20:25,615 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.106679074), 'gmm_vol_cluster': np.float32(0.08764401), 'rsi_slope': np.float32(0.14401226), 'atr_normalized': np.float32(0.10603196), 'prev_log_return': np.float32(0.1102796), 'usdchf_log_return': np.float32(0.12015239), 'xagusd_log_return': np.float32(0.11242126), 'xtiusd_log_return': np.float32(0.10784244), 'synth_vix_zscore': np.float32(0.104937)}
[2026-05-15 01:20:25,616 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:25,859 INFO] src.engine_xgb: XGB Train Acc: 0.5238 | Test Acc: 0.5238
[2026-05-15 01:20:25,860 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.100540504), 'gmm_vol_cluster': np.float32(0.09006965), 'rsi_slope': np.float32(0.13458645), 'atr_normalized': np.float32(0.09906966), 'prev_log_return': np.float32(0.09644959), 'usdchf_log_return': np.float32(0.10938016), 'xagusd_log_return': np.float32(0.14184546), 'xtiusd_log_return': np.float32(0.11755194), 'synth_vix_zscore': np.float32(0.11050662)}
[2026-05-15 01:20:25,860 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:25,861 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.36542, 0.20284) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:25,952 INFO] src.backtester: Backtest [H1]: Sharpe=-1.217 | MaxDD=0.080 | WR=0.424 | Return=-4.0% | Trades=66
[2026-05-15 01:20:25,953 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:25,967 INFO] src.optimizer: WFO [H1] window start=17280: trades=66 sharpe=-1.217 cv_sharpe=-0.885 score=-1.000
[2026-05-15 01:20:26,700 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:20:26,700 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:20:26,700 INFO] src.engine_hmm: Bull 0.9675 0.0091 0.0234
[2026-05-15 01:20:26,700 INFO] src.engine_hmm: Bear 0.0216 0.9756 0.0028
[2026-05-15 01:20:26,700 INFO] src.engine_hmm: Chop 0.0177 0.0063 0.9759
[2026-05-15 01:20:26,700 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:20:26,701 INFO] src.engine_hmm: Bull: return=0.359386, vol=-0.095993, rsi_slope=-0.001687
[2026-05-15 01:20:26,701 INFO] src.engine_hmm: Bear: return=-0.334610, vol=1.207357, rsi_slope=0.009410
[2026-05-15 01:20:26,701 INFO] src.engine_hmm: Chop: return=-0.136397, vol=-0.653836, rsi_slope=-0.004200
[2026-05-15 01:20:26,701 INFO] src.engine_hmm: Total regime transitions: 275
[2026-05-15 01:20:26,701 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 15:00:00: Chop -> Bear
[2026-05-15 01:20:26,702 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 17:00:00: Bear -> Bull
[2026-05-15 01:20:26,702 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-13 13:00:00: Bull -> Chop
[2026-05-15 01:20:26,702 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-13 17:00:00: Chop -> Bull
[2026-05-15 01:20:26,702 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-16 01:00:00: Bull -> Chop
[2026-05-15 01:20:26,702 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-24 18:00:00: Chop -> Bull
[2026-05-15 01:20:26,702 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-27 13:00:00: Bull -> Chop
[2026-05-15 01:20:26,703 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-03 03:00:00: Chop -> Bull
[2026-05-15 01:20:26,703 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 01:00:00: Bull -> Bear
[2026-05-15 01:20:26,703 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 21:00:00: Bear -> Bull
[2026-05-15 01:20:26,718 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:20:26,726 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:26,870 INFO] src.engine_xgb: XGB Train Acc: 0.5669 | Test Acc: 0.5669
[2026-05-15 01:20:26,870 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14026798), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12173777), 'atr_normalized': np.float32(0.10857975), 'prev_log_return': np.float32(0.11308935), 'usdchf_log_return': np.float32(0.12501769), 'xagusd_log_return': np.float32(0.1424342), 'xtiusd_log_return': np.float32(0.13341847), 'synth_vix_zscore': np.float32(0.115454815)}
[2026-05-15 01:20:26,871 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:27,047 INFO] src.engine_xgb: XGB Train Acc: 0.5791 | Test Acc: 0.5791
[2026-05-15 01:20:27,047 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11000075), 'gmm_vol_cluster': np.float32(0.11415387), 'rsi_slope': np.float32(0.11646129), 'atr_normalized': np.float32(0.11672214), 'prev_log_return': np.float32(0.10946588), 'usdchf_log_return': np.float32(0.10491543), 'xagusd_log_return': np.float32(0.111273624), 'xtiusd_log_return': np.float32(0.10745216), 'synth_vix_zscore': np.float32(0.10955482)}
[2026-05-15 01:20:27,047 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:27,242 INFO] src.engine_xgb: XGB Train Acc: 0.5935 | Test Acc: 0.5935
[2026-05-15 01:20:27,243 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12257994), 'gmm_vol_cluster': np.float32(0.108984694), 'rsi_slope': np.float32(0.11617772), 'atr_normalized': np.float32(0.107914984), 'prev_log_return': np.float32(0.10026996), 'usdchf_log_return': np.float32(0.10652349), 'xagusd_log_return': np.float32(0.11644908), 'xtiusd_log_return': np.float32(0.11281553), 'synth_vix_zscore': np.float32(0.108284555)}
[2026-05-15 01:20:27,243 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:27,245 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.54544, 0.24324) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:27,354 INFO] src.backtester: Backtest [H1]: Sharpe=-0.284 | MaxDD=0.104 | WR=0.352 | Return=-1.4% | Trades=128
[2026-05-15 01:20:27,354 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:27,611 INFO] src.engine_xgb: XGB Train Acc: 0.5399 | Test Acc: 0.5399
[2026-05-15 01:20:27,611 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15883215), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13339497), 'atr_normalized': np.float32(0.115907475), 'prev_log_return': np.float32(0.116669014), 'usdchf_log_return': np.float32(0.11599575), 'xagusd_log_return': np.float32(0.13055746), 'xtiusd_log_return': np.float32(0.11436998), 'synth_vix_zscore': np.float32(0.11427321)}
[2026-05-15 01:20:27,611 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:27,880 INFO] src.engine_xgb: XGB Train Acc: 0.5516 | Test Acc: 0.5516
[2026-05-15 01:20:27,880 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11334608), 'gmm_vol_cluster': np.float32(0.15231416), 'rsi_slope': np.float32(0.11808819), 'atr_normalized': np.float32(0.10238183), 'prev_log_return': np.float32(0.10431493), 'usdchf_log_return': np.float32(0.103014804), 'xagusd_log_return': np.float32(0.10620109), 'xtiusd_log_return': np.float32(0.091115534), 'synth_vix_zscore': np.float32(0.10922342)}
[2026-05-15 01:20:27,881 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:28,084 INFO] src.engine_xgb: XGB Train Acc: 0.5402 | Test Acc: 0.5402
[2026-05-15 01:20:28,084 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11489394), 'gmm_vol_cluster': np.float32(0.09466313), 'rsi_slope': np.float32(0.111665174), 'atr_normalized': np.float32(0.10831769), 'prev_log_return': np.float32(0.10503023), 'usdchf_log_return': np.float32(0.10142488), 'xagusd_log_return': np.float32(0.12301249), 'xtiusd_log_return': np.float32(0.12198471), 'synth_vix_zscore': np.float32(0.119007796)}
[2026-05-15 01:20:28,085 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:28,086 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.48586, 0.08539) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:28,200 INFO] src.backtester: Backtest [H1]: Sharpe=-2.367 | MaxDD=0.144 | WR=0.280 | Return=-10.8% | Trades=100
[2026-05-15 01:20:28,201 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:28,425 INFO] src.engine_xgb: XGB Train Acc: 0.5268 | Test Acc: 0.5268
[2026-05-15 01:20:28,426 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11822178), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14310989), 'atr_normalized': np.float32(0.12366605), 'prev_log_return': np.float32(0.12471327), 'usdchf_log_return': np.float32(0.11654525), 'xagusd_log_return': np.float32(0.14265157), 'xtiusd_log_return': np.float32(0.11102455), 'synth_vix_zscore': np.float32(0.1200677)}
[2026-05-15 01:20:28,426 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:28,677 INFO] src.engine_xgb: XGB Train Acc: 0.5384 | Test Acc: 0.5384
[2026-05-15 01:20:28,677 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12726666), 'gmm_vol_cluster': np.float32(0.09950422), 'rsi_slope': np.float32(0.12984683), 'atr_normalized': np.float32(0.10638724), 'prev_log_return': np.float32(0.106999405), 'usdchf_log_return': np.float32(0.10687952), 'xagusd_log_return': np.float32(0.117092624), 'xtiusd_log_return': np.float32(0.09825129), 'synth_vix_zscore': np.float32(0.10777222)}
[2026-05-15 01:20:28,678 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:28,918 INFO] src.engine_xgb: XGB Train Acc: 0.5289 | Test Acc: 0.5289
[2026-05-15 01:20:28,919 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11676151), 'gmm_vol_cluster': np.float32(0.102657825), 'rsi_slope': np.float32(0.11896543), 'atr_normalized': np.float32(0.11987122), 'prev_log_return': np.float32(0.10076899), 'usdchf_log_return': np.float32(0.0991348), 'xagusd_log_return': np.float32(0.12932383), 'xtiusd_log_return': np.float32(0.107499294), 'synth_vix_zscore': np.float32(0.105017066)}
[2026-05-15 01:20:28,919 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:28,921 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.51495, -0.03378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:29,011 INFO] src.backtester: Backtest [H1]: Sharpe=-5.399 | MaxDD=0.162 | WR=0.217 | Return=-14.0% | Trades=106
[2026-05-15 01:20:29,011 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:29,023 INFO] src.optimizer: WFO [H1] window start=21600: trades=106 sharpe=-5.399 cv_sharpe=-1.325 score=-0.500
[2026-05-15 01:20:31,125 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:20:31,126 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:20:31,126 INFO] src.engine_hmm: Bull 0.9777 0.0066 0.0157
[2026-05-15 01:20:31,126 INFO] src.engine_hmm: Bear 0.0048 0.9690 0.0262
[2026-05-15 01:20:31,126 INFO] src.engine_hmm: Chop 0.0329 0.0072 0.9599
[2026-05-15 01:20:31,126 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:20:31,127 INFO] src.engine_hmm: Bull: return=0.408797, vol=-0.581272, rsi_slope=-0.016965
[2026-05-15 01:20:31,127 INFO] src.engine_hmm: Bear: return=-0.629187, vol=1.446509, rsi_slope=0.000185
[2026-05-15 01:20:31,127 INFO] src.engine_hmm: Chop: return=-0.298214, vol=0.113295, rsi_slope=0.026973
[2026-05-15 01:20:31,127 INFO] src.engine_hmm: Total regime transitions: 297
[2026-05-15 01:20:31,127 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-07 18:00:00: Chop -> Bull
[2026-05-15 01:20:31,128 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-08 11:00:00: Bull -> Chop
[2026-05-15 01:20:31,128 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 12:00:00: Chop -> Bull
[2026-05-15 01:20:31,128 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 20:00:00: Bull -> Chop
[2026-05-15 01:20:31,128 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-15 01:00:00: Chop -> Bull
[2026-05-15 01:20:31,128 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-15 16:00:00: Bull -> Chop
[2026-05-15 01:20:31,128 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-16 13:00:00: Chop -> Bull
[2026-05-15 01:20:31,129 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-17 04:00:00: Bull -> Chop
[2026-05-15 01:20:31,129 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-18 04:00:00: Chop -> Bull
[2026-05-15 01:20:31,129 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-18 21:00:00: Bull -> Chop
[2026-05-15 01:20:31,143 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:20:31,151 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:31,303 INFO] src.engine_xgb: XGB Train Acc: 0.6370 | Test Acc: 0.6370
[2026-05-15 01:20:31,303 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12134446), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12946644), 'atr_normalized': np.float32(0.11885314), 'prev_log_return': np.float32(0.13006426), 'usdchf_log_return': np.float32(0.122121505), 'xagusd_log_return': np.float32(0.12332787), 'xtiusd_log_return': np.float32(0.1207473), 'synth_vix_zscore': np.float32(0.134075)}
[2026-05-15 01:20:31,304 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:31,475 INFO] src.engine_xgb: XGB Train Acc: 0.6513 | Test Acc: 0.6513
[2026-05-15 01:20:31,475 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10248895), 'gmm_vol_cluster': np.float32(0.09017315), 'rsi_slope': np.float32(0.12400129), 'atr_normalized': np.float32(0.12524064), 'prev_log_return': np.float32(0.10246314), 'usdchf_log_return': np.float32(0.11388632), 'xagusd_log_return': np.float32(0.12509793), 'xtiusd_log_return': np.float32(0.10502464), 'synth_vix_zscore': np.float32(0.11162393)}
[2026-05-15 01:20:31,476 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:31,665 INFO] src.engine_xgb: XGB Train Acc: 0.6118 | Test Acc: 0.6118
[2026-05-15 01:20:31,666 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10690416), 'gmm_vol_cluster': np.float32(0.09708099), 'rsi_slope': np.float32(0.12208682), 'atr_normalized': np.float32(0.12072892), 'prev_log_return': np.float32(0.09913136), 'usdchf_log_return': np.float32(0.1029037), 'xagusd_log_return': np.float32(0.11746065), 'xtiusd_log_return': np.float32(0.1068532), 'synth_vix_zscore': np.float32(0.12685014)}
[2026-05-15 01:20:31,666 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:31,668 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.16146, 0.63340) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:31,777 INFO] src.backtester: Backtest [H1]: Sharpe=-3.631 | MaxDD=0.183 | WR=0.239 | Return=-15.0% | Trades=134
[2026-05-15 01:20:31,777 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:31,995 INFO] src.engine_xgb: XGB Train Acc: 0.5649 | Test Acc: 0.5649
[2026-05-15 01:20:31,995 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12552378), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13523859), 'atr_normalized': np.float32(0.13602047), 'prev_log_return': np.float32(0.113634825), 'usdchf_log_return': np.float32(0.10659082), 'xagusd_log_return': np.float32(0.13771783), 'xtiusd_log_return': np.float32(0.1237559), 'synth_vix_zscore': np.float32(0.1215178)}
[2026-05-15 01:20:31,996 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:32,225 INFO] src.engine_xgb: XGB Train Acc: 0.5443 | Test Acc: 0.5443
[2026-05-15 01:20:32,225 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0974534), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13747656), 'atr_normalized': np.float32(0.1363771), 'prev_log_return': np.float32(0.12904643), 'usdchf_log_return': np.float32(0.11653231), 'xagusd_log_return': np.float32(0.12942095), 'xtiusd_log_return': np.float32(0.12565354), 'synth_vix_zscore': np.float32(0.12803975)}
[2026-05-15 01:20:32,226 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:32,440 INFO] src.engine_xgb: XGB Train Acc: 0.5402 | Test Acc: 0.5402
[2026-05-15 01:20:32,441 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10003031), 'gmm_vol_cluster': np.float32(0.09641115), 'rsi_slope': np.float32(0.121832915), 'atr_normalized': np.float32(0.115454346), 'prev_log_return': np.float32(0.10594229), 'usdchf_log_return': np.float32(0.11159093), 'xagusd_log_return': np.float32(0.12061563), 'xtiusd_log_return': np.float32(0.09977046), 'synth_vix_zscore': np.float32(0.12835193)}
[2026-05-15 01:20:32,441 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:32,442 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47142, 0.22575) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:32,552 INFO] src.backtester: Backtest [H1]: Sharpe=-1.967 | MaxDD=0.134 | WR=0.301 | Return=-7.7% | Trades=136
[2026-05-15 01:20:32,552 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:32,811 INFO] src.engine_xgb: XGB Train Acc: 0.5316 | Test Acc: 0.5316
[2026-05-15 01:20:32,812 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12542047), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14841765), 'atr_normalized': np.float32(0.12985127), 'prev_log_return': np.float32(0.11876747), 'usdchf_log_return': np.float32(0.117735505), 'xagusd_log_return': np.float32(0.1267847), 'xtiusd_log_return': np.float32(0.109602906), 'synth_vix_zscore': np.float32(0.123420045)}
[2026-05-15 01:20:32,812 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:33,051 INFO] src.engine_xgb: XGB Train Acc: 0.5211 | Test Acc: 0.5211
[2026-05-15 01:20:33,051 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11385451), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.144602), 'atr_normalized': np.float32(0.12428162), 'prev_log_return': np.float32(0.1364103), 'usdchf_log_return': np.float32(0.1250484), 'xagusd_log_return': np.float32(0.12460336), 'xtiusd_log_return': np.float32(0.11979263), 'synth_vix_zscore': np.float32(0.111407205)}
[2026-05-15 01:20:33,052 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:33,276 INFO] src.engine_xgb: XGB Train Acc: 0.5265 | Test Acc: 0.5265
[2026-05-15 01:20:33,277 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.105075516), 'gmm_vol_cluster': np.float32(0.079729095), 'rsi_slope': np.float32(0.13441518), 'atr_normalized': np.float32(0.11590185), 'prev_log_return': np.float32(0.09703286), 'usdchf_log_return': np.float32(0.109411485), 'xagusd_log_return': np.float32(0.12510689), 'xtiusd_log_return': np.float32(0.099835925), 'synth_vix_zscore': np.float32(0.13349122)}
[2026-05-15 01:20:33,277 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:33,278 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.62208, 0.06248) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:33,367 INFO] src.backtester: Backtest [H1]: Sharpe=-3.674 | MaxDD=0.115 | WR=0.267 | Return=-10.2% | Trades=86
[2026-05-15 01:20:33,367 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:33,381 INFO] src.optimizer: WFO [H1] window start=25920: trades=86 sharpe=-3.674 cv_sharpe=-2.799 score=-0.500
[2026-05-15 01:20:33,974 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:20:33,975 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:20:33,975 INFO] src.engine_hmm: Bull 0.9613 0.0324 0.0063
[2026-05-15 01:20:33,975 INFO] src.engine_hmm: Bear 0.0146 0.9756 0.0099
[2026-05-15 01:20:33,975 INFO] src.engine_hmm: Chop 0.0307 0.0070 0.9623
[2026-05-15 01:20:33,975 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:20:33,976 INFO] src.engine_hmm: Bull: return=0.416975, vol=0.038447, rsi_slope=-0.026625
[2026-05-15 01:20:33,976 INFO] src.engine_hmm: Bear: return=-0.234334, vol=-0.555784, rsi_slope=0.002087
[2026-05-15 01:20:33,976 INFO] src.engine_hmm: Chop: return=-0.122717, vol=1.412023, rsi_slope=0.042144
[2026-05-15 01:20:33,976 INFO] src.engine_hmm: Total regime transitions: 309
[2026-05-15 01:20:33,976 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 16:00:00: Bear -> Chop
[2026-05-15 01:20:33,977 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 01:00:00: Chop -> Bull
[2026-05-15 01:20:33,977 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 12:00:00: Bull -> Bear
[2026-05-15 01:20:33,977 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-08 17:00:00: Bear -> Bull
[2026-05-15 01:20:33,977 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-09 11:00:00: Bull -> Bear
[2026-05-15 01:20:33,977 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 15:00:00: Bear -> Chop
[2026-05-15 01:20:33,977 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 16:00:00: Chop -> Bull
[2026-05-15 01:20:33,978 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-11 12:00:00: Bull -> Bear
[2026-05-15 01:20:33,978 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-14 09:00:00: Bear -> Chop
[2026-05-15 01:20:33,978 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-14 17:00:00: Chop -> Bull
[2026-05-15 01:20:33,996 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:20:34,005 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:34,166 INFO] src.engine_xgb: XGB Train Acc: 0.6736 | Test Acc: 0.6736
[2026-05-15 01:20:34,167 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11005139), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14209579), 'atr_normalized': np.float32(0.12941839), 'prev_log_return': np.float32(0.13171232), 'usdchf_log_return': np.float32(0.12228481), 'xagusd_log_return': np.float32(0.1179401), 'xtiusd_log_return': np.float32(0.11701048), 'synth_vix_zscore': np.float32(0.12948674)}
[2026-05-15 01:20:34,167 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:34,344 INFO] src.engine_xgb: XGB Train Acc: 0.6618 | Test Acc: 0.6618
[2026-05-15 01:20:34,344 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12150007), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12921725), 'atr_normalized': np.float32(0.1153346), 'prev_log_return': np.float32(0.12014534), 'usdchf_log_return': np.float32(0.12720393), 'xagusd_log_return': np.float32(0.119686894), 'xtiusd_log_return': np.float32(0.13097903), 'synth_vix_zscore': np.float32(0.13593294)}
[2026-05-15 01:20:34,344 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:34,556 INFO] src.engine_xgb: XGB Train Acc: 0.5681 | Test Acc: 0.5681
[2026-05-15 01:20:34,557 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11861885), 'gmm_vol_cluster': np.float32(0.10858276), 'rsi_slope': np.float32(0.11604698), 'atr_normalized': np.float32(0.114354275), 'prev_log_return': np.float32(0.10647597), 'usdchf_log_return': np.float32(0.1158794), 'xagusd_log_return': np.float32(0.11411506), 'xtiusd_log_return': np.float32(0.10295613), 'synth_vix_zscore': np.float32(0.10297062)}
[2026-05-15 01:20:34,557 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:34,559 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.56732, -0.02191) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:34,667 INFO] src.backtester: Backtest [H1]: Sharpe=-2.288 | MaxDD=0.113 | WR=0.242 | Return=-8.5% | Trades=91
[2026-05-15 01:20:34,668 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:34,879 INFO] src.engine_xgb: XGB Train Acc: 0.5743 | Test Acc: 0.5743
[2026-05-15 01:20:34,880 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13034151), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14761838), 'atr_normalized': np.float32(0.11620451), 'prev_log_return': np.float32(0.12699209), 'usdchf_log_return': np.float32(0.10309542), 'xagusd_log_return': np.float32(0.1374415), 'xtiusd_log_return': np.float32(0.10829602), 'synth_vix_zscore': np.float32(0.1300105)}
[2026-05-15 01:20:34,880 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:35,096 INFO] src.engine_xgb: XGB Train Acc: 0.5490 | Test Acc: 0.5490
[2026-05-15 01:20:35,097 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12871352), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.122452274), 'atr_normalized': np.float32(0.12013769), 'prev_log_return': np.float32(0.121287696), 'usdchf_log_return': np.float32(0.11798456), 'xagusd_log_return': np.float32(0.13302523), 'xtiusd_log_return': np.float32(0.12878147), 'synth_vix_zscore': np.float32(0.1276176)}
[2026-05-15 01:20:35,097 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:35,325 INFO] src.engine_xgb: XGB Train Acc: 0.5554 | Test Acc: 0.5554
[2026-05-15 01:20:35,325 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10889481), 'gmm_vol_cluster': np.float32(0.11240107), 'rsi_slope': np.float32(0.1226444), 'atr_normalized': np.float32(0.09906761), 'prev_log_return': np.float32(0.11454861), 'usdchf_log_return': np.float32(0.09769197), 'xagusd_log_return': np.float32(0.12937106), 'xtiusd_log_return': np.float32(0.103619434), 'synth_vix_zscore': np.float32(0.11176102)}
[2026-05-15 01:20:35,326 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:35,327 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47816, 0.15210) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:35,442 INFO] src.backtester: Backtest [H1]: Sharpe=-1.680 | MaxDD=0.102 | WR=0.295 | Return=-6.0% | Trades=88
[2026-05-15 01:20:35,443 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:35,689 INFO] src.engine_xgb: XGB Train Acc: 0.5275 | Test Acc: 0.5275
[2026-05-15 01:20:35,689 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12538405), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12721482), 'atr_normalized': np.float32(0.12613842), 'prev_log_return': np.float32(0.12160983), 'usdchf_log_return': np.float32(0.117666766), 'xagusd_log_return': np.float32(0.1389904), 'xtiusd_log_return': np.float32(0.11928854), 'synth_vix_zscore': np.float32(0.12370706)}
[2026-05-15 01:20:35,690 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:35,908 INFO] src.engine_xgb: XGB Train Acc: 0.5249 | Test Acc: 0.5249
[2026-05-15 01:20:35,909 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12857793), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13323613), 'atr_normalized': np.float32(0.12379469), 'prev_log_return': np.float32(0.12887757), 'usdchf_log_return': np.float32(0.12239468), 'xagusd_log_return': np.float32(0.12936278), 'xtiusd_log_return': np.float32(0.115305826), 'synth_vix_zscore': np.float32(0.118450426)}
[2026-05-15 01:20:35,909 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:36,139 INFO] src.engine_xgb: XGB Train Acc: 0.5426 | Test Acc: 0.5426
[2026-05-15 01:20:36,140 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11011539), 'gmm_vol_cluster': np.float32(0.1069379), 'rsi_slope': np.float32(0.125621), 'atr_normalized': np.float32(0.109124064), 'prev_log_return': np.float32(0.11915316), 'usdchf_log_return': np.float32(0.10127796), 'xagusd_log_return': np.float32(0.10966107), 'xtiusd_log_return': np.float32(0.10130257), 'synth_vix_zscore': np.float32(0.11680692)}
[2026-05-15 01:20:36,140 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:36,142 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.40708, 0.22442) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:36,226 INFO] src.backtester: Backtest [H1]: Sharpe=-3.431 | MaxDD=0.099 | WR=0.271 | Return=-7.7% | Trades=59
[2026-05-15 01:20:36,226 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:36,239 INFO] src.optimizer: WFO [H1] window start=30240: trades=59 sharpe=-3.431 cv_sharpe=-1.984 score=-0.500
[2026-05-15 01:20:37,408 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:20:37,408 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:20:37,408 INFO] src.engine_hmm: Bull 0.9728 0.0124 0.0148
[2026-05-15 01:20:37,408 INFO] src.engine_hmm: Bear 0.0099 0.9626 0.0275
[2026-05-15 01:20:37,409 INFO] src.engine_hmm: Chop 0.0092 0.0149 0.9758
[2026-05-15 01:20:37,409 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:20:37,409 INFO] src.engine_hmm: Bull: return=0.439287, vol=1.274641, rsi_slope=-0.001132
[2026-05-15 01:20:37,409 INFO] src.engine_hmm: Bear: return=-0.783707, vol=-0.121467, rsi_slope=0.014526
[2026-05-15 01:20:37,409 INFO] src.engine_hmm: Chop: return=0.217656, vol=-0.635009, rsi_slope=-0.007920
[2026-05-15 01:20:37,409 INFO] src.engine_hmm: Total regime transitions: 280
[2026-05-15 01:20:37,410 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-23 07:00:00: Bear -> Chop
[2026-05-15 01:20:37,410 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-24 05:00:00: Chop -> Bull
[2026-05-15 01:20:37,410 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-03 09:00:00: Bull -> Chop
[2026-05-15 01:20:37,410 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-04 02:00:00: Chop -> Bull
[2026-05-15 01:20:37,410 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-11 09:00:00: Bull -> Bear
[2026-05-15 01:20:37,411 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-11 15:00:00: Bear -> Bull
[2026-05-15 01:20:37,411 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-14 12:00:00: Bull -> Bear
[2026-05-15 01:20:37,411 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-15 07:00:00: Bear -> Bull
[2026-05-15 01:20:37,411 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-16 09:00:00: Bull -> Bear
[2026-05-15 01:20:37,411 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-16 21:00:00: Bear -> Bull
[2026-05-15 01:20:37,426 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:20:37,434 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:37,581 INFO] src.engine_xgb: XGB Train Acc: 0.6046 | Test Acc: 0.6046
[2026-05-15 01:20:37,582 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1102316), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12272223), 'atr_normalized': np.float32(0.12971266), 'prev_log_return': np.float32(0.1204847), 'usdchf_log_return': np.float32(0.13297792), 'xagusd_log_return': np.float32(0.12583318), 'xtiusd_log_return': np.float32(0.11983514), 'synth_vix_zscore': np.float32(0.13820262)}
[2026-05-15 01:20:37,582 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:37,742 INFO] src.engine_xgb: XGB Train Acc: 0.6775 | Test Acc: 0.6775
[2026-05-15 01:20:37,742 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.105043344), 'gmm_vol_cluster': np.float32(0.101806834), 'rsi_slope': np.float32(0.10696976), 'atr_normalized': np.float32(0.11386694), 'prev_log_return': np.float32(0.12307213), 'usdchf_log_return': np.float32(0.11270975), 'xagusd_log_return': np.float32(0.11368886), 'xtiusd_log_return': np.float32(0.11082605), 'synth_vix_zscore': np.float32(0.11201629)}
[2026-05-15 01:20:37,742 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:37,910 INFO] src.engine_xgb: XGB Train Acc: 0.6362 | Test Acc: 0.6362
[2026-05-15 01:20:37,911 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11872444), 'gmm_vol_cluster': np.float32(0.10943334), 'rsi_slope': np.float32(0.11332761), 'atr_normalized': np.float32(0.114164054), 'prev_log_return': np.float32(0.11175171), 'usdchf_log_return': np.float32(0.102977484), 'xagusd_log_return': np.float32(0.1293054), 'xtiusd_log_return': np.float32(0.10265061), 'synth_vix_zscore': np.float32(0.09766531)}
[2026-05-15 01:20:37,911 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:37,912 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.42962, 0.34995) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:38,018 INFO] src.backtester: Backtest [H1]: Sharpe=-2.396 | MaxDD=0.119 | WR=0.234 | Return=-10.2% | Trades=111
[2026-05-15 01:20:38,019 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:38,229 INFO] src.engine_xgb: XGB Train Acc: 0.5383 | Test Acc: 0.5383
[2026-05-15 01:20:38,230 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12373092), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12897933), 'atr_normalized': np.float32(0.12927954), 'prev_log_return': np.float32(0.115658656), 'usdchf_log_return': np.float32(0.1318868), 'xagusd_log_return': np.float32(0.11866502), 'xtiusd_log_return': np.float32(0.11546066), 'synth_vix_zscore': np.float32(0.13633901)}
[2026-05-15 01:20:38,230 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:38,482 INFO] src.engine_xgb: XGB Train Acc: 0.6038 | Test Acc: 0.6038
[2026-05-15 01:20:38,483 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09436008), 'gmm_vol_cluster': np.float32(0.12672399), 'rsi_slope': np.float32(0.122075915), 'atr_normalized': np.float32(0.110790506), 'prev_log_return': np.float32(0.10663625), 'usdchf_log_return': np.float32(0.11197849), 'xagusd_log_return': np.float32(0.108648114), 'xtiusd_log_return': np.float32(0.1081059), 'synth_vix_zscore': np.float32(0.110680684)}
[2026-05-15 01:20:38,483 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:38,735 INFO] src.engine_xgb: XGB Train Acc: 0.5711 | Test Acc: 0.5711
[2026-05-15 01:20:38,735 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.122990094), 'gmm_vol_cluster': np.float32(0.0919551), 'rsi_slope': np.float32(0.1106965), 'atr_normalized': np.float32(0.10333029), 'prev_log_return': np.float32(0.119696766), 'usdchf_log_return': np.float32(0.11152231), 'xagusd_log_return': np.float32(0.11028396), 'xtiusd_log_return': np.float32(0.10852996), 'synth_vix_zscore': np.float32(0.120994985)}
[2026-05-15 01:20:38,735 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:38,737 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47849, 0.22854) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:38,848 INFO] src.backtester: Backtest [H1]: Sharpe=-0.834 | MaxDD=0.092 | WR=0.257 | Return=-3.1% | Trades=101
[2026-05-15 01:20:38,849 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:39,121 INFO] src.engine_xgb: XGB Train Acc: 0.5085 | Test Acc: 0.5085
[2026-05-15 01:20:39,122 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11252983), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.114864215), 'atr_normalized': np.float32(0.11731861), 'prev_log_return': np.float32(0.1261565), 'usdchf_log_return': np.float32(0.13175035), 'xagusd_log_return': np.float32(0.13864216), 'xtiusd_log_return': np.float32(0.12515989), 'synth_vix_zscore': np.float32(0.1335784)}
[2026-05-15 01:20:39,122 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:39,355 INFO] src.engine_xgb: XGB Train Acc: 0.5550 | Test Acc: 0.5550
[2026-05-15 01:20:39,355 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.094638325), 'gmm_vol_cluster': np.float32(0.1106691), 'rsi_slope': np.float32(0.12009244), 'atr_normalized': np.float32(0.1312079), 'prev_log_return': np.float32(0.10336038), 'usdchf_log_return': np.float32(0.11485411), 'xagusd_log_return': np.float32(0.11298105), 'xtiusd_log_return': np.float32(0.10415963), 'synth_vix_zscore': np.float32(0.108037025)}
[2026-05-15 01:20:39,356 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:39,588 INFO] src.engine_xgb: XGB Train Acc: 0.5332 | Test Acc: 0.5332
[2026-05-15 01:20:39,588 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.121057086), 'gmm_vol_cluster': np.float32(0.07151357), 'rsi_slope': np.float32(0.11804107), 'atr_normalized': np.float32(0.104661755), 'prev_log_return': np.float32(0.12732841), 'usdchf_log_return': np.float32(0.119964495), 'xagusd_log_return': np.float32(0.110770315), 'xtiusd_log_return': np.float32(0.11197968), 'synth_vix_zscore': np.float32(0.11468363)}
[2026-05-15 01:20:39,589 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:39,590 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.64128, 0.06038) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:39,677 INFO] src.backtester: Backtest [H1]: Sharpe=-1.221 | MaxDD=0.057 | WR=0.241 | Return=-3.1% | Trades=58
[2026-05-15 01:20:39,677 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:39,690 INFO] src.optimizer: WFO [H1] window start=34560: trades=58 sharpe=-1.221 cv_sharpe=-1.615 score=-0.500
[2026-05-15 01:20:40,119 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:20:40,120 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:20:40,120 INFO] src.engine_hmm: Bull 0.9750 0.0075 0.0175
[2026-05-15 01:20:40,120 INFO] src.engine_hmm: Bear 0.0047 0.9718 0.0235
[2026-05-15 01:20:40,120 INFO] src.engine_hmm: Chop 0.0095 0.0160 0.9745
[2026-05-15 01:20:40,120 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:20:40,120 INFO] src.engine_hmm: Bull: return=0.700443, vol=1.311627, rsi_slope=-0.021709
[2026-05-15 01:20:40,120 INFO] src.engine_hmm: Bear: return=-0.847186, vol=-0.160666, rsi_slope=0.031274
[2026-05-15 01:20:40,122 INFO] src.engine_hmm: Chop: return=0.235189, vol=-0.560790, rsi_slope=-0.010812
[2026-05-15 01:20:40,122 INFO] src.engine_hmm: Total regime transitions: 244
[2026-05-15 01:20:40,122 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-16 06:00:00: Bull -> Chop
[2026-05-15 01:20:40,122 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-17 03:00:00: Chop -> Bear
[2026-05-15 01:20:40,122 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-23 20:00:00: Bear -> Chop
[2026-05-15 01:20:40,123 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-28 15:00:00: Chop -> Bear
[2026-05-15 01:20:40,123 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-29 06:00:00: Bear -> Chop
[2026-05-15 01:20:40,123 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 21:00:00: Chop -> Bull
[2026-05-15 01:20:40,123 INFO] src.engine_hmm: REGIME CHANGE at 2022-12-05 12:00:00: Bull -> Bear
[2026-05-15 01:20:40,124 INFO] src.engine_hmm: REGIME CHANGE at 2022-12-07 15:00:00: Bear -> Chop
[2026-05-15 01:20:40,124 INFO] src.engine_hmm: REGIME CHANGE at 2022-12-12 02:00:00: Chop -> Bear
[2026-05-15 01:20:40,124 INFO] src.engine_hmm: REGIME CHANGE at 2022-12-13 08:00:00: Bear -> Chop
[2026-05-15 01:20:40,142 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:20:40,150 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:40,314 INFO] src.engine_xgb: XGB Train Acc: 0.5795 | Test Acc: 0.5795
[2026-05-15 01:20:40,314 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12718624), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.117099546), 'atr_normalized': np.float32(0.11919539), 'prev_log_return': np.float32(0.12312439), 'usdchf_log_return': np.float32(0.13231914), 'xagusd_log_return': np.float32(0.1265705), 'xtiusd_log_return': np.float32(0.1311047), 'synth_vix_zscore': np.float32(0.123400114)}
[2026-05-15 01:20:40,315 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:40,497 INFO] src.engine_xgb: XGB Train Acc: 0.6440 | Test Acc: 0.6440
[2026-05-15 01:20:40,498 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.107304156), 'gmm_vol_cluster': np.float32(0.12035695), 'rsi_slope': np.float32(0.11015494), 'atr_normalized': np.float32(0.11807792), 'prev_log_return': np.float32(0.116478905), 'usdchf_log_return': np.float32(0.10872309), 'xagusd_log_return': np.float32(0.10556344), 'xtiusd_log_return': np.float32(0.10800147), 'synth_vix_zscore': np.float32(0.10533919)}
[2026-05-15 01:20:40,498 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:40,679 INFO] src.engine_xgb: XGB Train Acc: 0.5681 | Test Acc: 0.5681
[2026-05-15 01:20:40,680 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13188489), 'gmm_vol_cluster': np.float32(0.097994804), 'rsi_slope': np.float32(0.11604688), 'atr_normalized': np.float32(0.10642352), 'prev_log_return': np.float32(0.11102829), 'usdchf_log_return': np.float32(0.106651045), 'xagusd_log_return': np.float32(0.11702923), 'xtiusd_log_return': np.float32(0.10866042), 'synth_vix_zscore': np.float32(0.104280904)}
[2026-05-15 01:20:40,680 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:40,681 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.13686, 0.71017) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:40,787 INFO] src.backtester: Backtest [H1]: Sharpe=1.081 | MaxDD=0.032 | WR=0.293 | Return=2.7% | Trades=75
[2026-05-15 01:20:40,788 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:41,005 INFO] src.engine_xgb: XGB Train Acc: 0.5685 | Test Acc: 0.5685
[2026-05-15 01:20:41,006 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.118268564), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1275522), 'atr_normalized': np.float32(0.11894305), 'prev_log_return': np.float32(0.13079672), 'usdchf_log_return': np.float32(0.12291395), 'xagusd_log_return': np.float32(0.13104221), 'xtiusd_log_return': np.float32(0.12783577), 'synth_vix_zscore': np.float32(0.12264762)}
[2026-05-15 01:20:41,006 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:41,210 INFO] src.engine_xgb: XGB Train Acc: 0.5261 | Test Acc: 0.5261
[2026-05-15 01:20:41,211 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.098291636), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12543936), 'atr_normalized': np.float32(0.12357796), 'prev_log_return': np.float32(0.12593523), 'usdchf_log_return': np.float32(0.13345653), 'xagusd_log_return': np.float32(0.12249048), 'xtiusd_log_return': np.float32(0.1462641), 'synth_vix_zscore': np.float32(0.12454476)}
[2026-05-15 01:20:41,211 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:41,446 INFO] src.engine_xgb: XGB Train Acc: 0.5716 | Test Acc: 0.5716
[2026-05-15 01:20:41,447 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12953743), 'gmm_vol_cluster': np.float32(0.0865329), 'rsi_slope': np.float32(0.104447596), 'atr_normalized': np.float32(0.1179365), 'prev_log_return': np.float32(0.12003859), 'usdchf_log_return': np.float32(0.10648767), 'xagusd_log_return': np.float32(0.10463865), 'xtiusd_log_return': np.float32(0.11705409), 'synth_vix_zscore': np.float32(0.113326535)}
[2026-05-15 01:20:41,447 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:41,448 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.51565, 0.29314) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:41,558 INFO] src.backtester: Backtest [H1]: Sharpe=0.199 | MaxDD=0.058 | WR=0.330 | Return=0.9% | Trades=97
[2026-05-15 01:20:41,559 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:41,790 INFO] src.engine_xgb: XGB Train Acc: 0.5088 | Test Acc: 0.5088
[2026-05-15 01:20:41,791 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12168064), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12383874), 'atr_normalized': np.float32(0.124923795), 'prev_log_return': np.float32(0.12411165), 'usdchf_log_return': np.float32(0.12145833), 'xagusd_log_return': np.float32(0.1263619), 'xtiusd_log_return': np.float32(0.12913255), 'synth_vix_zscore': np.float32(0.12849244)}
[2026-05-15 01:20:41,791 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:42,019 INFO] src.engine_xgb: XGB Train Acc: 0.5128 | Test Acc: 0.5128
[2026-05-15 01:20:42,019 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.100085795), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11787558), 'atr_normalized': np.float32(0.11347422), 'prev_log_return': np.float32(0.123094164), 'usdchf_log_return': np.float32(0.13889381), 'xagusd_log_return': np.float32(0.13057725), 'xtiusd_log_return': np.float32(0.13812934), 'synth_vix_zscore': np.float32(0.1378698)}
[2026-05-15 01:20:42,019 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:42,245 INFO] src.engine_xgb: XGB Train Acc: 0.5336 | Test Acc: 0.5336
[2026-05-15 01:20:42,245 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10731618), 'gmm_vol_cluster': np.float32(0.107236266), 'rsi_slope': np.float32(0.12563351), 'atr_normalized': np.float32(0.12746741), 'prev_log_return': np.float32(0.104227304), 'usdchf_log_return': np.float32(0.10063086), 'xagusd_log_return': np.float32(0.107061125), 'xtiusd_log_return': np.float32(0.10156192), 'synth_vix_zscore': np.float32(0.11886545)}
[2026-05-15 01:20:42,246 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:42,247 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.46960, 0.34543) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:42,331 INFO] src.backtester: Backtest [H1]: Sharpe=-3.215 | MaxDD=0.140 | WR=0.281 | Return=-10.0% | Trades=57
[2026-05-15 01:20:42,333 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:42,345 INFO] src.optimizer: WFO [H1] window start=38880: trades=57 sharpe=-3.215 cv_sharpe=0.640 score=-1.000
[2026-05-15 01:20:42,668 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:20:42,668 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:20:42,668 INFO] src.engine_hmm: Bull 0.9756 0.0056 0.0188
[2026-05-15 01:20:42,669 INFO] src.engine_hmm: Bear 0.0106 0.9693 0.0202
[2026-05-15 01:20:42,669 INFO] src.engine_hmm: Chop 0.0126 0.0081 0.9794
[2026-05-15 01:20:42,669 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:20:42,669 INFO] src.engine_hmm: Bull: return=0.886783, vol=-0.073034, rsi_slope=-0.021958
[2026-05-15 01:20:42,669 INFO] src.engine_hmm: Bear: return=-0.755052, vol=1.349809, rsi_slope=0.001029
[2026-05-15 01:20:42,669 INFO] src.engine_hmm: Chop: return=-0.307654, vol=-0.470370, rsi_slope=0.014420
[2026-05-15 01:20:42,670 INFO] src.engine_hmm: Total regime transitions: 234
[2026-05-15 01:20:42,670 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-23 16:00:00: Chop -> Bull
[2026-05-15 01:20:42,670 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-24 13:00:00: Bull -> Chop
[2026-05-15 01:20:42,670 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-29 17:00:00: Chop -> Bull
[2026-05-15 01:20:42,671 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-31 10:00:00: Bull -> Chop
[2026-05-15 01:20:42,671 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-15 16:00:00: Chop -> Bull
[2026-05-15 01:20:42,671 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-18 13:00:00: Bull -> Chop
[2026-05-15 01:20:42,671 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-20 17:00:00: Chop -> Bull
[2026-05-15 01:20:42,672 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-20 23:00:00: Bull -> Chop
[2026-05-15 01:20:42,672 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-26 18:00:00: Chop -> Bear
[2026-05-15 01:20:42,672 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-29 08:00:00: Bear -> Chop
[2026-05-15 01:20:42,689 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:20:42,699 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:42,863 INFO] src.engine_xgb: XGB Train Acc: 0.6684 | Test Acc: 0.6684
[2026-05-15 01:20:42,863 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12455186), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12360267), 'atr_normalized': np.float32(0.11800053), 'prev_log_return': np.float32(0.12759824), 'usdchf_log_return': np.float32(0.13168053), 'xagusd_log_return': np.float32(0.11606798), 'xtiusd_log_return': np.float32(0.13059), 'synth_vix_zscore': np.float32(0.12790813)}
[2026-05-15 01:20:42,863 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:43,033 INFO] src.engine_xgb: XGB Train Acc: 0.6052 | Test Acc: 0.6052
[2026-05-15 01:20:43,034 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11364477), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.115152635), 'atr_normalized': np.float32(0.11542267), 'prev_log_return': np.float32(0.11851777), 'usdchf_log_return': np.float32(0.12337766), 'xagusd_log_return': np.float32(0.12522069), 'xtiusd_log_return': np.float32(0.1355881), 'synth_vix_zscore': np.float32(0.15307572)}
[2026-05-15 01:20:43,034 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:43,207 INFO] src.engine_xgb: XGB Train Acc: 0.6321 | Test Acc: 0.6321
[2026-05-15 01:20:43,208 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.103647806), 'gmm_vol_cluster': np.float32(0.107410915), 'rsi_slope': np.float32(0.09809858), 'atr_normalized': np.float32(0.115362704), 'prev_log_return': np.float32(0.114775546), 'usdchf_log_return': np.float32(0.118589975), 'xagusd_log_return': np.float32(0.10927121), 'xtiusd_log_return': np.float32(0.12125764), 'synth_vix_zscore': np.float32(0.1115856)}
[2026-05-15 01:20:43,208 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:43,210 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.73608, -0.15122) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:43,316 INFO] src.backtester: Backtest [H1]: Sharpe=0.674 | MaxDD=0.056 | WR=0.362 | Return=2.9% | Trades=105
[2026-05-15 01:20:43,316 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:43,543 INFO] src.engine_xgb: XGB Train Acc: 0.5414 | Test Acc: 0.5414
[2026-05-15 01:20:43,543 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12583995), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11671647), 'atr_normalized': np.float32(0.12394505), 'prev_log_return': np.float32(0.1292886), 'usdchf_log_return': np.float32(0.124433234), 'xagusd_log_return': np.float32(0.11939939), 'xtiusd_log_return': np.float32(0.13448922), 'synth_vix_zscore': np.float32(0.12588805)}
[2026-05-15 01:20:43,543 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:43,765 INFO] src.engine_xgb: XGB Train Acc: 0.5224 | Test Acc: 0.5224
[2026-05-15 01:20:43,765 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.108925976), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12413789), 'atr_normalized': np.float32(0.12072352), 'prev_log_return': np.float32(0.13199687), 'usdchf_log_return': np.float32(0.12327855), 'xagusd_log_return': np.float32(0.12702477), 'xtiusd_log_return': np.float32(0.13025811), 'synth_vix_zscore': np.float32(0.13365431)}
[2026-05-15 01:20:43,766 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:43,972 INFO] src.engine_xgb: XGB Train Acc: 0.5331 | Test Acc: 0.5331
[2026-05-15 01:20:43,972 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13534372), 'gmm_vol_cluster': np.float32(0.104231946), 'rsi_slope': np.float32(0.11249604), 'atr_normalized': np.float32(0.11809948), 'prev_log_return': np.float32(0.10696794), 'usdchf_log_return': np.float32(0.111040816), 'xagusd_log_return': np.float32(0.11201676), 'xtiusd_log_return': np.float32(0.10041476), 'synth_vix_zscore': np.float32(0.099388555)}
[2026-05-15 01:20:43,973 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:43,974 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53526, 0.16378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:44,087 INFO] src.backtester: Backtest [H1]: Sharpe=0.869 | MaxDD=0.051 | WR=0.301 | Return=3.6% | Trades=123
[2026-05-15 01:20:44,087 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:44,342 INFO] src.engine_xgb: XGB Train Acc: 0.5233 | Test Acc: 0.5233
[2026-05-15 01:20:44,342 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.17045337), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.107786596), 'atr_normalized': np.float32(0.12294786), 'prev_log_return': np.float32(0.129901), 'usdchf_log_return': np.float32(0.112065606), 'xagusd_log_return': np.float32(0.112946525), 'xtiusd_log_return': np.float32(0.1258643), 'synth_vix_zscore': np.float32(0.11803472)}
[2026-05-15 01:20:44,343 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:44,570 INFO] src.engine_xgb: XGB Train Acc: 0.5187 | Test Acc: 0.5187
[2026-05-15 01:20:44,571 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11839014), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12829645), 'atr_normalized': np.float32(0.11957674), 'prev_log_return': np.float32(0.123806834), 'usdchf_log_return': np.float32(0.11691329), 'xagusd_log_return': np.float32(0.1348213), 'xtiusd_log_return': np.float32(0.11478269), 'synth_vix_zscore': np.float32(0.14341255)}
[2026-05-15 01:20:44,571 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:44,787 INFO] src.engine_xgb: XGB Train Acc: 0.5242 | Test Acc: 0.5242
[2026-05-15 01:20:44,787 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13042608), 'gmm_vol_cluster': np.float32(0.11804331), 'rsi_slope': np.float32(0.10809464), 'atr_normalized': np.float32(0.11413833), 'prev_log_return': np.float32(0.10377924), 'usdchf_log_return': np.float32(0.104179054), 'xagusd_log_return': np.float32(0.10482623), 'xtiusd_log_return': np.float32(0.103386246), 'synth_vix_zscore': np.float32(0.11312684)}
[2026-05-15 01:20:44,788 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:44,789 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.43440, 0.22813) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:44,875 INFO] src.backtester: Backtest [H1]: Sharpe=-0.543 | MaxDD=0.078 | WR=0.310 | Return=-1.6% | Trades=58
[2026-05-15 01:20:44,876 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:44,890 INFO] src.optimizer: WFO [H1] window start=43200: trades=58 sharpe=-0.543 cv_sharpe=0.771 score=-0.527
[2026-05-15 01:20:44,891 INFO] src.optimizer: WFO [H1]: 8/8 valid | median_trades=62 | score=-0.578 | std_sharpe=1.836 | WFE=1.97 | window_scores=[0.348, -1.0, -0.5, -0.5, -0.5, -0.5, -1.0, -0.527]
[2026-05-15 01:20:44,941 INFO] src.optimizer: Trial 32 [H1/headway_cent $15 standard]: score=-0.996 | valid=8/8 | std_sharpe=1.836 | median_trades=62 | WFE=1.97 | scores=[0.348, -1.0, -0.5, -0.5, -0.5, -0.5, -1.0, -0.527]
Best trial: 23. Best value: -0.320363: 16%|███████████▏ | 33/200 [18:44<1:29:41, 32.22s/it][2026-05-15 01:20:46,757 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:20:46,757 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:20:46,757 INFO] src.engine_hmm: Bull 0.9683 0.0128 0.0104 0.0085
[2026-05-15 01:20:46,757 INFO] src.engine_hmm: Bear 0.0088 0.9628 0.0000 0.0285
[2026-05-15 01:20:46,757 INFO] src.engine_hmm: Chop_Low 0.0075 0.0000 0.9702 0.0223
[2026-05-15 01:20:46,757 INFO] src.engine_hmm: Chop_High 0.0071 0.0131 0.0312 0.9486
[2026-05-15 01:20:46,757 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:20:46,758 INFO] src.engine_hmm: Bull: return=1.190790, vol=0.932211, rsi_slope=-0.029814
[2026-05-15 01:20:46,758 INFO] src.engine_hmm: Bear: return=-1.221148, vol=0.997435, rsi_slope=0.036893
[2026-05-15 01:20:46,758 INFO] src.engine_hmm: Chop_Low: return=0.243318, vol=-0.709063, rsi_slope=-0.012751
[2026-05-15 01:20:46,758 INFO] src.engine_hmm: Chop_High: return=-0.415086, vol=-0.317880, rsi_slope=0.015255
[2026-05-15 01:20:46,758 INFO] src.engine_hmm: Total regime transitions: 369
[2026-05-15 01:20:46,759 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-25 13:00:00: Chop_Low -> Chop_High
[2026-05-15 01:20:46,759 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-29 08:00:00: Chop_High -> Chop_Low
[2026-05-15 01:20:46,759 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-02 08:00:00: Chop_Low -> Chop_High
[2026-05-15 01:20:46,759 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-03 15:00:00: Chop_High -> Bull
[2026-05-15 01:20:46,759 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-04 16:00:00: Bull -> Chop_Low
[2026-05-15 01:20:46,759 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-06 04:00:00: Chop_Low -> Chop_High
[2026-05-15 01:20:46,760 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-06 09:00:00: Chop_High -> Chop_Low
[2026-05-15 01:20:46,760 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-10 11:00:00: Chop_Low -> Chop_High
[2026-05-15 01:20:46,760 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-10 14:00:00: Chop_High -> Bear
[2026-05-15 01:20:46,760 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-11 10:00:00: Bear -> Chop_High
[2026-05-15 01:20:46,776 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:20:46,784 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:47,042 INFO] src.engine_xgb: XGB Train Acc: 0.7751 | Test Acc: 0.7751
[2026-05-15 01:20:47,043 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10224565), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11714902), 'atr_normalized': np.float32(0.12335343), 'prev_log_return': np.float32(0.13502134), 'usdchf_log_return': np.float32(0.12254386), 'xagusd_log_return': np.float32(0.13577366), 'xtiusd_log_return': np.float32(0.13805586), 'synth_vix_zscore': np.float32(0.12585716)}
[2026-05-15 01:20:47,043 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:47,348 INFO] src.engine_xgb: XGB Train Acc: 0.7822 | Test Acc: 0.7822
[2026-05-15 01:20:47,349 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10456008), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1432786), 'atr_normalized': np.float32(0.1173622), 'prev_log_return': np.float32(0.116526715), 'usdchf_log_return': np.float32(0.12624879), 'xagusd_log_return': np.float32(0.12522002), 'xtiusd_log_return': np.float32(0.12787239), 'synth_vix_zscore': np.float32(0.13893113)}
[2026-05-15 01:20:47,349 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:47,668 INFO] src.engine_xgb: XGB Train Acc: 0.8039 | Test Acc: 0.8039
[2026-05-15 01:20:47,669 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1104991), 'gmm_vol_cluster': np.float32(0.08035121), 'rsi_slope': np.float32(0.13093923), 'atr_normalized': np.float32(0.117198795), 'prev_log_return': np.float32(0.10834805), 'usdchf_log_return': np.float32(0.111766234), 'xagusd_log_return': np.float32(0.116895325), 'xtiusd_log_return': np.float32(0.12025957), 'synth_vix_zscore': np.float32(0.10374246)}
[2026-05-15 01:20:47,669 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:47,670 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.38336, 0.21891) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:47,791 INFO] src.backtester: Backtest [H1]: Sharpe=-3.590 | MaxDD=0.111 | WR=0.246 | Return=-9.3% | Trades=167
[2026-05-15 01:20:47,791 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:48,196 INFO] src.engine_xgb: XGB Train Acc: 0.6681 | Test Acc: 0.6681
[2026-05-15 01:20:48,196 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10395585), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12153257), 'atr_normalized': np.float32(0.1317536), 'prev_log_return': np.float32(0.12480383), 'usdchf_log_return': np.float32(0.12502316), 'xagusd_log_return': np.float32(0.13283043), 'xtiusd_log_return': np.float32(0.13378072), 'synth_vix_zscore': np.float32(0.12631984)}
[2026-05-15 01:20:48,197 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:48,565 INFO] src.engine_xgb: XGB Train Acc: 0.6773 | Test Acc: 0.6773
[2026-05-15 01:20:48,565 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10389632), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13865061), 'atr_normalized': np.float32(0.11584589), 'prev_log_return': np.float32(0.12314219), 'usdchf_log_return': np.float32(0.1265473), 'xagusd_log_return': np.float32(0.13372068), 'xtiusd_log_return': np.float32(0.12489138), 'synth_vix_zscore': np.float32(0.13330573)}
[2026-05-15 01:20:48,566 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:48,923 INFO] src.engine_xgb: XGB Train Acc: 0.6798 | Test Acc: 0.6798
[2026-05-15 01:20:48,923 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10000109), 'gmm_vol_cluster': np.float32(0.071821615), 'rsi_slope': np.float32(0.12626848), 'atr_normalized': np.float32(0.11527277), 'prev_log_return': np.float32(0.109082125), 'usdchf_log_return': np.float32(0.1159192), 'xagusd_log_return': np.float32(0.121687286), 'xtiusd_log_return': np.float32(0.12825967), 'synth_vix_zscore': np.float32(0.11168768)}
[2026-05-15 01:20:48,924 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:48,925 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53107, 0.07740) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:49,047 INFO] src.backtester: Backtest [H1]: Sharpe=-3.503 | MaxDD=0.163 | WR=0.219 | Return=-14.3% | Trades=137
[2026-05-15 01:20:49,047 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:49,470 INFO] src.engine_xgb: XGB Train Acc: 0.6136 | Test Acc: 0.6136
[2026-05-15 01:20:49,471 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12245193), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12564808), 'atr_normalized': np.float32(0.12786773), 'prev_log_return': np.float32(0.12130427), 'usdchf_log_return': np.float32(0.12704119), 'xagusd_log_return': np.float32(0.12802322), 'xtiusd_log_return': np.float32(0.12706369), 'synth_vix_zscore': np.float32(0.120599814)}
[2026-05-15 01:20:49,471 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:49,975 INFO] src.engine_xgb: XGB Train Acc: 0.6332 | Test Acc: 0.6332
[2026-05-15 01:20:49,975 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.106486306), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14846036), 'atr_normalized': np.float32(0.11179853), 'prev_log_return': np.float32(0.11386206), 'usdchf_log_return': np.float32(0.1323249), 'xagusd_log_return': np.float32(0.12817971), 'xtiusd_log_return': np.float32(0.12614267), 'synth_vix_zscore': np.float32(0.13274553)}
[2026-05-15 01:20:49,976 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:50,440 INFO] src.engine_xgb: XGB Train Acc: 0.6118 | Test Acc: 0.6118
[2026-05-15 01:20:50,441 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.098647036), 'gmm_vol_cluster': np.float32(0.079983406), 'rsi_slope': np.float32(0.13272433), 'atr_normalized': np.float32(0.10940647), 'prev_log_return': np.float32(0.10789388), 'usdchf_log_return': np.float32(0.10999537), 'xagusd_log_return': np.float32(0.11858388), 'xtiusd_log_return': np.float32(0.12001913), 'synth_vix_zscore': np.float32(0.122746505)}
[2026-05-15 01:20:50,441 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:50,443 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.38300, 0.44275) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:50,539 INFO] src.backtester: Backtest [H1]: Sharpe=0.476 | MaxDD=0.101 | WR=0.342 | Return=3.2% | Trades=76
[2026-05-15 01:20:50,540 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:50,554 INFO] src.optimizer: WFO [H1] window start=12960: trades=76 sharpe=0.476 cv_sharpe=-3.547 score=0.355
[2026-05-15 01:20:51,674 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:20:51,674 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:20:51,674 INFO] src.engine_hmm: Bull 0.9677 0.0010 0.0234 0.0080
[2026-05-15 01:20:51,675 INFO] src.engine_hmm: Bear 0.0031 0.9798 0.0171 0.0000
[2026-05-15 01:20:51,675 INFO] src.engine_hmm: Chop_Low 0.0163 0.0186 0.9631 0.0020
[2026-05-15 01:20:51,675 INFO] src.engine_hmm: Chop_High 0.0267 0.0000 0.0012 0.9722
[2026-05-15 01:20:51,675 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:20:51,676 INFO] src.engine_hmm: Bull: return=0.032856, vol=0.414392, rsi_slope=-0.021622
[2026-05-15 01:20:51,676 INFO] src.engine_hmm: Bear: return=-0.043980, vol=-0.777937, rsi_slope=0.004992
[2026-05-15 01:20:51,676 INFO] src.engine_hmm: Chop_Low: return=0.016315, vol=-0.292365, rsi_slope=0.017260
[2026-05-15 01:20:51,676 INFO] src.engine_hmm: Chop_High: return=-0.004717, vol=2.199051, rsi_slope=-0.011369
[2026-05-15 01:20:51,676 INFO] src.engine_hmm: Total regime transitions: 294
[2026-05-15 01:20:51,676 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-20 20:00:00: Bear -> Bull
[2026-05-15 01:20:51,677 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-21 18:00:00: Bull -> Chop_Low
[2026-05-15 01:20:51,677 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-22 14:00:00: Chop_Low -> Bear
[2026-05-15 01:20:51,677 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-28 14:00:00: Bear -> Chop_Low
[2026-05-15 01:20:51,677 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-01 12:00:00: Chop_Low -> Bear
[2026-05-15 01:20:51,677 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-01 18:00:00: Bear -> Chop_Low
[2026-05-15 01:20:51,678 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-02 12:00:00: Chop_Low -> Bear
[2026-05-15 01:20:51,678 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-04 17:00:00: Bear -> Chop_Low
[2026-05-15 01:20:51,678 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-05 13:00:00: Chop_Low -> Bear
[2026-05-15 01:20:51,678 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-11 15:00:00: Bear -> Chop_Low
[2026-05-15 01:20:51,693 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:20:51,701 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:51,973 INFO] src.engine_xgb: XGB Train Acc: 0.8086 | Test Acc: 0.8086
[2026-05-15 01:20:51,974 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12891321), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13071351), 'atr_normalized': np.float32(0.12536016), 'prev_log_return': np.float32(0.11642942), 'usdchf_log_return': np.float32(0.12334027), 'xagusd_log_return': np.float32(0.12011918), 'xtiusd_log_return': np.float32(0.12588786), 'synth_vix_zscore': np.float32(0.12923646)}
[2026-05-15 01:20:51,974 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:52,279 INFO] src.engine_xgb: XGB Train Acc: 0.7791 | Test Acc: 0.7791
[2026-05-15 01:20:52,279 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09155945), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.123445734), 'atr_normalized': np.float32(0.13672248), 'prev_log_return': np.float32(0.118140616), 'usdchf_log_return': np.float32(0.12946504), 'xagusd_log_return': np.float32(0.13132568), 'xtiusd_log_return': np.float32(0.14389716), 'synth_vix_zscore': np.float32(0.12544379)}
[2026-05-15 01:20:52,280 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:52,615 INFO] src.engine_xgb: XGB Train Acc: 0.7551 | Test Acc: 0.7551
[2026-05-15 01:20:52,616 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.087689474), 'gmm_vol_cluster': np.float32(0.08306062), 'rsi_slope': np.float32(0.12425877), 'atr_normalized': np.float32(0.10456164), 'prev_log_return': np.float32(0.11589384), 'usdchf_log_return': np.float32(0.1227888), 'xagusd_log_return': np.float32(0.114647105), 'xtiusd_log_return': np.float32(0.1296973), 'synth_vix_zscore': np.float32(0.117402524)}
[2026-05-15 01:20:52,616 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:52,618 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.50441, -0.08685) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:52,747 INFO] src.backtester: Backtest [H1]: Sharpe=-3.432 | MaxDD=0.253 | WR=0.257 | Return=-18.0% | Trades=148
[2026-05-15 01:20:52,747 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:53,119 INFO] src.engine_xgb: XGB Train Acc: 0.7040 | Test Acc: 0.7040
[2026-05-15 01:20:53,120 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10703427), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12992652), 'atr_normalized': np.float32(0.12369058), 'prev_log_return': np.float32(0.116936244), 'usdchf_log_return': np.float32(0.12546223), 'xagusd_log_return': np.float32(0.12815276), 'xtiusd_log_return': np.float32(0.12264448), 'synth_vix_zscore': np.float32(0.14615296)}
[2026-05-15 01:20:53,120 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:53,484 INFO] src.engine_xgb: XGB Train Acc: 0.6846 | Test Acc: 0.6846
[2026-05-15 01:20:53,485 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13572344), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12114943), 'atr_normalized': np.float32(0.13131644), 'prev_log_return': np.float32(0.11349275), 'usdchf_log_return': np.float32(0.13156758), 'xagusd_log_return': np.float32(0.1257201), 'xtiusd_log_return': np.float32(0.12161481), 'synth_vix_zscore': np.float32(0.11941552)}
[2026-05-15 01:20:53,485 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:53,842 INFO] src.engine_xgb: XGB Train Acc: 0.6525 | Test Acc: 0.6525
[2026-05-15 01:20:53,842 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09242803), 'gmm_vol_cluster': np.float32(0.072613075), 'rsi_slope': np.float32(0.13615872), 'atr_normalized': np.float32(0.1049223), 'prev_log_return': np.float32(0.10763406), 'usdchf_log_return': np.float32(0.11099935), 'xagusd_log_return': np.float32(0.13189526), 'xtiusd_log_return': np.float32(0.12694533), 'synth_vix_zscore': np.float32(0.11640393)}
[2026-05-15 01:20:53,843 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:53,844 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.49357, -0.10582) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:53,970 INFO] src.backtester: Backtest [H1]: Sharpe=-4.967 | MaxDD=0.254 | WR=0.269 | Return=-21.3% | Trades=130
[2026-05-15 01:20:53,970 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:54,377 INFO] src.engine_xgb: XGB Train Acc: 0.6610 | Test Acc: 0.6610
[2026-05-15 01:20:54,378 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16288872), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1130782), 'atr_normalized': np.float32(0.11623861), 'prev_log_return': np.float32(0.11330423), 'usdchf_log_return': np.float32(0.123498544), 'xagusd_log_return': np.float32(0.12393795), 'xtiusd_log_return': np.float32(0.11825047), 'synth_vix_zscore': np.float32(0.12880327)}
[2026-05-15 01:20:54,378 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:54,772 INFO] src.engine_xgb: XGB Train Acc: 0.6266 | Test Acc: 0.6266
[2026-05-15 01:20:54,772 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09523284), 'gmm_vol_cluster': np.float32(0.11927516), 'rsi_slope': np.float32(0.119462445), 'atr_normalized': np.float32(0.10711752), 'prev_log_return': np.float32(0.10954472), 'usdchf_log_return': np.float32(0.11924849), 'xagusd_log_return': np.float32(0.11195999), 'xtiusd_log_return': np.float32(0.109101474), 'synth_vix_zscore': np.float32(0.10905732)}
[2026-05-15 01:20:54,773 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:55,224 INFO] src.engine_xgb: XGB Train Acc: 0.6192 | Test Acc: 0.6192
[2026-05-15 01:20:55,225 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.084974736), 'gmm_vol_cluster': np.float32(0.08252758), 'rsi_slope': np.float32(0.12716475), 'atr_normalized': np.float32(0.11034626), 'prev_log_return': np.float32(0.10317372), 'usdchf_log_return': np.float32(0.1210838), 'xagusd_log_return': np.float32(0.12869844), 'xtiusd_log_return': np.float32(0.1250607), 'synth_vix_zscore': np.float32(0.116970025)}
[2026-05-15 01:20:55,225 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:55,227 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.36542, 0.20284) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:55,321 INFO] src.backtester: Backtest [H1]: Sharpe=-2.523 | MaxDD=0.104 | WR=0.340 | Return=-7.1% | Trades=94
[2026-05-15 01:20:55,321 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:55,335 INFO] src.optimizer: WFO [H1] window start=17280: trades=94 sharpe=-2.523 cv_sharpe=-4.200 score=-0.500
[2026-05-15 01:20:55,860 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:20:55,861 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:20:55,861 INFO] src.engine_hmm: Bull 0.9676 0.0142 0.0182 0.0000
[2026-05-15 01:20:55,861 INFO] src.engine_hmm: Bear 0.0110 0.9582 0.0174 0.0133
[2026-05-15 01:20:55,861 INFO] src.engine_hmm: Chop_Low 0.0145 0.0131 0.9724 0.0000
[2026-05-15 01:20:55,862 INFO] src.engine_hmm: Chop_High 0.0000 0.0287 0.0000 0.9713
[2026-05-15 01:20:55,862 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:20:55,862 INFO] src.engine_hmm: Bull: return=0.760460, vol=-0.250916, rsi_slope=-0.009047
[2026-05-15 01:20:55,862 INFO] src.engine_hmm: Bear: return=-0.504761, vol=0.212821, rsi_slope=0.010359
[2026-05-15 01:20:55,862 INFO] src.engine_hmm: Chop_Low: return=-0.042829, vol=-0.698548, rsi_slope=-0.002549
[2026-05-15 01:20:55,862 INFO] src.engine_hmm: Chop_High: return=-0.249541, vol=1.850452, rsi_slope=0.001617
[2026-05-15 01:20:55,863 INFO] src.engine_hmm: Total regime transitions: 331
[2026-05-15 01:20:55,863 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-11 21:00:00: Chop_Low -> Bull
[2026-05-15 01:20:55,863 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 07:00:00: Bull -> Chop_Low
[2026-05-15 01:20:55,863 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 15:00:00: Chop_Low -> Bear
[2026-05-15 01:20:55,864 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-13 13:00:00: Bear -> Chop_Low
[2026-05-15 01:20:55,864 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-13 17:00:00: Chop_Low -> Bull
[2026-05-15 01:20:55,864 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-16 01:00:00: Bull -> Chop_Low
[2026-05-15 01:20:55,865 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-24 17:00:00: Chop_Low -> Bull
[2026-05-15 01:20:55,865 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-27 09:00:00: Bull -> Chop_Low
[2026-05-15 01:20:55,865 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-02 16:00:00: Chop_Low -> Bull
[2026-05-15 01:20:55,866 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 01:00:00: Bull -> Bear
[2026-05-15 01:20:55,886 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:20:55,896 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:20:56,277 INFO] src.engine_xgb: XGB Train Acc: 0.8222 | Test Acc: 0.8222
[2026-05-15 01:20:56,278 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14530295), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1213782), 'atr_normalized': np.float32(0.120441884), 'prev_log_return': np.float32(0.11510461), 'usdchf_log_return': np.float32(0.124517694), 'xagusd_log_return': np.float32(0.13317847), 'xtiusd_log_return': np.float32(0.12563641), 'synth_vix_zscore': np.float32(0.11443978)}
[2026-05-15 01:20:56,278 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:20:56,655 INFO] src.engine_xgb: XGB Train Acc: 0.7979 | Test Acc: 0.7979
[2026-05-15 01:20:56,655 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09526917), 'gmm_vol_cluster': np.float32(0.11329009), 'rsi_slope': np.float32(0.11978686), 'atr_normalized': np.float32(0.120427646), 'prev_log_return': np.float32(0.10133879), 'usdchf_log_return': np.float32(0.11240848), 'xagusd_log_return': np.float32(0.11732761), 'xtiusd_log_return': np.float32(0.11209767), 'synth_vix_zscore': np.float32(0.10805364)}
[2026-05-15 01:20:56,656 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:20:57,122 INFO] src.engine_xgb: XGB Train Acc: 0.7917 | Test Acc: 0.7917
[2026-05-15 01:20:57,122 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09210686), 'gmm_vol_cluster': np.float32(0.09292978), 'rsi_slope': np.float32(0.1170187), 'atr_normalized': np.float32(0.12025441), 'prev_log_return': np.float32(0.105004795), 'usdchf_log_return': np.float32(0.11370493), 'xagusd_log_return': np.float32(0.11652748), 'xtiusd_log_return': np.float32(0.12205821), 'synth_vix_zscore': np.float32(0.12039488)}
[2026-05-15 01:20:57,123 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:20:57,124 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.54544, 0.24324) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:57,254 INFO] src.backtester: Backtest [H1]: Sharpe=-2.774 | MaxDD=0.168 | WR=0.266 | Return=-15.4% | Trades=188
[2026-05-15 01:20:57,254 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:57,729 INFO] src.engine_xgb: XGB Train Acc: 0.7124 | Test Acc: 0.7124
[2026-05-15 01:20:57,730 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14550053), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12252117), 'atr_normalized': np.float32(0.115040176), 'prev_log_return': np.float32(0.12196525), 'usdchf_log_return': np.float32(0.12029697), 'xagusd_log_return': np.float32(0.1290234), 'xtiusd_log_return': np.float32(0.12778567), 'synth_vix_zscore': np.float32(0.11786675)}
[2026-05-15 01:20:57,730 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:20:58,132 INFO] src.engine_xgb: XGB Train Acc: 0.7106 | Test Acc: 0.7106
[2026-05-15 01:20:58,132 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.083479725), 'gmm_vol_cluster': np.float32(0.10149684), 'rsi_slope': np.float32(0.118332826), 'atr_normalized': np.float32(0.11488155), 'prev_log_return': np.float32(0.11294685), 'usdchf_log_return': np.float32(0.11783525), 'xagusd_log_return': np.float32(0.12004244), 'xtiusd_log_return': np.float32(0.11270508), 'synth_vix_zscore': np.float32(0.11827943)}
[2026-05-15 01:20:58,133 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:20:58,500 INFO] src.engine_xgb: XGB Train Acc: 0.6813 | Test Acc: 0.6813
[2026-05-15 01:20:58,501 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10655186), 'gmm_vol_cluster': np.float32(0.09846657), 'rsi_slope': np.float32(0.10937208), 'atr_normalized': np.float32(0.113935366), 'prev_log_return': np.float32(0.105706856), 'usdchf_log_return': np.float32(0.11164281), 'xagusd_log_return': np.float32(0.11295202), 'xtiusd_log_return': np.float32(0.12203997), 'synth_vix_zscore': np.float32(0.11933249)}
[2026-05-15 01:20:58,501 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:20:58,503 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.48586, 0.08539) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:20:58,626 INFO] src.backtester: Backtest [H1]: Sharpe=-0.235 | MaxDD=0.078 | WR=0.328 | Return=-1.2% | Trades=177
[2026-05-15 01:20:58,627 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:20:59,061 INFO] src.engine_xgb: XGB Train Acc: 0.6513 | Test Acc: 0.6513
[2026-05-15 01:20:59,062 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13017696), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12715042), 'atr_normalized': np.float32(0.120690495), 'prev_log_return': np.float32(0.12208055), 'usdchf_log_return': np.float32(0.12827194), 'xagusd_log_return': np.float32(0.13247783), 'xtiusd_log_return': np.float32(0.124784775), 'synth_vix_zscore': np.float32(0.11436702)}
[2026-05-15 01:20:59,062 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:20:59,496 INFO] src.engine_xgb: XGB Train Acc: 0.6543 | Test Acc: 0.6543
[2026-05-15 01:20:59,497 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11636585), 'gmm_vol_cluster': np.float32(0.08654089), 'rsi_slope': np.float32(0.11986367), 'atr_normalized': np.float32(0.114617355), 'prev_log_return': np.float32(0.10894245), 'usdchf_log_return': np.float32(0.10482479), 'xagusd_log_return': np.float32(0.12493643), 'xtiusd_log_return': np.float32(0.11023216), 'synth_vix_zscore': np.float32(0.11367639)}
[2026-05-15 01:20:59,497 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:20:59,924 INFO] src.engine_xgb: XGB Train Acc: 0.6478 | Test Acc: 0.6478
[2026-05-15 01:20:59,924 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.111407734), 'gmm_vol_cluster': np.float32(0.08717444), 'rsi_slope': np.float32(0.1187327), 'atr_normalized': np.float32(0.11858373), 'prev_log_return': np.float32(0.10378217), 'usdchf_log_return': np.float32(0.10539833), 'xagusd_log_return': np.float32(0.12263345), 'xtiusd_log_return': np.float32(0.117664374), 'synth_vix_zscore': np.float32(0.114623025)}
[2026-05-15 01:20:59,924 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:20:59,926 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.51495, -0.03378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:00,024 INFO] src.backtester: Backtest [H1]: Sharpe=-5.955 | MaxDD=0.165 | WR=0.243 | Return=-14.9% | Trades=107
[2026-05-15 01:21:00,025 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:00,038 INFO] src.optimizer: WFO [H1] window start=21600: trades=107 sharpe=-5.955 cv_sharpe=-1.505 score=-0.500
[2026-05-15 01:21:01,068 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:21:01,069 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:21:01,069 INFO] src.engine_hmm: Bull 0.9600 0.0073 0.0238 0.0089
[2026-05-15 01:21:01,069 INFO] src.engine_hmm: Bear 0.0000 0.9520 0.0000 0.0480
[2026-05-15 01:21:01,069 INFO] src.engine_hmm: Chop_Low 0.0129 0.0094 0.9686 0.0091
[2026-05-15 01:21:01,069 INFO] src.engine_hmm: Chop_High 0.0126 0.0078 0.0267 0.9528
[2026-05-15 01:21:01,069 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:21:01,069 INFO] src.engine_hmm: Bull: return=0.981496, vol=-0.158688, rsi_slope=-0.016791
[2026-05-15 01:21:01,070 INFO] src.engine_hmm: Bear: return=-0.769975, vol=1.611784, rsi_slope=-0.017684
[2026-05-15 01:21:01,070 INFO] src.engine_hmm: Chop_Low: return=0.047125, vol=-0.702613, rsi_slope=-0.003120
[2026-05-15 01:21:01,070 INFO] src.engine_hmm: Chop_High: return=-0.389630, vol=0.226197, rsi_slope=0.027308
[2026-05-15 01:21:01,070 INFO] src.engine_hmm: Total regime transitions: 402
[2026-05-15 01:21:01,070 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-07 16:00:00: Chop_High -> Chop_Low
[2026-05-15 01:21:01,071 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-08 12:00:00: Chop_Low -> Chop_High
[2026-05-15 01:21:01,071 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 12:00:00: Chop_High -> Bull
[2026-05-15 01:21:01,071 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 22:00:00: Bull -> Chop_High
[2026-05-15 01:21:01,071 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-14 16:00:00: Chop_High -> Bull
[2026-05-15 01:21:01,072 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-15 17:00:00: Bull -> Chop_High
[2026-05-15 01:21:01,072 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-16 13:00:00: Chop_High -> Chop_Low
[2026-05-15 01:21:01,072 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-17 04:00:00: Chop_Low -> Chop_High
[2026-05-15 01:21:01,072 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-18 03:00:00: Chop_High -> Chop_Low
[2026-05-15 01:21:01,072 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-18 21:00:00: Chop_Low -> Chop_High
[2026-05-15 01:21:01,087 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:21:01,094 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:21:01,372 INFO] src.engine_xgb: XGB Train Acc: 0.7730 | Test Acc: 0.7730
[2026-05-15 01:21:01,372 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11737376), 'gmm_vol_cluster': np.float32(0.06244103), 'rsi_slope': np.float32(0.11321763), 'atr_normalized': np.float32(0.12267012), 'prev_log_return': np.float32(0.12119144), 'usdchf_log_return': np.float32(0.11136312), 'xagusd_log_return': np.float32(0.119688466), 'xtiusd_log_return': np.float32(0.11592335), 'synth_vix_zscore': np.float32(0.116131045)}
[2026-05-15 01:21:01,373 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:21:01,755 INFO] src.engine_xgb: XGB Train Acc: 0.8052 | Test Acc: 0.8052
[2026-05-15 01:21:01,755 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10519394), 'gmm_vol_cluster': np.float32(0.083054274), 'rsi_slope': np.float32(0.1154708), 'atr_normalized': np.float32(0.1291835), 'prev_log_return': np.float32(0.10354748), 'usdchf_log_return': np.float32(0.112971015), 'xagusd_log_return': np.float32(0.11970188), 'xtiusd_log_return': np.float32(0.11578473), 'synth_vix_zscore': np.float32(0.11509237)}
[2026-05-15 01:21:01,756 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:21:02,120 INFO] src.engine_xgb: XGB Train Acc: 0.7886 | Test Acc: 0.7886
[2026-05-15 01:21:02,120 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.105855405), 'gmm_vol_cluster': np.float32(0.08599384), 'rsi_slope': np.float32(0.11870688), 'atr_normalized': np.float32(0.11625968), 'prev_log_return': np.float32(0.106128715), 'usdchf_log_return': np.float32(0.11942415), 'xagusd_log_return': np.float32(0.11794767), 'xtiusd_log_return': np.float32(0.10859856), 'synth_vix_zscore': np.float32(0.12108507)}
[2026-05-15 01:21:02,121 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:21:02,122 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.16146, 0.63340) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:02,243 INFO] src.backtester: Backtest [H1]: Sharpe=-1.536 | MaxDD=0.092 | WR=0.321 | Return=-7.5% | Trades=156
[2026-05-15 01:21:02,243 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:02,628 INFO] src.engine_xgb: XGB Train Acc: 0.6868 | Test Acc: 0.6868
[2026-05-15 01:21:02,628 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12769088), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13432762), 'atr_normalized': np.float32(0.13164613), 'prev_log_return': np.float32(0.12019415), 'usdchf_log_return': np.float32(0.11298231), 'xagusd_log_return': np.float32(0.13068828), 'xtiusd_log_return': np.float32(0.12330586), 'synth_vix_zscore': np.float32(0.11916478)}
[2026-05-15 01:21:02,629 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:21:02,986 INFO] src.engine_xgb: XGB Train Acc: 0.6867 | Test Acc: 0.6867
[2026-05-15 01:21:02,987 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0984067), 'gmm_vol_cluster': np.float32(0.10086613), 'rsi_slope': np.float32(0.12165797), 'atr_normalized': np.float32(0.12162633), 'prev_log_return': np.float32(0.113995776), 'usdchf_log_return': np.float32(0.11007759), 'xagusd_log_return': np.float32(0.11335454), 'xtiusd_log_return': np.float32(0.11392048), 'synth_vix_zscore': np.float32(0.10609447)}
[2026-05-15 01:21:02,987 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:21:03,355 INFO] src.engine_xgb: XGB Train Acc: 0.6808 | Test Acc: 0.6808
[2026-05-15 01:21:03,355 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10080336), 'gmm_vol_cluster': np.float32(0.096566774), 'rsi_slope': np.float32(0.11450609), 'atr_normalized': np.float32(0.12235159), 'prev_log_return': np.float32(0.10836377), 'usdchf_log_return': np.float32(0.11644556), 'xagusd_log_return': np.float32(0.11505846), 'xtiusd_log_return': np.float32(0.105025396), 'synth_vix_zscore': np.float32(0.12087897)}
[2026-05-15 01:21:03,356 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:21:03,357 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47142, 0.22575) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:03,482 INFO] src.backtester: Backtest [H1]: Sharpe=-2.881 | MaxDD=0.164 | WR=0.250 | Return=-11.2% | Trades=140
[2026-05-15 01:21:03,482 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:03,878 INFO] src.engine_xgb: XGB Train Acc: 0.6022 | Test Acc: 0.6022
[2026-05-15 01:21:03,879 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12952766), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13356638), 'atr_normalized': np.float32(0.12882896), 'prev_log_return': np.float32(0.11484887), 'usdchf_log_return': np.float32(0.11594366), 'xagusd_log_return': np.float32(0.12544285), 'xtiusd_log_return': np.float32(0.12507859), 'synth_vix_zscore': np.float32(0.12676309)}
[2026-05-15 01:21:03,879 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:21:04,324 INFO] src.engine_xgb: XGB Train Acc: 0.6280 | Test Acc: 0.6280
[2026-05-15 01:21:04,324 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11953986), 'gmm_vol_cluster': np.float32(0.103032224), 'rsi_slope': np.float32(0.11829188), 'atr_normalized': np.float32(0.11821935), 'prev_log_return': np.float32(0.11363273), 'usdchf_log_return': np.float32(0.10651866), 'xagusd_log_return': np.float32(0.10795243), 'xtiusd_log_return': np.float32(0.10698772), 'synth_vix_zscore': np.float32(0.10582515)}
[2026-05-15 01:21:04,325 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:21:04,754 INFO] src.engine_xgb: XGB Train Acc: 0.6531 | Test Acc: 0.6531
[2026-05-15 01:21:04,754 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09718588), 'gmm_vol_cluster': np.float32(0.09213443), 'rsi_slope': np.float32(0.123570725), 'atr_normalized': np.float32(0.12376468), 'prev_log_return': np.float32(0.102788195), 'usdchf_log_return': np.float32(0.11225807), 'xagusd_log_return': np.float32(0.119466305), 'xtiusd_log_return': np.float32(0.10494755), 'synth_vix_zscore': np.float32(0.12388407)}
[2026-05-15 01:21:04,755 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:21:04,757 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.62208, 0.06248) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:04,851 INFO] src.backtester: Backtest [H1]: Sharpe=-1.174 | MaxDD=0.115 | WR=0.284 | Return=-4.2% | Trades=102
[2026-05-15 01:21:04,851 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:04,867 INFO] src.optimizer: WFO [H1] window start=25920: trades=102 sharpe=-1.174 cv_sharpe=-2.208 score=-0.500
[2026-05-15 01:21:06,184 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:21:06,184 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:21:06,184 INFO] src.engine_hmm: Bull 0.9629 0.0020 0.0246 0.0105
[2026-05-15 01:21:06,184 INFO] src.engine_hmm: Bear 0.0095 0.9567 0.0282 0.0056
[2026-05-15 01:21:06,185 INFO] src.engine_hmm: Chop_Low 0.0287 0.0114 0.9531 0.0068
[2026-05-15 01:21:06,185 INFO] src.engine_hmm: Chop_High 0.0052 0.0580 0.0009 0.9360
[2026-05-15 01:21:06,185 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:21:06,185 INFO] src.engine_hmm: Bull: return=0.608786, vol=-0.584101, rsi_slope=-0.015612
[2026-05-15 01:21:06,185 INFO] src.engine_hmm: Bear: return=-0.438926, vol=0.440689, rsi_slope=0.018283
[2026-05-15 01:21:06,186 INFO] src.engine_hmm: Chop_Low: return=-0.283381, vol=-0.379425, rsi_slope=0.010343
[2026-05-15 01:21:06,186 INFO] src.engine_hmm: Chop_High: return=-0.002680, vol=1.877348, rsi_slope=-0.024781
[2026-05-15 01:21:06,186 INFO] src.engine_hmm: Total regime transitions: 427
[2026-05-15 01:21:06,187 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-02 15:00:00: Chop_Low -> Bull
[2026-05-15 01:21:06,187 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 09:00:00: Bull -> Chop_Low
[2026-05-15 01:21:06,187 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 16:00:00: Chop_Low -> Bear
[2026-05-15 01:21:06,188 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-04 04:00:00: Bear -> Chop_High
[2026-05-15 01:21:06,188 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-04 12:00:00: Chop_High -> Bear
[2026-05-15 01:21:06,188 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 12:00:00: Bear -> Bull
[2026-05-15 01:21:06,188 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-08 16:00:00: Bull -> Chop_Low
[2026-05-15 01:21:06,188 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-09 14:00:00: Chop_Low -> Bull
[2026-05-15 01:21:06,189 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 10:00:00: Bull -> Chop_Low
[2026-05-15 01:21:06,189 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 15:00:00: Chop_Low -> Chop_High
[2026-05-15 01:21:06,205 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:21:06,213 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:21:06,530 INFO] src.engine_xgb: XGB Train Acc: 0.7636 | Test Acc: 0.7636
[2026-05-15 01:21:06,530 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10744256), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1320797), 'atr_normalized': np.float32(0.13491748), 'prev_log_return': np.float32(0.12837352), 'usdchf_log_return': np.float32(0.12626432), 'xagusd_log_return': np.float32(0.12627557), 'xtiusd_log_return': np.float32(0.123410344), 'synth_vix_zscore': np.float32(0.12123648)}
[2026-05-15 01:21:06,531 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:21:06,852 INFO] src.engine_xgb: XGB Train Acc: 0.7717 | Test Acc: 0.7717
[2026-05-15 01:21:06,852 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.099697016), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13784133), 'atr_normalized': np.float32(0.12457829), 'prev_log_return': np.float32(0.12166021), 'usdchf_log_return': np.float32(0.12905169), 'xagusd_log_return': np.float32(0.11790177), 'xtiusd_log_return': np.float32(0.13500093), 'synth_vix_zscore': np.float32(0.13426879)}
[2026-05-15 01:21:06,853 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:21:07,212 INFO] src.engine_xgb: XGB Train Acc: 0.8089 | Test Acc: 0.8089
[2026-05-15 01:21:07,213 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1041082), 'gmm_vol_cluster': np.float32(0.09433893), 'rsi_slope': np.float32(0.119537085), 'atr_normalized': np.float32(0.115134954), 'prev_log_return': np.float32(0.109093495), 'usdchf_log_return': np.float32(0.11381247), 'xagusd_log_return': np.float32(0.11536422), 'xtiusd_log_return': np.float32(0.11680081), 'synth_vix_zscore': np.float32(0.11180978)}
[2026-05-15 01:21:07,213 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:21:07,215 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.56732, -0.02191) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:07,337 INFO] src.backtester: Backtest [H1]: Sharpe=-1.054 | MaxDD=0.107 | WR=0.272 | Return=-5.0% | Trades=169
[2026-05-15 01:21:07,338 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:07,721 INFO] src.engine_xgb: XGB Train Acc: 0.6868 | Test Acc: 0.6868
[2026-05-15 01:21:07,721 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.113223635), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13609724), 'atr_normalized': np.float32(0.12431198), 'prev_log_return': np.float32(0.11828132), 'usdchf_log_return': np.float32(0.11629524), 'xagusd_log_return': np.float32(0.13426131), 'xtiusd_log_return': np.float32(0.11993654), 'synth_vix_zscore': np.float32(0.13759273)}
[2026-05-15 01:21:07,721 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:21:08,084 INFO] src.engine_xgb: XGB Train Acc: 0.6840 | Test Acc: 0.6840
[2026-05-15 01:21:08,084 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09574142), 'gmm_vol_cluster': np.float32(0.08345656), 'rsi_slope': np.float32(0.116984144), 'atr_normalized': np.float32(0.11859672), 'prev_log_return': np.float32(0.10845777), 'usdchf_log_return': np.float32(0.11812339), 'xagusd_log_return': np.float32(0.12593557), 'xtiusd_log_return': np.float32(0.11645673), 'synth_vix_zscore': np.float32(0.11624763)}
[2026-05-15 01:21:08,085 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:21:08,450 INFO] src.engine_xgb: XGB Train Acc: 0.6631 | Test Acc: 0.6631
[2026-05-15 01:21:08,451 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10745674), 'gmm_vol_cluster': np.float32(0.10897429), 'rsi_slope': np.float32(0.11498578), 'atr_normalized': np.float32(0.104113534), 'prev_log_return': np.float32(0.11805959), 'usdchf_log_return': np.float32(0.106112555), 'xagusd_log_return': np.float32(0.12112622), 'xtiusd_log_return': np.float32(0.105692424), 'synth_vix_zscore': np.float32(0.11347879)}
[2026-05-15 01:21:08,451 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:21:08,453 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47816, 0.15210) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:08,577 INFO] src.backtester: Backtest [H1]: Sharpe=-2.033 | MaxDD=0.117 | WR=0.295 | Return=-8.1% | Trades=132
[2026-05-15 01:21:08,577 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:09,015 INFO] src.engine_xgb: XGB Train Acc: 0.6126 | Test Acc: 0.6126
[2026-05-15 01:21:09,016 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09922765), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13284676), 'atr_normalized': np.float32(0.1302814), 'prev_log_return': np.float32(0.11577796), 'usdchf_log_return': np.float32(0.12447301), 'xagusd_log_return': np.float32(0.1331299), 'xtiusd_log_return': np.float32(0.13009395), 'synth_vix_zscore': np.float32(0.13416941)}
[2026-05-15 01:21:09,016 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:21:09,446 INFO] src.engine_xgb: XGB Train Acc: 0.6062 | Test Acc: 0.6062
[2026-05-15 01:21:09,446 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10069982), 'gmm_vol_cluster': np.float32(0.10085244), 'rsi_slope': np.float32(0.11673876), 'atr_normalized': np.float32(0.11478596), 'prev_log_return': np.float32(0.110971786), 'usdchf_log_return': np.float32(0.11350351), 'xagusd_log_return': np.float32(0.12884152), 'xtiusd_log_return': np.float32(0.10733927), 'synth_vix_zscore': np.float32(0.10626698)}
[2026-05-15 01:21:09,447 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:21:09,875 INFO] src.engine_xgb: XGB Train Acc: 0.6306 | Test Acc: 0.6306
[2026-05-15 01:21:09,876 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09402095), 'gmm_vol_cluster': np.float32(0.10389495), 'rsi_slope': np.float32(0.11757579), 'atr_normalized': np.float32(0.11763103), 'prev_log_return': np.float32(0.11560204), 'usdchf_log_return': np.float32(0.11171669), 'xagusd_log_return': np.float32(0.11435736), 'xtiusd_log_return': np.float32(0.11501485), 'synth_vix_zscore': np.float32(0.110186234)}
[2026-05-15 01:21:09,876 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:21:09,878 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.40708, 0.22442) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:09,973 INFO] src.backtester: Backtest [H1]: Sharpe=-1.986 | MaxDD=0.075 | WR=0.318 | Return=-5.8% | Trades=85
[2026-05-15 01:21:09,974 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:09,989 INFO] src.optimizer: WFO [H1] window start=30240: trades=85 sharpe=-1.986 cv_sharpe=-1.543 score=-0.500
[2026-05-15 01:21:10,644 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:21:10,644 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:21:10,645 INFO] src.engine_hmm: Bull 0.9598 0.0165 0.0000 0.0237
[2026-05-15 01:21:10,645 INFO] src.engine_hmm: Bear 0.0059 0.9626 0.0297 0.0019
[2026-05-15 01:21:10,645 INFO] src.engine_hmm: Chop_Low 0.0051 0.0147 0.9533 0.0270
[2026-05-15 01:21:10,645 INFO] src.engine_hmm: Chop_High 0.0131 0.0025 0.0292 0.9552
[2026-05-15 01:21:10,646 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:21:10,646 INFO] src.engine_hmm: Bull: return=1.206597, vol=1.289307, rsi_slope=-0.004288
[2026-05-15 01:21:10,646 INFO] src.engine_hmm: Bear: return=-1.069912, vol=0.520311, rsi_slope=0.017391
[2026-05-15 01:21:10,646 INFO] src.engine_hmm: Chop_Low: return=-0.365115, vol=-0.619021, rsi_slope=0.009289
[2026-05-15 01:21:10,646 INFO] src.engine_hmm: Chop_High: return=0.517215, vol=-0.450257, rsi_slope=-0.020924
[2026-05-15 01:21:10,647 INFO] src.engine_hmm: Total regime transitions: 430
[2026-05-15 01:21:10,647 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-23 16:00:00: Chop_Low -> Chop_High
[2026-05-15 01:21:10,648 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-24 04:00:00: Chop_High -> Bull
[2026-05-15 01:21:10,648 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-25 18:00:00: Bull -> Bear
[2026-05-15 01:21:10,648 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-28 01:00:00: Bear -> Bull
[2026-05-15 01:21:10,648 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-02 13:00:00: Bull -> Bear
[2026-05-15 01:21:10,648 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-03 09:00:00: Bear -> Chop_High
[2026-05-15 01:21:10,648 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-04 02:00:00: Chop_High -> Bull
[2026-05-15 01:21:10,649 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-10 21:00:00: Bull -> Bear
[2026-05-15 01:21:10,649 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-17 03:00:00: Bear -> Bull
[2026-05-15 01:21:10,649 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-17 18:00:00: Bull -> Chop_High
[2026-05-15 01:21:10,666 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:21:10,674 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:21:11,011 INFO] src.engine_xgb: XGB Train Acc: 0.7992 | Test Acc: 0.7992
[2026-05-15 01:21:11,011 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10943428), 'gmm_vol_cluster': np.float32(0.08759152), 'rsi_slope': np.float32(0.10251871), 'atr_normalized': np.float32(0.12640855), 'prev_log_return': np.float32(0.107051246), 'usdchf_log_return': np.float32(0.12738474), 'xagusd_log_return': np.float32(0.11638867), 'xtiusd_log_return': np.float32(0.110373355), 'synth_vix_zscore': np.float32(0.112848945)}
[2026-05-15 01:21:11,012 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:21:11,352 INFO] src.engine_xgb: XGB Train Acc: 0.7728 | Test Acc: 0.7728
[2026-05-15 01:21:11,353 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08315249), 'gmm_vol_cluster': np.float32(0.10815063), 'rsi_slope': np.float32(0.11380104), 'atr_normalized': np.float32(0.11135043), 'prev_log_return': np.float32(0.1253098), 'usdchf_log_return': np.float32(0.106635526), 'xagusd_log_return': np.float32(0.11500731), 'xtiusd_log_return': np.float32(0.11916952), 'synth_vix_zscore': np.float32(0.11742331)}
[2026-05-15 01:21:11,354 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:21:11,782 INFO] src.engine_xgb: XGB Train Acc: 0.8028 | Test Acc: 0.8028
[2026-05-15 01:21:11,782 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10436843), 'gmm_vol_cluster': np.float32(0.08853625), 'rsi_slope': np.float32(0.11984096), 'atr_normalized': np.float32(0.11998786), 'prev_log_return': np.float32(0.10638014), 'usdchf_log_return': np.float32(0.116173394), 'xagusd_log_return': np.float32(0.12631267), 'xtiusd_log_return': np.float32(0.11050565), 'synth_vix_zscore': np.float32(0.10789459)}
[2026-05-15 01:21:11,783 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:21:11,784 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.42962, 0.34995) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:11,908 INFO] src.backtester: Backtest [H1]: Sharpe=-0.644 | MaxDD=0.144 | WR=0.326 | Return=-3.1% | Trades=172
[2026-05-15 01:21:11,909 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:12,326 INFO] src.engine_xgb: XGB Train Acc: 0.6988 | Test Acc: 0.6988
[2026-05-15 01:21:12,327 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.116740346), 'gmm_vol_cluster': np.float32(0.09919297), 'rsi_slope': np.float32(0.110747755), 'atr_normalized': np.float32(0.11291229), 'prev_log_return': np.float32(0.105593756), 'usdchf_log_return': np.float32(0.11844044), 'xagusd_log_return': np.float32(0.109912574), 'xtiusd_log_return': np.float32(0.10711384), 'synth_vix_zscore': np.float32(0.11934604)}
[2026-05-15 01:21:12,327 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:21:12,710 INFO] src.engine_xgb: XGB Train Acc: 0.6590 | Test Acc: 0.6590
[2026-05-15 01:21:12,710 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10380188), 'gmm_vol_cluster': np.float32(0.11841204), 'rsi_slope': np.float32(0.11533294), 'atr_normalized': np.float32(0.11078326), 'prev_log_return': np.float32(0.10300828), 'usdchf_log_return': np.float32(0.11303867), 'xagusd_log_return': np.float32(0.11196469), 'xtiusd_log_return': np.float32(0.11194947), 'synth_vix_zscore': np.float32(0.111708716)}
[2026-05-15 01:21:12,711 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:21:13,074 INFO] src.engine_xgb: XGB Train Acc: 0.6646 | Test Acc: 0.6646
[2026-05-15 01:21:13,074 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.112263806), 'gmm_vol_cluster': np.float32(0.0822111), 'rsi_slope': np.float32(0.10990287), 'atr_normalized': np.float32(0.11481753), 'prev_log_return': np.float32(0.11688479), 'usdchf_log_return': np.float32(0.113488525), 'xagusd_log_return': np.float32(0.119977735), 'xtiusd_log_return': np.float32(0.112182565), 'synth_vix_zscore': np.float32(0.118271105)}
[2026-05-15 01:21:13,075 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:21:13,076 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47849, 0.22854) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:13,197 INFO] src.backtester: Backtest [H1]: Sharpe=-4.456 | MaxDD=0.179 | WR=0.250 | Return=-14.7% | Trades=148
[2026-05-15 01:21:13,197 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:13,633 INFO] src.engine_xgb: XGB Train Acc: 0.5925 | Test Acc: 0.5925
[2026-05-15 01:21:13,634 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.106473126), 'gmm_vol_cluster': np.float32(0.12304838), 'rsi_slope': np.float32(0.09897694), 'atr_normalized': np.float32(0.10548376), 'prev_log_return': np.float32(0.10611486), 'usdchf_log_return': np.float32(0.1178935), 'xagusd_log_return': np.float32(0.11442292), 'xtiusd_log_return': np.float32(0.10813201), 'synth_vix_zscore': np.float32(0.11945454)}
[2026-05-15 01:21:13,634 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:21:14,036 INFO] src.engine_xgb: XGB Train Acc: 0.6121 | Test Acc: 0.6121
[2026-05-15 01:21:14,037 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10264197), 'gmm_vol_cluster': np.float32(0.100983396), 'rsi_slope': np.float32(0.124279775), 'atr_normalized': np.float32(0.122491114), 'prev_log_return': np.float32(0.11132344), 'usdchf_log_return': np.float32(0.107684314), 'xagusd_log_return': np.float32(0.1153134), 'xtiusd_log_return': np.float32(0.108793154), 'synth_vix_zscore': np.float32(0.106489405)}
[2026-05-15 01:21:14,037 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:21:14,472 INFO] src.engine_xgb: XGB Train Acc: 0.6289 | Test Acc: 0.6289
[2026-05-15 01:21:14,473 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.106866255), 'gmm_vol_cluster': np.float32(0.08771916), 'rsi_slope': np.float32(0.110215954), 'atr_normalized': np.float32(0.11225145), 'prev_log_return': np.float32(0.12183267), 'usdchf_log_return': np.float32(0.11705418), 'xagusd_log_return': np.float32(0.115699284), 'xtiusd_log_return': np.float32(0.11331502), 'synth_vix_zscore': np.float32(0.115046)}
[2026-05-15 01:21:14,473 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:21:14,475 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.64128, 0.06038) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:14,575 INFO] src.backtester: Backtest [H1]: Sharpe=-4.707 | MaxDD=0.124 | WR=0.273 | Return=-10.9% | Trades=88
[2026-05-15 01:21:14,575 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:14,590 INFO] src.optimizer: WFO [H1] window start=34560: trades=88 sharpe=-4.707 cv_sharpe=-2.550 score=-0.500
[2026-05-15 01:21:15,785 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:21:15,785 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:21:15,786 INFO] src.engine_hmm: Bull 0.9630 0.0121 0.0015 0.0234
[2026-05-15 01:21:15,786 INFO] src.engine_hmm: Bear 0.0053 0.9597 0.0038 0.0312
[2026-05-15 01:21:15,786 INFO] src.engine_hmm: Chop_Low 0.0088 0.0028 0.9689 0.0195
[2026-05-15 01:21:15,786 INFO] src.engine_hmm: Chop_High 0.0084 0.0079 0.0296 0.9541
[2026-05-15 01:21:15,786 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:21:15,787 INFO] src.engine_hmm: Bull: return=1.256245, vol=1.081626, rsi_slope=-0.015635
[2026-05-15 01:21:15,787 INFO] src.engine_hmm: Bear: return=-1.339382, vol=0.895746, rsi_slope=0.024029
[2026-05-15 01:21:15,787 INFO] src.engine_hmm: Chop_Low: return=-0.133156, vol=-0.856396, rsi_slope=-0.004682
[2026-05-15 01:21:15,787 INFO] src.engine_hmm: Chop_High: return=0.040641, vol=-0.077077, rsi_slope=0.002873
[2026-05-15 01:21:15,787 INFO] src.engine_hmm: Total regime transitions: 375
[2026-05-15 01:21:15,788 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-16 06:00:00: Bull -> Chop_High
[2026-05-15 01:21:15,788 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-18 12:00:00: Chop_High -> Chop_Low
[2026-05-15 01:21:15,788 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-18 17:00:00: Chop_Low -> Bear
[2026-05-15 01:21:15,788 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-21 22:00:00: Bear -> Chop_High
[2026-05-15 01:21:15,789 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-22 15:00:00: Chop_High -> Chop_Low
[2026-05-15 01:21:15,789 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-23 09:00:00: Chop_Low -> Chop_High
[2026-05-15 01:21:15,789 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-24 18:00:00: Chop_High -> Chop_Low
[2026-05-15 01:21:15,789 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-28 01:00:00: Chop_Low -> Chop_High
[2026-05-15 01:21:15,789 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 03:00:00: Chop_High -> Chop_Low
[2026-05-15 01:21:15,790 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 13:00:00: Chop_Low -> Chop_High
[2026-05-15 01:21:15,806 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:21:15,813 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:21:16,091 INFO] src.engine_xgb: XGB Train Acc: 0.8044 | Test Acc: 0.8044
[2026-05-15 01:21:16,091 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09657782), 'gmm_vol_cluster': np.float32(0.10653616), 'rsi_slope': np.float32(0.11213197), 'atr_normalized': np.float32(0.11057878), 'prev_log_return': np.float32(0.105124466), 'usdchf_log_return': np.float32(0.119624786), 'xagusd_log_return': np.float32(0.11535798), 'xtiusd_log_return': np.float32(0.12079374), 'synth_vix_zscore': np.float32(0.11327425)}
[2026-05-15 01:21:16,092 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:21:16,476 INFO] src.engine_xgb: XGB Train Acc: 0.7801 | Test Acc: 0.7801
[2026-05-15 01:21:16,476 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.106789835), 'gmm_vol_cluster': np.float32(0.11662741), 'rsi_slope': np.float32(0.10310218), 'atr_normalized': np.float32(0.122929014), 'prev_log_return': np.float32(0.11371417), 'usdchf_log_return': np.float32(0.10836044), 'xagusd_log_return': np.float32(0.11069357), 'xtiusd_log_return': np.float32(0.11668836), 'synth_vix_zscore': np.float32(0.101094946)}
[2026-05-15 01:21:16,477 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:21:16,845 INFO] src.engine_xgb: XGB Train Acc: 0.8130 | Test Acc: 0.8130
[2026-05-15 01:21:16,846 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0982082), 'gmm_vol_cluster': np.float32(0.10269611), 'rsi_slope': np.float32(0.118876256), 'atr_normalized': np.float32(0.11261126), 'prev_log_return': np.float32(0.11237339), 'usdchf_log_return': np.float32(0.11249169), 'xagusd_log_return': np.float32(0.12480053), 'xtiusd_log_return': np.float32(0.109987095), 'synth_vix_zscore': np.float32(0.10795544)}
[2026-05-15 01:21:16,846 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:21:16,848 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.13686, 0.71017) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:16,968 INFO] src.backtester: Backtest [H1]: Sharpe=-3.780 | MaxDD=0.140 | WR=0.241 | Return=-11.0% | Trades=170
[2026-05-15 01:21:16,968 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:17,380 INFO] src.engine_xgb: XGB Train Acc: 0.6634 | Test Acc: 0.6634
[2026-05-15 01:21:17,380 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12681076), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1251223), 'atr_normalized': np.float32(0.12846604), 'prev_log_return': np.float32(0.11943184), 'usdchf_log_return': np.float32(0.12597086), 'xagusd_log_return': np.float32(0.13113467), 'xtiusd_log_return': np.float32(0.12749821), 'synth_vix_zscore': np.float32(0.11556531)}
[2026-05-15 01:21:17,381 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:21:17,896 INFO] src.engine_xgb: XGB Train Acc: 0.6992 | Test Acc: 0.6992
[2026-05-15 01:21:17,896 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09911304), 'gmm_vol_cluster': np.float32(0.1110944), 'rsi_slope': np.float32(0.10657301), 'atr_normalized': np.float32(0.112401195), 'prev_log_return': np.float32(0.11772931), 'usdchf_log_return': np.float32(0.115479015), 'xagusd_log_return': np.float32(0.11087997), 'xtiusd_log_return': np.float32(0.11717053), 'synth_vix_zscore': np.float32(0.10955944)}
[2026-05-15 01:21:17,897 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:21:18,320 INFO] src.engine_xgb: XGB Train Acc: 0.6682 | Test Acc: 0.6682
[2026-05-15 01:21:18,321 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10776874), 'gmm_vol_cluster': np.float32(0.09563445), 'rsi_slope': np.float32(0.114541605), 'atr_normalized': np.float32(0.11563845), 'prev_log_return': np.float32(0.115798146), 'usdchf_log_return': np.float32(0.10798794), 'xagusd_log_return': np.float32(0.110421486), 'xtiusd_log_return': np.float32(0.1187967), 'synth_vix_zscore': np.float32(0.11341252)}
[2026-05-15 01:21:18,321 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:21:18,323 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.51565, 0.29314) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:18,448 INFO] src.backtester: Backtest [H1]: Sharpe=-3.078 | MaxDD=0.149 | WR=0.291 | Return=-11.8% | Trades=151
[2026-05-15 01:21:18,449 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:18,919 INFO] src.engine_xgb: XGB Train Acc: 0.6015 | Test Acc: 0.6015
[2026-05-15 01:21:18,920 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10442298), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13228713), 'atr_normalized': np.float32(0.12835158), 'prev_log_return': np.float32(0.12193097), 'usdchf_log_return': np.float32(0.12276312), 'xagusd_log_return': np.float32(0.13355686), 'xtiusd_log_return': np.float32(0.131258), 'synth_vix_zscore': np.float32(0.1254294)}
[2026-05-15 01:21:18,920 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:21:19,364 INFO] src.engine_xgb: XGB Train Acc: 0.6256 | Test Acc: 0.6256
[2026-05-15 01:21:19,364 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.081926964), 'gmm_vol_cluster': np.float32(0.18858169), 'rsi_slope': np.float32(0.09818576), 'atr_normalized': np.float32(0.09621213), 'prev_log_return': np.float32(0.10826983), 'usdchf_log_return': np.float32(0.108574964), 'xagusd_log_return': np.float32(0.100380585), 'xtiusd_log_return': np.float32(0.11247948), 'synth_vix_zscore': np.float32(0.10538864)}
[2026-05-15 01:21:19,365 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:21:19,827 INFO] src.engine_xgb: XGB Train Acc: 0.6471 | Test Acc: 0.6471
[2026-05-15 01:21:19,827 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.108135924), 'gmm_vol_cluster': np.float32(0.08783494), 'rsi_slope': np.float32(0.12712885), 'atr_normalized': np.float32(0.12871614), 'prev_log_return': np.float32(0.1039553), 'usdchf_log_return': np.float32(0.10849413), 'xagusd_log_return': np.float32(0.10669711), 'xtiusd_log_return': np.float32(0.116631135), 'synth_vix_zscore': np.float32(0.112406455)}
[2026-05-15 01:21:19,828 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:21:19,830 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.46960, 0.34543) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:19,927 INFO] src.backtester: Backtest [H1]: Sharpe=-3.365 | MaxDD=0.120 | WR=0.283 | Return=-10.3% | Trades=120
[2026-05-15 01:21:19,927 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:19,941 INFO] src.optimizer: WFO [H1] window start=38880: trades=120 sharpe=-3.365 cv_sharpe=-3.429 score=-0.500
[2026-05-15 01:21:22,220 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:21:22,220 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:21:22,220 INFO] src.engine_hmm: Bull 0.9601 0.0059 0.0000 0.0341
[2026-05-15 01:21:22,221 INFO] src.engine_hmm: Bear 0.0107 0.9673 0.0061 0.0159
[2026-05-15 01:21:22,221 INFO] src.engine_hmm: Chop_Low 0.0051 0.0061 0.9623 0.0265
[2026-05-15 01:21:22,221 INFO] src.engine_hmm: Chop_High 0.0182 0.0065 0.0331 0.9422
[2026-05-15 01:21:22,221 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:21:22,222 INFO] src.engine_hmm: Bull: return=0.962934, vol=0.162103, rsi_slope=0.005727
[2026-05-15 01:21:22,222 INFO] src.engine_hmm: Bear: return=-0.675062, vol=1.561868, rsi_slope=-0.012490
[2026-05-15 01:21:22,222 INFO] src.engine_hmm: Chop_Low: return=-0.376907, vol=-0.782109, rsi_slope=-0.001767
[2026-05-15 01:21:22,222 INFO] src.engine_hmm: Chop_High: return=0.016948, vol=-0.154459, rsi_slope=0.003946
[2026-05-15 01:21:22,223 INFO] src.engine_hmm: Total regime transitions: 422
[2026-05-15 01:21:22,223 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-10 19:00:00: Chop_Low -> Chop_High
[2026-05-15 01:21:22,224 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-11 14:00:00: Chop_High -> Chop_Low
[2026-05-15 01:21:22,224 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-21 14:00:00: Chop_Low -> Chop_High
[2026-05-15 01:21:22,224 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-23 13:00:00: Chop_High -> Chop_Low
[2026-05-15 01:21:22,224 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-23 16:00:00: Chop_Low -> Bull
[2026-05-15 01:21:22,225 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-24 13:00:00: Bull -> Chop_High
[2026-05-15 01:21:22,225 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-24 14:00:00: Chop_High -> Chop_Low
[2026-05-15 01:21:22,225 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-25 20:00:00: Chop_Low -> Chop_High
[2026-05-15 01:21:22,225 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-28 14:00:00: Chop_High -> Chop_Low
[2026-05-15 01:21:22,226 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-29 17:00:00: Chop_Low -> Bull
[2026-05-15 01:21:22,244 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:21:22,253 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:21:22,726 INFO] src.engine_xgb: XGB Train Acc: 0.7992 | Test Acc: 0.7992
[2026-05-15 01:21:22,727 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.116546206), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12819102), 'atr_normalized': np.float32(0.11901569), 'prev_log_return': np.float32(0.12700284), 'usdchf_log_return': np.float32(0.13441728), 'xagusd_log_return': np.float32(0.13037662), 'xtiusd_log_return': np.float32(0.12731183), 'synth_vix_zscore': np.float32(0.117138505)}
[2026-05-15 01:21:22,727 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:21:23,119 INFO] src.engine_xgb: XGB Train Acc: 0.8052 | Test Acc: 0.8052
[2026-05-15 01:21:23,120 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.099702284), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12666675), 'atr_normalized': np.float32(0.12520497), 'prev_log_return': np.float32(0.11973812), 'usdchf_log_return': np.float32(0.1301849), 'xagusd_log_return': np.float32(0.12606782), 'xtiusd_log_return': np.float32(0.13644911), 'synth_vix_zscore': np.float32(0.13598609)}
[2026-05-15 01:21:23,120 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:21:23,466 INFO] src.engine_xgb: XGB Train Acc: 0.7978 | Test Acc: 0.7978
[2026-05-15 01:21:23,467 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.098941036), 'gmm_vol_cluster': np.float32(0.07736529), 'rsi_slope': np.float32(0.107214935), 'atr_normalized': np.float32(0.12111106), 'prev_log_return': np.float32(0.11009172), 'usdchf_log_return': np.float32(0.123857394), 'xagusd_log_return': np.float32(0.11836098), 'xtiusd_log_return': np.float32(0.12635216), 'synth_vix_zscore': np.float32(0.11670542)}
[2026-05-15 01:21:23,467 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:21:23,469 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.73608, -0.15122) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:23,592 INFO] src.backtester: Backtest [H1]: Sharpe=-1.599 | MaxDD=0.112 | WR=0.296 | Return=-8.3% | Trades=152
[2026-05-15 01:21:23,593 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:23,972 INFO] src.engine_xgb: XGB Train Acc: 0.6905 | Test Acc: 0.6905
[2026-05-15 01:21:23,972 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11187536), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12672615), 'atr_normalized': np.float32(0.12168396), 'prev_log_return': np.float32(0.12778287), 'usdchf_log_return': np.float32(0.12893541), 'xagusd_log_return': np.float32(0.12524396), 'xtiusd_log_return': np.float32(0.13268821), 'synth_vix_zscore': np.float32(0.12506407)}
[2026-05-15 01:21:23,973 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:21:24,496 INFO] src.engine_xgb: XGB Train Acc: 0.6924 | Test Acc: 0.6924
[2026-05-15 01:21:24,498 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10015947), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13010946), 'atr_normalized': np.float32(0.12529024), 'prev_log_return': np.float32(0.1224554), 'usdchf_log_return': np.float32(0.13759016), 'xagusd_log_return': np.float32(0.12793277), 'xtiusd_log_return': np.float32(0.126405), 'synth_vix_zscore': np.float32(0.13005748)}
[2026-05-15 01:21:24,500 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:21:25,037 INFO] src.engine_xgb: XGB Train Acc: 0.7117 | Test Acc: 0.7117
[2026-05-15 01:21:25,037 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.121753365), 'gmm_vol_cluster': np.float32(0.09820528), 'rsi_slope': np.float32(0.12591706), 'atr_normalized': np.float32(0.121411696), 'prev_log_return': np.float32(0.10304742), 'usdchf_log_return': np.float32(0.11188572), 'xagusd_log_return': np.float32(0.112560935), 'xtiusd_log_return': np.float32(0.107272685), 'synth_vix_zscore': np.float32(0.09794587)}
[2026-05-15 01:21:25,038 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:21:25,039 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53526, 0.16378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:25,170 INFO] src.backtester: Backtest [H1]: Sharpe=-3.209 | MaxDD=0.131 | WR=0.242 | Return=-11.5% | Trades=149
[2026-05-15 01:21:25,170 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:25,973 INFO] src.engine_xgb: XGB Train Acc: 0.6503 | Test Acc: 0.6503
[2026-05-15 01:21:25,974 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11268838), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12636338), 'atr_normalized': np.float32(0.12985969), 'prev_log_return': np.float32(0.13235445), 'usdchf_log_return': np.float32(0.13441347), 'xagusd_log_return': np.float32(0.11665025), 'xtiusd_log_return': np.float32(0.12887159), 'synth_vix_zscore': np.float32(0.118798755)}
[2026-05-15 01:21:25,974 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:21:26,537 INFO] src.engine_xgb: XGB Train Acc: 0.6439 | Test Acc: 0.6439
[2026-05-15 01:21:26,538 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.119244136), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11939207), 'atr_normalized': np.float32(0.12324886), 'prev_log_return': np.float32(0.12499442), 'usdchf_log_return': np.float32(0.13149069), 'xagusd_log_return': np.float32(0.12352977), 'xtiusd_log_return': np.float32(0.11753043), 'synth_vix_zscore': np.float32(0.14056964)}
[2026-05-15 01:21:26,539 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:21:27,148 INFO] src.engine_xgb: XGB Train Acc: 0.6538 | Test Acc: 0.6538
[2026-05-15 01:21:27,149 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12043214), 'gmm_vol_cluster': np.float32(0.09223706), 'rsi_slope': np.float32(0.12134447), 'atr_normalized': np.float32(0.12288978), 'prev_log_return': np.float32(0.10952371), 'usdchf_log_return': np.float32(0.10805507), 'xagusd_log_return': np.float32(0.10999808), 'xtiusd_log_return': np.float32(0.110091925), 'synth_vix_zscore': np.float32(0.105427675)}
[2026-05-15 01:21:27,150 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:21:27,152 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.43440, 0.22813) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:27,258 INFO] src.backtester: Backtest [H1]: Sharpe=-3.049 | MaxDD=0.179 | WR=0.290 | Return=-15.1% | Trades=100
[2026-05-15 01:21:27,259 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:27,274 INFO] src.optimizer: WFO [H1] window start=43200: trades=100 sharpe=-3.049 cv_sharpe=-2.404 score=-50.000
[2026-05-15 01:21:27,275 INFO] src.optimizer: WFO [H1]: 7/8 valid | median_trades=97 | score=-1.060 | std_sharpe=1.874 | WFE=1.04 | window_scores=[0.355, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -50.0]
[2026-05-15 01:21:27,329 INFO] src.optimizer: Trial 33 [H1/headway_cent $15 standard]: score=-1.497 | valid=7/8 | std_sharpe=1.874 | median_trades=97 | WFE=1.04 | scores=[0.355, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -50.0]
Best trial: 23. Best value: -0.320363: 17%|███████████▌ | 34/200 [19:26<1:37:34, 35.27s/it][2026-05-15 01:21:28,496 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:21:28,497 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:21:28,497 INFO] src.engine_hmm: Bull 0.9793 0.0133 0.0074
[2026-05-15 01:21:28,497 INFO] src.engine_hmm: Bear 0.0241 0.9675 0.0084
[2026-05-15 01:21:28,498 INFO] src.engine_hmm: Chop 0.0069 0.0158 0.9774
[2026-05-15 01:21:28,498 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:21:28,498 INFO] src.engine_hmm: Bull: return=0.228030, vol=-0.650421, rsi_slope=-0.009906
[2026-05-15 01:21:28,499 INFO] src.engine_hmm: Bear: return=-0.521907, vol=-0.140520, rsi_slope=0.034956
[2026-05-15 01:21:28,499 INFO] src.engine_hmm: Chop: return=0.228022, vol=1.279289, rsi_slope=-0.024454
[2026-05-15 01:21:28,499 INFO] src.engine_hmm: Total regime transitions: 247
[2026-05-15 01:21:28,500 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-25 14:00:00: Bull -> Bear
[2026-05-15 01:21:28,500 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-29 08:00:00: Bear -> Bull
[2026-05-15 01:21:28,500 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-02 18:00:00: Bull -> Bear
[2026-05-15 01:21:28,501 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-03 15:00:00: Bear -> Bull
[2026-05-15 01:21:28,501 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-10 11:00:00: Bull -> Bear
[2026-05-15 01:21:28,501 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-12 17:00:00: Bear -> Bull
[2026-05-15 01:21:28,502 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-13 10:00:00: Bull -> Bear
[2026-05-15 01:21:28,502 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-16 12:00:00: Bear -> Bull
[2026-05-15 01:21:28,502 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-17 16:00:00: Bull -> Chop
[2026-05-15 01:21:28,503 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-18 13:00:00: Chop -> Bear
[2026-05-15 01:21:28,520 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:21:28,530 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:21:28,708 INFO] src.engine_xgb: XGB Train Acc: 0.6946 | Test Acc: 0.6946
[2026-05-15 01:21:28,709 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11055867), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11805303), 'atr_normalized': np.float32(0.12990849), 'prev_log_return': np.float32(0.13114806), 'usdchf_log_return': np.float32(0.117114164), 'xagusd_log_return': np.float32(0.14124951), 'xtiusd_log_return': np.float32(0.12964751), 'synth_vix_zscore': np.float32(0.122320585)}
[2026-05-15 01:21:28,709 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:21:28,883 INFO] src.engine_xgb: XGB Train Acc: 0.7005 | Test Acc: 0.7005
[2026-05-15 01:21:28,883 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11585663), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.15244995), 'atr_normalized': np.float32(0.10292214), 'prev_log_return': np.float32(0.1151437), 'usdchf_log_return': np.float32(0.12372076), 'xagusd_log_return': np.float32(0.11896454), 'xtiusd_log_return': np.float32(0.13068609), 'synth_vix_zscore': np.float32(0.14025623)}
[2026-05-15 01:21:28,884 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:21:29,075 INFO] src.engine_xgb: XGB Train Acc: 0.6494 | Test Acc: 0.6494
[2026-05-15 01:21:29,076 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13337001), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14258492), 'atr_normalized': np.float32(0.1190521), 'prev_log_return': np.float32(0.114109986), 'usdchf_log_return': np.float32(0.11339233), 'xagusd_log_return': np.float32(0.13374151), 'xtiusd_log_return': np.float32(0.13122419), 'synth_vix_zscore': np.float32(0.11252502)}
[2026-05-15 01:21:29,076 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:21:29,077 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.38336, 0.21891) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:29,190 INFO] src.backtester: Backtest [H1]: Sharpe=-3.687 | MaxDD=0.124 | WR=0.214 | Return=-10.2% | Trades=145
[2026-05-15 01:21:29,191 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:29,449 INFO] src.engine_xgb: XGB Train Acc: 0.6738 | Test Acc: 0.6738
[2026-05-15 01:21:29,449 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12625818), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.116367124), 'atr_normalized': np.float32(0.12893078), 'prev_log_return': np.float32(0.12676468), 'usdchf_log_return': np.float32(0.12314426), 'xagusd_log_return': np.float32(0.12859707), 'xtiusd_log_return': np.float32(0.13183853), 'synth_vix_zscore': np.float32(0.11809939)}
[2026-05-15 01:21:29,450 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:21:29,701 INFO] src.engine_xgb: XGB Train Acc: 0.6809 | Test Acc: 0.6809
[2026-05-15 01:21:29,701 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11095517), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14494923), 'atr_normalized': np.float32(0.11950466), 'prev_log_return': np.float32(0.12157394), 'usdchf_log_return': np.float32(0.118258856), 'xagusd_log_return': np.float32(0.12848842), 'xtiusd_log_return': np.float32(0.12402254), 'synth_vix_zscore': np.float32(0.13224718)}
[2026-05-15 01:21:29,701 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:21:29,945 INFO] src.engine_xgb: XGB Train Acc: 0.6530 | Test Acc: 0.6530
[2026-05-15 01:21:29,945 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12629889), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13606384), 'atr_normalized': np.float32(0.117028795), 'prev_log_return': np.float32(0.1174771), 'usdchf_log_return': np.float32(0.12004931), 'xagusd_log_return': np.float32(0.13222729), 'xtiusd_log_return': np.float32(0.13145559), 'synth_vix_zscore': np.float32(0.11939914)}
[2026-05-15 01:21:29,946 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:21:29,947 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53107, 0.07740) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:30,063 INFO] src.backtester: Backtest [H1]: Sharpe=-1.670 | MaxDD=0.074 | WR=0.241 | Return=-6.1% | Trades=108
[2026-05-15 01:21:30,063 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:30,347 INFO] src.engine_xgb: XGB Train Acc: 0.6697 | Test Acc: 0.6697
[2026-05-15 01:21:30,347 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.118148305), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12571791), 'atr_normalized': np.float32(0.12552528), 'prev_log_return': np.float32(0.1205378), 'usdchf_log_return': np.float32(0.124124356), 'xagusd_log_return': np.float32(0.13061553), 'xtiusd_log_return': np.float32(0.12964444), 'synth_vix_zscore': np.float32(0.12568645)}
[2026-05-15 01:21:30,348 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:21:30,619 INFO] src.engine_xgb: XGB Train Acc: 0.6616 | Test Acc: 0.6616
[2026-05-15 01:21:30,620 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1114381), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13612847), 'atr_normalized': np.float32(0.11123177), 'prev_log_return': np.float32(0.12210415), 'usdchf_log_return': np.float32(0.1329107), 'xagusd_log_return': np.float32(0.123255536), 'xtiusd_log_return': np.float32(0.12983908), 'synth_vix_zscore': np.float32(0.13309214)}
[2026-05-15 01:21:30,620 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:21:30,882 INFO] src.engine_xgb: XGB Train Acc: 0.6807 | Test Acc: 0.6807
[2026-05-15 01:21:30,883 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0965255), 'gmm_vol_cluster': np.float32(0.09027641), 'rsi_slope': np.float32(0.13522531), 'atr_normalized': np.float32(0.11335449), 'prev_log_return': np.float32(0.10722637), 'usdchf_log_return': np.float32(0.1087537), 'xagusd_log_return': np.float32(0.11697377), 'xtiusd_log_return': np.float32(0.1139169), 'synth_vix_zscore': np.float32(0.117747515)}
[2026-05-15 01:21:30,883 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:21:30,884 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.38300, 0.44275) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:30,967 INFO] src.backtester: Backtest [H1]: Sharpe=-1.925 | MaxDD=0.151 | WR=0.277 | Return=-9.4% | Trades=83
[2026-05-15 01:21:30,968 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:30,982 INFO] src.optimizer: WFO [H1] window start=12960: trades=83 sharpe=-1.925 cv_sharpe=-2.678 score=-0.500
[2026-05-15 01:21:31,696 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:21:31,697 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:21:31,697 INFO] src.engine_hmm: Bull 0.9768 0.0000 0.0232
[2026-05-15 01:21:31,697 INFO] src.engine_hmm: Bear 0.0000 0.9865 0.0135
[2026-05-15 01:21:31,697 INFO] src.engine_hmm: Chop 0.0075 0.0150 0.9775
[2026-05-15 01:21:31,697 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:21:31,697 INFO] src.engine_hmm: Bull: return=0.331363, vol=1.809609, rsi_slope=-0.025029
[2026-05-15 01:21:31,697 INFO] src.engine_hmm: Bear: return=-0.093504, vol=-0.654505, rsi_slope=0.011125
[2026-05-15 01:21:31,697 INFO] src.engine_hmm: Chop: return=-0.001755, vol=0.151854, rsi_slope=-0.004426
[2026-05-15 01:21:31,698 INFO] src.engine_hmm: Total regime transitions: 187
[2026-05-15 01:21:31,698 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-20 20:00:00: Bear -> Chop
[2026-05-15 01:21:31,698 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-21 21:00:00: Chop -> Bear
[2026-05-15 01:21:31,698 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-28 15:00:00: Bear -> Chop
[2026-05-15 01:21:31,698 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-29 13:00:00: Chop -> Bear
[2026-05-15 01:21:31,699 INFO] src.engine_hmm: REGIME CHANGE at 2019-05-13 15:00:00: Bear -> Chop
[2026-05-15 01:21:31,699 INFO] src.engine_hmm: REGIME CHANGE at 2019-05-14 12:00:00: Chop -> Bear
[2026-05-15 01:21:31,699 INFO] src.engine_hmm: REGIME CHANGE at 2019-05-31 17:00:00: Bear -> Chop
[2026-05-15 01:21:31,699 INFO] src.engine_hmm: REGIME CHANGE at 2019-06-06 14:00:00: Chop -> Bear
[2026-05-15 01:21:31,699 INFO] src.engine_hmm: REGIME CHANGE at 2019-06-07 15:00:00: Bear -> Chop
[2026-05-15 01:21:31,700 INFO] src.engine_hmm: REGIME CHANGE at 2019-06-10 16:00:00: Chop -> Bear
[2026-05-15 01:21:31,716 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:21:31,725 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:21:31,868 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-15 01:21:31,868 INFO] src.engine_xgb: XGB Train Acc: 0.6757 | Test Acc: 0.6757
[2026-05-15 01:21:31,868 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14605793), 'atr_normalized': np.float32(0.1475693), 'prev_log_return': np.float32(0.13597175), 'usdchf_log_return': np.float32(0.14278404), 'xagusd_log_return': np.float32(0.13986051), 'xtiusd_log_return': np.float32(0.14120284), 'synth_vix_zscore': np.float32(0.14655364)}
[2026-05-15 01:21:31,869 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:21:32,022 INFO] src.engine_xgb: XGB Train Acc: 0.6869 | Test Acc: 0.6869
[2026-05-15 01:21:32,022 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11847194), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11716711), 'atr_normalized': np.float32(0.1368787), 'prev_log_return': np.float32(0.11775052), 'usdchf_log_return': np.float32(0.13128291), 'xagusd_log_return': np.float32(0.12365152), 'xtiusd_log_return': np.float32(0.13153368), 'synth_vix_zscore': np.float32(0.12326356)}
[2026-05-15 01:21:32,023 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:21:32,184 INFO] src.engine_xgb: XGB Train Acc: 0.6972 | Test Acc: 0.6972
[2026-05-15 01:21:32,184 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10916555), 'gmm_vol_cluster': np.float32(0.11370447), 'rsi_slope': np.float32(0.11928127), 'atr_normalized': np.float32(0.094855346), 'prev_log_return': np.float32(0.11108426), 'usdchf_log_return': np.float32(0.10619199), 'xagusd_log_return': np.float32(0.1176372), 'xtiusd_log_return': np.float32(0.117148474), 'synth_vix_zscore': np.float32(0.110931404)}
[2026-05-15 01:21:32,185 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:21:32,186 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.50441, -0.08685) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:32,290 INFO] src.backtester: Backtest [H1]: Sharpe=-2.784 | MaxDD=0.210 | WR=0.245 | Return=-15.6% | Trades=110
[2026-05-15 01:21:32,290 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:32,517 INFO] src.engine_xgb: XGB Train Acc: 0.6373 | Test Acc: 0.6373
[2026-05-15 01:21:32,517 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10656272), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1278847), 'atr_normalized': np.float32(0.119036436), 'prev_log_return': np.float32(0.12276581), 'usdchf_log_return': np.float32(0.12820409), 'xagusd_log_return': np.float32(0.12983096), 'xtiusd_log_return': np.float32(0.12592445), 'synth_vix_zscore': np.float32(0.13979085)}
[2026-05-15 01:21:32,518 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:21:32,730 INFO] src.engine_xgb: XGB Train Acc: 0.6637 | Test Acc: 0.6637
[2026-05-15 01:21:32,730 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12158964), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12442821), 'atr_normalized': np.float32(0.12625171), 'prev_log_return': np.float32(0.123449676), 'usdchf_log_return': np.float32(0.12719631), 'xagusd_log_return': np.float32(0.12965259), 'xtiusd_log_return': np.float32(0.1259768), 'synth_vix_zscore': np.float32(0.121455096)}
[2026-05-15 01:21:32,731 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:21:32,946 INFO] src.engine_xgb: XGB Train Acc: 0.6864 | Test Acc: 0.6864
[2026-05-15 01:21:32,947 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.116556), 'gmm_vol_cluster': np.float32(0.09294525), 'rsi_slope': np.float32(0.12956023), 'atr_normalized': np.float32(0.09891744), 'prev_log_return': np.float32(0.10218282), 'usdchf_log_return': np.float32(0.10821306), 'xagusd_log_return': np.float32(0.12287556), 'xtiusd_log_return': np.float32(0.117341004), 'synth_vix_zscore': np.float32(0.111408636)}
[2026-05-15 01:21:32,947 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:21:32,948 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.49357, -0.10582) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:33,059 INFO] src.backtester: Backtest [H1]: Sharpe=-0.763 | MaxDD=0.125 | WR=0.294 | Return=-4.4% | Trades=102
[2026-05-15 01:21:33,059 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:33,312 INFO] src.engine_xgb: XGB Train Acc: 0.6157 | Test Acc: 0.6157
[2026-05-15 01:21:33,313 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13929881), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12069937), 'atr_normalized': np.float32(0.119255304), 'prev_log_return': np.float32(0.1250191), 'usdchf_log_return': np.float32(0.124237716), 'xagusd_log_return': np.float32(0.12624924), 'xtiusd_log_return': np.float32(0.11780035), 'synth_vix_zscore': np.float32(0.1274401)}
[2026-05-15 01:21:33,313 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:21:33,627 INFO] src.engine_xgb: XGB Train Acc: 0.6516 | Test Acc: 0.6516
[2026-05-15 01:21:33,628 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11380761), 'gmm_vol_cluster': np.float32(0.10191811), 'rsi_slope': np.float32(0.119229734), 'atr_normalized': np.float32(0.11189656), 'prev_log_return': np.float32(0.11033505), 'usdchf_log_return': np.float32(0.11412817), 'xagusd_log_return': np.float32(0.10664655), 'xtiusd_log_return': np.float32(0.11217929), 'synth_vix_zscore': np.float32(0.10985899)}
[2026-05-15 01:21:33,628 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:21:33,944 INFO] src.engine_xgb: XGB Train Acc: 0.6582 | Test Acc: 0.6582
[2026-05-15 01:21:33,945 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09603103), 'gmm_vol_cluster': np.float32(0.10579911), 'rsi_slope': np.float32(0.118660204), 'atr_normalized': np.float32(0.1056596), 'prev_log_return': np.float32(0.1085412), 'usdchf_log_return': np.float32(0.10971726), 'xagusd_log_return': np.float32(0.12602524), 'xtiusd_log_return': np.float32(0.11560443), 'synth_vix_zscore': np.float32(0.113961965)}
[2026-05-15 01:21:33,945 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:21:33,947 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.36542, 0.20284) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:34,035 INFO] src.backtester: Backtest [H1]: Sharpe=-2.086 | MaxDD=0.079 | WR=0.348 | Return=-5.9% | Trades=69
[2026-05-15 01:21:34,035 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:34,049 INFO] src.optimizer: WFO [H1] window start=17280: trades=69 sharpe=-2.086 cv_sharpe=-1.773 score=-0.500
[2026-05-15 01:21:35,664 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:21:35,664 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:21:35,664 INFO] src.engine_hmm: Bull 0.9678 0.0092 0.0230
[2026-05-15 01:21:35,665 INFO] src.engine_hmm: Bear 0.0211 0.9759 0.0030
[2026-05-15 01:21:35,665 INFO] src.engine_hmm: Chop 0.0173 0.0063 0.9764
[2026-05-15 01:21:35,665 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:21:35,665 INFO] src.engine_hmm: Bull: return=0.367944, vol=-0.100907, rsi_slope=-0.005684
[2026-05-15 01:21:35,665 INFO] src.engine_hmm: Bear: return=-0.333606, vol=1.196370, rsi_slope=0.011590
[2026-05-15 01:21:35,666 INFO] src.engine_hmm: Chop: return=-0.140034, vol=-0.651167, rsi_slope=-0.001854
[2026-05-15 01:21:35,666 INFO] src.engine_hmm: Total regime transitions: 269
[2026-05-15 01:21:35,666 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 15:00:00: Chop -> Bear
[2026-05-15 01:21:35,667 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 17:00:00: Bear -> Bull
[2026-05-15 01:21:35,667 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-13 13:00:00: Bull -> Chop
[2026-05-15 01:21:35,667 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-24 17:00:00: Chop -> Bull
[2026-05-15 01:21:35,667 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-27 14:00:00: Bull -> Chop
[2026-05-15 01:21:35,668 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-03 03:00:00: Chop -> Bull
[2026-05-15 01:21:35,668 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 01:00:00: Bull -> Bear
[2026-05-15 01:21:35,668 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 21:00:00: Bear -> Bull
[2026-05-15 01:21:35,669 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-08 01:00:00: Bull -> Bear
[2026-05-15 01:21:35,669 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-09 15:00:00: Bear -> Bull
[2026-05-15 01:21:35,692 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:21:35,703 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:21:35,984 INFO] src.engine_xgb: XGB Train Acc: 0.6433 | Test Acc: 0.6433
[2026-05-15 01:21:35,984 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14983965), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11658184), 'atr_normalized': np.float32(0.11542882), 'prev_log_return': np.float32(0.118789196), 'usdchf_log_return': np.float32(0.11880364), 'xagusd_log_return': np.float32(0.12974207), 'xtiusd_log_return': np.float32(0.1328757), 'synth_vix_zscore': np.float32(0.117939085)}
[2026-05-15 01:21:35,985 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:21:36,207 INFO] src.engine_xgb: XGB Train Acc: 0.6628 | Test Acc: 0.6628
[2026-05-15 01:21:36,207 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1094499), 'gmm_vol_cluster': np.float32(0.11988074), 'rsi_slope': np.float32(0.11805742), 'atr_normalized': np.float32(0.10635197), 'prev_log_return': np.float32(0.105594546), 'usdchf_log_return': np.float32(0.10918719), 'xagusd_log_return': np.float32(0.1139463), 'xtiusd_log_return': np.float32(0.10667958), 'synth_vix_zscore': np.float32(0.11085236)}
[2026-05-15 01:21:36,208 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:21:36,410 INFO] src.engine_xgb: XGB Train Acc: 0.6819 | Test Acc: 0.6819
[2026-05-15 01:21:36,410 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11248601), 'gmm_vol_cluster': np.float32(0.11163749), 'rsi_slope': np.float32(0.11174851), 'atr_normalized': np.float32(0.10555734), 'prev_log_return': np.float32(0.09845399), 'usdchf_log_return': np.float32(0.10730145), 'xagusd_log_return': np.float32(0.11811094), 'xtiusd_log_return': np.float32(0.11563659), 'synth_vix_zscore': np.float32(0.11906771)}
[2026-05-15 01:21:36,411 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:21:36,412 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.54544, 0.24324) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:36,519 INFO] src.backtester: Backtest [H1]: Sharpe=0.479 | MaxDD=0.073 | WR=0.352 | Return=2.2% | Trades=122
[2026-05-15 01:21:36,520 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:36,790 INFO] src.engine_xgb: XGB Train Acc: 0.6279 | Test Acc: 0.6279
[2026-05-15 01:21:36,790 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15018149), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12409835), 'atr_normalized': np.float32(0.117625244), 'prev_log_return': np.float32(0.116627224), 'usdchf_log_return': np.float32(0.122432075), 'xagusd_log_return': np.float32(0.12803783), 'xtiusd_log_return': np.float32(0.12178004), 'synth_vix_zscore': np.float32(0.11921777)}
[2026-05-15 01:21:36,791 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:21:37,047 INFO] src.engine_xgb: XGB Train Acc: 0.6382 | Test Acc: 0.6382
[2026-05-15 01:21:37,048 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10690633), 'gmm_vol_cluster': np.float32(0.13323551), 'rsi_slope': np.float32(0.1184626), 'atr_normalized': np.float32(0.104354106), 'prev_log_return': np.float32(0.108950526), 'usdchf_log_return': np.float32(0.107130766), 'xagusd_log_return': np.float32(0.10689117), 'xtiusd_log_return': np.float32(0.1015808), 'synth_vix_zscore': np.float32(0.112488225)}
[2026-05-15 01:21:37,048 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:21:37,311 INFO] src.engine_xgb: XGB Train Acc: 0.6636 | Test Acc: 0.6636
[2026-05-15 01:21:37,311 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.108360864), 'gmm_vol_cluster': np.float32(0.081244096), 'rsi_slope': np.float32(0.11510323), 'atr_normalized': np.float32(0.11159813), 'prev_log_return': np.float32(0.106783785), 'usdchf_log_return': np.float32(0.1158676), 'xagusd_log_return': np.float32(0.12133538), 'xtiusd_log_return': np.float32(0.12335835), 'synth_vix_zscore': np.float32(0.11634864)}
[2026-05-15 01:21:37,312 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:21:37,313 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.48586, 0.08539) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:37,429 INFO] src.backtester: Backtest [H1]: Sharpe=-3.744 | MaxDD=0.188 | WR=0.254 | Return=-15.4% | Trades=134
[2026-05-15 01:21:37,429 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:37,770 INFO] src.engine_xgb: XGB Train Acc: 0.6392 | Test Acc: 0.6392
[2026-05-15 01:21:37,771 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11899839), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13652043), 'atr_normalized': np.float32(0.12264456), 'prev_log_return': np.float32(0.12222998), 'usdchf_log_return': np.float32(0.122956514), 'xagusd_log_return': np.float32(0.1345046), 'xtiusd_log_return': np.float32(0.11845176), 'synth_vix_zscore': np.float32(0.1236938)}
[2026-05-15 01:21:37,771 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:21:38,085 INFO] src.engine_xgb: XGB Train Acc: 0.6484 | Test Acc: 0.6484
[2026-05-15 01:21:38,085 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11459124), 'gmm_vol_cluster': np.float32(0.10761185), 'rsi_slope': np.float32(0.11694493), 'atr_normalized': np.float32(0.108902074), 'prev_log_return': np.float32(0.11227112), 'usdchf_log_return': np.float32(0.10837899), 'xagusd_log_return': np.float32(0.11550879), 'xtiusd_log_return': np.float32(0.10443867), 'synth_vix_zscore': np.float32(0.11135234)}
[2026-05-15 01:21:38,086 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:21:38,416 INFO] src.engine_xgb: XGB Train Acc: 0.6525 | Test Acc: 0.6525
[2026-05-15 01:21:38,416 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10763939), 'gmm_vol_cluster': np.float32(0.10506647), 'rsi_slope': np.float32(0.116017826), 'atr_normalized': np.float32(0.11264129), 'prev_log_return': np.float32(0.10612719), 'usdchf_log_return': np.float32(0.10746576), 'xagusd_log_return': np.float32(0.12160302), 'xtiusd_log_return': np.float32(0.113591656), 'synth_vix_zscore': np.float32(0.109847434)}
[2026-05-15 01:21:38,417 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:21:38,418 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.51495, -0.03378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:38,512 INFO] src.backtester: Backtest [H1]: Sharpe=-4.781 | MaxDD=0.131 | WR=0.295 | Return=-11.8% | Trades=105
[2026-05-15 01:21:38,512 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:38,526 INFO] src.optimizer: WFO [H1] window start=21600: trades=105 sharpe=-4.781 cv_sharpe=-1.632 score=-0.500
[2026-05-15 01:21:41,521 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:21:41,521 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:21:41,521 INFO] src.engine_hmm: Bull 0.9773 0.0066 0.0161
[2026-05-15 01:21:41,522 INFO] src.engine_hmm: Bear 0.0053 0.9697 0.0250
[2026-05-15 01:21:41,522 INFO] src.engine_hmm: Chop 0.0321 0.0072 0.9608
[2026-05-15 01:21:41,522 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:21:41,522 INFO] src.engine_hmm: Bull: return=0.426763, vol=-0.583103, rsi_slope=-0.018534
[2026-05-15 01:21:41,522 INFO] src.engine_hmm: Bear: return=-0.630671, vol=1.431303, rsi_slope=0.003486
[2026-05-15 01:21:41,523 INFO] src.engine_hmm: Chop: return=-0.304264, vol=0.094063, rsi_slope=0.026713
[2026-05-15 01:21:41,523 INFO] src.engine_hmm: Total regime transitions: 297
[2026-05-15 01:21:41,524 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-08 02:00:00: Chop -> Bull
[2026-05-15 01:21:41,524 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-08 11:00:00: Bull -> Chop
[2026-05-15 01:21:41,525 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 12:00:00: Chop -> Bull
[2026-05-15 01:21:41,525 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 21:00:00: Bull -> Chop
[2026-05-15 01:21:41,525 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-15 01:00:00: Chop -> Bull
[2026-05-15 01:21:41,526 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-15 16:00:00: Bull -> Chop
[2026-05-15 01:21:41,526 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-16 13:00:00: Chop -> Bull
[2026-05-15 01:21:41,526 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-17 04:00:00: Bull -> Chop
[2026-05-15 01:21:41,527 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-18 04:00:00: Chop -> Bull
[2026-05-15 01:21:41,527 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-18 21:00:00: Bull -> Chop
[2026-05-15 01:21:41,550 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:21:41,562 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:21:41,791 INFO] src.engine_xgb: XGB Train Acc: 0.6820 | Test Acc: 0.6820
[2026-05-15 01:21:41,792 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11952365), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12348782), 'atr_normalized': np.float32(0.12831062), 'prev_log_return': np.float32(0.1306752), 'usdchf_log_return': np.float32(0.12073969), 'xagusd_log_return': np.float32(0.13144167), 'xtiusd_log_return': np.float32(0.12099578), 'synth_vix_zscore': np.float32(0.12482558)}
[2026-05-15 01:21:41,792 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:21:42,058 INFO] src.engine_xgb: XGB Train Acc: 0.6995 | Test Acc: 0.6995
[2026-05-15 01:21:42,058 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09622695), 'gmm_vol_cluster': np.float32(0.0828672), 'rsi_slope': np.float32(0.12776817), 'atr_normalized': np.float32(0.118468866), 'prev_log_return': np.float32(0.109834455), 'usdchf_log_return': np.float32(0.12189002), 'xagusd_log_return': np.float32(0.12193565), 'xtiusd_log_return': np.float32(0.10361346), 'synth_vix_zscore': np.float32(0.11739528)}
[2026-05-15 01:21:42,059 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:21:42,296 INFO] src.engine_xgb: XGB Train Acc: 0.6809 | Test Acc: 0.6809
[2026-05-15 01:21:42,296 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09799059), 'gmm_vol_cluster': np.float32(0.09165029), 'rsi_slope': np.float32(0.12062127), 'atr_normalized': np.float32(0.12484016), 'prev_log_return': np.float32(0.101065494), 'usdchf_log_return': np.float32(0.10982233), 'xagusd_log_return': np.float32(0.11099745), 'xtiusd_log_return': np.float32(0.112236515), 'synth_vix_zscore': np.float32(0.13077588)}
[2026-05-15 01:21:42,297 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:21:42,298 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.16146, 0.63340) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:42,416 INFO] src.backtester: Backtest [H1]: Sharpe=-3.328 | MaxDD=0.132 | WR=0.271 | Return=-11.2% | Trades=107
[2026-05-15 01:21:42,417 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:42,729 INFO] src.engine_xgb: XGB Train Acc: 0.6837 | Test Acc: 0.6837
[2026-05-15 01:21:42,730 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1231178), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1342612), 'atr_normalized': np.float32(0.13271908), 'prev_log_return': np.float32(0.12595004), 'usdchf_log_return': np.float32(0.11737126), 'xagusd_log_return': np.float32(0.13404791), 'xtiusd_log_return': np.float32(0.11877148), 'synth_vix_zscore': np.float32(0.11376119)}
[2026-05-15 01:21:42,731 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:21:43,030 INFO] src.engine_xgb: XGB Train Acc: 0.6601 | Test Acc: 0.6601
[2026-05-15 01:21:43,030 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.097061366), 'gmm_vol_cluster': np.float32(0.10051927), 'rsi_slope': np.float32(0.12085622), 'atr_normalized': np.float32(0.11878892), 'prev_log_return': np.float32(0.11292141), 'usdchf_log_return': np.float32(0.11197452), 'xagusd_log_return': np.float32(0.11097143), 'xtiusd_log_return': np.float32(0.114429176), 'synth_vix_zscore': np.float32(0.11247773)}
[2026-05-15 01:21:43,030 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:21:43,316 INFO] src.engine_xgb: XGB Train Acc: 0.6611 | Test Acc: 0.6611
[2026-05-15 01:21:43,317 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11248936), 'gmm_vol_cluster': np.float32(0.09163421), 'rsi_slope': np.float32(0.11665452), 'atr_normalized': np.float32(0.11547879), 'prev_log_return': np.float32(0.11049141), 'usdchf_log_return': np.float32(0.11620662), 'xagusd_log_return': np.float32(0.11571587), 'xtiusd_log_return': np.float32(0.10276399), 'synth_vix_zscore': np.float32(0.118565306)}
[2026-05-15 01:21:43,317 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:21:43,319 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47142, 0.22575) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:43,435 INFO] src.backtester: Backtest [H1]: Sharpe=-0.543 | MaxDD=0.059 | WR=0.289 | Return=-1.9% | Trades=121
[2026-05-15 01:21:43,435 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:43,812 INFO] src.engine_xgb: XGB Train Acc: 0.6880 | Test Acc: 0.6880
[2026-05-15 01:21:43,812 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13316064), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13587222), 'atr_normalized': np.float32(0.12787691), 'prev_log_return': np.float32(0.1171053), 'usdchf_log_return': np.float32(0.11390412), 'xagusd_log_return': np.float32(0.123652674), 'xtiusd_log_return': np.float32(0.11589746), 'synth_vix_zscore': np.float32(0.13253057)}
[2026-05-15 01:21:43,813 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:21:44,151 INFO] src.engine_xgb: XGB Train Acc: 0.6619 | Test Acc: 0.6619
[2026-05-15 01:21:44,151 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.098933674), 'gmm_vol_cluster': np.float32(0.124128796), 'rsi_slope': np.float32(0.119287774), 'atr_normalized': np.float32(0.11251), 'prev_log_return': np.float32(0.11381389), 'usdchf_log_return': np.float32(0.10819614), 'xagusd_log_return': np.float32(0.11269641), 'xtiusd_log_return': np.float32(0.10885176), 'synth_vix_zscore': np.float32(0.10158154)}
[2026-05-15 01:21:44,151 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:21:44,509 INFO] src.engine_xgb: XGB Train Acc: 0.6531 | Test Acc: 0.6531
[2026-05-15 01:21:44,509 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09865251), 'gmm_vol_cluster': np.float32(0.09893767), 'rsi_slope': np.float32(0.12054777), 'atr_normalized': np.float32(0.11922485), 'prev_log_return': np.float32(0.10664214), 'usdchf_log_return': np.float32(0.10712974), 'xagusd_log_return': np.float32(0.11531163), 'xtiusd_log_return': np.float32(0.10828245), 'synth_vix_zscore': np.float32(0.12527119)}
[2026-05-15 01:21:44,510 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:21:44,511 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.62208, 0.06248) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:44,609 INFO] src.backtester: Backtest [H1]: Sharpe=-2.764 | MaxDD=0.108 | WR=0.287 | Return=-8.3% | Trades=87
[2026-05-15 01:21:44,610 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:44,624 INFO] src.optimizer: WFO [H1] window start=25920: trades=87 sharpe=-2.764 cv_sharpe=-1.935 score=-0.500
[2026-05-15 01:21:45,528 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:21:45,528 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:21:45,528 INFO] src.engine_hmm: Bull 0.9617 0.0325 0.0058
[2026-05-15 01:21:45,529 INFO] src.engine_hmm: Bear 0.0137 0.9761 0.0102
[2026-05-15 01:21:45,529 INFO] src.engine_hmm: Chop 0.0328 0.0066 0.9606
[2026-05-15 01:21:45,529 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:21:45,529 INFO] src.engine_hmm: Bull: return=0.365938, vol=0.070377, rsi_slope=-0.026526
[2026-05-15 01:21:45,530 INFO] src.engine_hmm: Bear: return=-0.212803, vol=-0.560556, rsi_slope=0.001653
[2026-05-15 01:21:45,530 INFO] src.engine_hmm: Chop: return=-0.083720, vol=1.441989, rsi_slope=0.044717
[2026-05-15 01:21:45,530 INFO] src.engine_hmm: Total regime transitions: 309
[2026-05-15 01:21:45,530 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 16:00:00: Bear -> Chop
[2026-05-15 01:21:45,531 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 01:00:00: Chop -> Bull
[2026-05-15 01:21:45,531 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 12:00:00: Bull -> Bear
[2026-05-15 01:21:45,531 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-08 17:00:00: Bear -> Bull
[2026-05-15 01:21:45,532 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-09 11:00:00: Bull -> Bear
[2026-05-15 01:21:45,532 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 15:00:00: Bear -> Chop
[2026-05-15 01:21:45,532 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 16:00:00: Chop -> Bull
[2026-05-15 01:21:45,532 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-11 12:00:00: Bull -> Bear
[2026-05-15 01:21:45,533 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-14 10:00:00: Bear -> Chop
[2026-05-15 01:21:45,533 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-14 17:00:00: Chop -> Bull
[2026-05-15 01:21:45,559 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:21:45,571 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:21:45,793 INFO] src.engine_xgb: XGB Train Acc: 0.7050 | Test Acc: 0.7050
[2026-05-15 01:21:45,794 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12644574), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14419708), 'atr_normalized': np.float32(0.13138752), 'prev_log_return': np.float32(0.11998985), 'usdchf_log_return': np.float32(0.11863693), 'xagusd_log_return': np.float32(0.12771769), 'xtiusd_log_return': np.float32(0.10945863), 'synth_vix_zscore': np.float32(0.122166574)}
[2026-05-15 01:21:45,794 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:21:46,027 INFO] src.engine_xgb: XGB Train Acc: 0.6869 | Test Acc: 0.6869
[2026-05-15 01:21:46,028 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.117012985), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13754976), 'atr_normalized': np.float32(0.11029557), 'prev_log_return': np.float32(0.12503785), 'usdchf_log_return': np.float32(0.12605816), 'xagusd_log_return': np.float32(0.121119075), 'xtiusd_log_return': np.float32(0.13158642), 'synth_vix_zscore': np.float32(0.13134013)}
[2026-05-15 01:21:46,028 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:21:46,273 INFO] src.engine_xgb: XGB Train Acc: 0.6717 | Test Acc: 0.6717
[2026-05-15 01:21:46,273 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10091196), 'gmm_vol_cluster': np.float32(0.11378942), 'rsi_slope': np.float32(0.11686085), 'atr_normalized': np.float32(0.11339655), 'prev_log_return': np.float32(0.110312104), 'usdchf_log_return': np.float32(0.123533346), 'xagusd_log_return': np.float32(0.110126294), 'xtiusd_log_return': np.float32(0.106502004), 'synth_vix_zscore': np.float32(0.10456751)}
[2026-05-15 01:21:46,274 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:21:46,275 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.56732, -0.02191) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:46,395 INFO] src.backtester: Backtest [H1]: Sharpe=-2.644 | MaxDD=0.127 | WR=0.261 | Return=-10.6% | Trades=115
[2026-05-15 01:21:46,395 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:46,695 INFO] src.engine_xgb: XGB Train Acc: 0.6816 | Test Acc: 0.6816
[2026-05-15 01:21:46,695 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.122771874), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14362052), 'atr_normalized': np.float32(0.12149342), 'prev_log_return': np.float32(0.12389879), 'usdchf_log_return': np.float32(0.11554582), 'xagusd_log_return': np.float32(0.12650274), 'xtiusd_log_return': np.float32(0.11091065), 'synth_vix_zscore': np.float32(0.13525619)}
[2026-05-15 01:21:46,696 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:21:46,983 INFO] src.engine_xgb: XGB Train Acc: 0.6794 | Test Acc: 0.6794
[2026-05-15 01:21:46,984 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.109604806), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12272417), 'atr_normalized': np.float32(0.11885989), 'prev_log_return': np.float32(0.13118994), 'usdchf_log_return': np.float32(0.12463887), 'xagusd_log_return': np.float32(0.13424855), 'xtiusd_log_return': np.float32(0.1315049), 'synth_vix_zscore': np.float32(0.12722892)}
[2026-05-15 01:21:46,984 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:21:47,287 INFO] src.engine_xgb: XGB Train Acc: 0.6677 | Test Acc: 0.6677
[2026-05-15 01:21:47,289 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1055734), 'gmm_vol_cluster': np.float32(0.1197732), 'rsi_slope': np.float32(0.114320055), 'atr_normalized': np.float32(0.10548187), 'prev_log_return': np.float32(0.11586944), 'usdchf_log_return': np.float32(0.10732735), 'xagusd_log_return': np.float32(0.1217398), 'xtiusd_log_return': np.float32(0.10290566), 'synth_vix_zscore': np.float32(0.10700924)}
[2026-05-15 01:21:47,290 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:21:47,291 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47816, 0.15210) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:47,416 INFO] src.backtester: Backtest [H1]: Sharpe=-1.596 | MaxDD=0.071 | WR=0.253 | Return=-5.3% | Trades=91
[2026-05-15 01:21:47,417 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:47,784 INFO] src.engine_xgb: XGB Train Acc: 0.6793 | Test Acc: 0.6793
[2026-05-15 01:21:47,785 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11044009), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13102801), 'atr_normalized': np.float32(0.123164214), 'prev_log_return': np.float32(0.12064359), 'usdchf_log_return': np.float32(0.12169477), 'xagusd_log_return': np.float32(0.12955397), 'xtiusd_log_return': np.float32(0.13001207), 'synth_vix_zscore': np.float32(0.13346335)}
[2026-05-15 01:21:47,785 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:21:48,120 INFO] src.engine_xgb: XGB Train Acc: 0.6952 | Test Acc: 0.6952
[2026-05-15 01:21:48,121 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10369595), 'gmm_vol_cluster': np.float32(0.12504344), 'rsi_slope': np.float32(0.10965133), 'atr_normalized': np.float32(0.11295242), 'prev_log_return': np.float32(0.10662908), 'usdchf_log_return': np.float32(0.113438554), 'xagusd_log_return': np.float32(0.11620446), 'xtiusd_log_return': np.float32(0.10506894), 'synth_vix_zscore': np.float32(0.10731583)}
[2026-05-15 01:21:48,121 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:21:48,457 INFO] src.engine_xgb: XGB Train Acc: 0.6760 | Test Acc: 0.6760
[2026-05-15 01:21:48,458 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.101364315), 'gmm_vol_cluster': np.float32(0.12393773), 'rsi_slope': np.float32(0.117932275), 'atr_normalized': np.float32(0.105633706), 'prev_log_return': np.float32(0.11733544), 'usdchf_log_return': np.float32(0.1086785), 'xagusd_log_return': np.float32(0.10956368), 'xtiusd_log_return': np.float32(0.10612981), 'synth_vix_zscore': np.float32(0.1094245)}
[2026-05-15 01:21:48,458 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:21:48,460 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.40708, 0.22442) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:48,553 INFO] src.backtester: Backtest [H1]: Sharpe=-3.231 | MaxDD=0.070 | WR=0.184 | Return=-6.1% | Trades=49
[2026-05-15 01:21:48,553 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:48,567 INFO] src.optimizer: WFO [H1] window start=30240: trades=49 sharpe=-3.231 cv_sharpe=-2.120 score=-0.500
[2026-05-15 01:21:50,049 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:21:50,050 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:21:50,050 INFO] src.engine_hmm: Bull 0.9692 0.0195 0.0113
[2026-05-15 01:21:50,050 INFO] src.engine_hmm: Bear 0.0163 0.9719 0.0118
[2026-05-15 01:21:50,050 INFO] src.engine_hmm: Chop 0.0181 0.0104 0.9714
[2026-05-15 01:21:50,051 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:21:50,051 INFO] src.engine_hmm: Bull: return=0.393172, vol=-0.423136, rsi_slope=-0.025441
[2026-05-15 01:21:50,051 INFO] src.engine_hmm: Bear: return=-0.687656, vol=-0.534641, rsi_slope=0.016591
[2026-05-15 01:21:50,051 INFO] src.engine_hmm: Chop: return=0.353532, vol=1.185622, rsi_slope=0.011408
[2026-05-15 01:21:50,052 INFO] src.engine_hmm: Total regime transitions: 285
[2026-05-15 01:21:50,052 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-23 09:00:00: Bull -> Bear
[2026-05-15 01:21:50,052 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-23 16:00:00: Bear -> Bull
[2026-05-15 01:21:50,053 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-24 05:00:00: Bull -> Chop
[2026-05-15 01:21:50,053 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-03 06:00:00: Chop -> Bull
[2026-05-15 01:21:50,054 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-04 02:00:00: Bull -> Chop
[2026-05-15 01:21:50,054 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-14 12:00:00: Chop -> Bear
[2026-05-15 01:21:50,054 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-15 03:00:00: Bear -> Chop
[2026-05-15 01:21:50,055 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-16 09:00:00: Chop -> Bear
[2026-05-15 01:21:50,056 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-16 21:00:00: Bear -> Chop
[2026-05-15 01:21:50,056 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-17 18:00:00: Chop -> Bull
[2026-05-15 01:21:50,078 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:21:50,089 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:21:50,305 INFO] src.engine_xgb: XGB Train Acc: 0.6632 | Test Acc: 0.6632
[2026-05-15 01:21:50,306 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1311439), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.108532816), 'atr_normalized': np.float32(0.12694404), 'prev_log_return': np.float32(0.12193399), 'usdchf_log_return': np.float32(0.1327392), 'xagusd_log_return': np.float32(0.1192103), 'xtiusd_log_return': np.float32(0.12175964), 'synth_vix_zscore': np.float32(0.13773613)}
[2026-05-15 01:21:50,307 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:21:50,549 INFO] src.engine_xgb: XGB Train Acc: 0.6995 | Test Acc: 0.6995
[2026-05-15 01:21:50,550 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09712104), 'gmm_vol_cluster': np.float32(0.091988236), 'rsi_slope': np.float32(0.11908266), 'atr_normalized': np.float32(0.11283413), 'prev_log_return': np.float32(0.12541188), 'usdchf_log_return': np.float32(0.111570455), 'xagusd_log_return': np.float32(0.11500418), 'xtiusd_log_return': np.float32(0.11262982), 'synth_vix_zscore': np.float32(0.114357546)}
[2026-05-15 01:21:50,550 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:21:50,783 INFO] src.engine_xgb: XGB Train Acc: 0.6728 | Test Acc: 0.6728
[2026-05-15 01:21:50,784 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11220427), 'gmm_vol_cluster': np.float32(0.11531836), 'rsi_slope': np.float32(0.10663562), 'atr_normalized': np.float32(0.109925), 'prev_log_return': np.float32(0.11183976), 'usdchf_log_return': np.float32(0.099748775), 'xagusd_log_return': np.float32(0.13683647), 'xtiusd_log_return': np.float32(0.10576072), 'synth_vix_zscore': np.float32(0.101731025)}
[2026-05-15 01:21:50,784 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:21:50,786 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.42962, 0.34995) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:50,899 INFO] src.backtester: Backtest [H1]: Sharpe=-0.837 | MaxDD=0.102 | WR=0.280 | Return=-3.9% | Trades=132
[2026-05-15 01:21:50,899 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:51,214 INFO] src.engine_xgb: XGB Train Acc: 0.6628 | Test Acc: 0.6628
[2026-05-15 01:21:51,214 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12757067), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12488869), 'atr_normalized': np.float32(0.12495214), 'prev_log_return': np.float32(0.122398205), 'usdchf_log_return': np.float32(0.12984641), 'xagusd_log_return': np.float32(0.116138175), 'xtiusd_log_return': np.float32(0.121068306), 'synth_vix_zscore': np.float32(0.1331374)}
[2026-05-15 01:21:51,215 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:21:51,501 INFO] src.engine_xgb: XGB Train Acc: 0.6872 | Test Acc: 0.6872
[2026-05-15 01:21:51,502 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.111983694), 'gmm_vol_cluster': np.float32(0.12689663), 'rsi_slope': np.float32(0.11522124), 'atr_normalized': np.float32(0.106626265), 'prev_log_return': np.float32(0.10752004), 'usdchf_log_return': np.float32(0.10846731), 'xagusd_log_return': np.float32(0.10930148), 'xtiusd_log_return': np.float32(0.10954309), 'synth_vix_zscore': np.float32(0.10444025)}
[2026-05-15 01:21:51,503 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:21:51,792 INFO] src.engine_xgb: XGB Train Acc: 0.6859 | Test Acc: 0.6859
[2026-05-15 01:21:51,792 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12455339), 'gmm_vol_cluster': np.float32(0.087100126), 'rsi_slope': np.float32(0.105013564), 'atr_normalized': np.float32(0.110607184), 'prev_log_return': np.float32(0.11975744), 'usdchf_log_return': np.float32(0.10605793), 'xagusd_log_return': np.float32(0.1133659), 'xtiusd_log_return': np.float32(0.112755276), 'synth_vix_zscore': np.float32(0.120789245)}
[2026-05-15 01:21:51,793 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:21:51,796 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47849, 0.22854) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:51,919 INFO] src.backtester: Backtest [H1]: Sharpe=-2.286 | MaxDD=0.094 | WR=0.250 | Return=-7.6% | Trades=108
[2026-05-15 01:21:51,920 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:52,258 INFO] src.engine_xgb: XGB Train Acc: 0.6755 | Test Acc: 0.6755
[2026-05-15 01:21:52,258 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10645408), 'gmm_vol_cluster': np.float32(0.12975632), 'rsi_slope': np.float32(0.100529425), 'atr_normalized': np.float32(0.10656758), 'prev_log_return': np.float32(0.11326146), 'usdchf_log_return': np.float32(0.11410152), 'xagusd_log_return': np.float32(0.10713827), 'xtiusd_log_return': np.float32(0.10503612), 'synth_vix_zscore': np.float32(0.11715521)}
[2026-05-15 01:21:52,259 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:21:52,604 INFO] src.engine_xgb: XGB Train Acc: 0.6785 | Test Acc: 0.6785
[2026-05-15 01:21:52,605 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09033191), 'gmm_vol_cluster': np.float32(0.11144599), 'rsi_slope': np.float32(0.11986019), 'atr_normalized': np.float32(0.118002355), 'prev_log_return': np.float32(0.10881808), 'usdchf_log_return': np.float32(0.11328697), 'xagusd_log_return': np.float32(0.112760566), 'xtiusd_log_return': np.float32(0.11261395), 'synth_vix_zscore': np.float32(0.11287996)}
[2026-05-15 01:21:52,605 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:21:52,955 INFO] src.engine_xgb: XGB Train Acc: 0.6686 | Test Acc: 0.6686
[2026-05-15 01:21:52,955 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11001967), 'gmm_vol_cluster': np.float32(0.09086568), 'rsi_slope': np.float32(0.10860372), 'atr_normalized': np.float32(0.11112851), 'prev_log_return': np.float32(0.12295844), 'usdchf_log_return': np.float32(0.11349958), 'xagusd_log_return': np.float32(0.11504949), 'xtiusd_log_return': np.float32(0.110893674), 'synth_vix_zscore': np.float32(0.1169812)}
[2026-05-15 01:21:52,956 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:21:52,957 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.64128, 0.06038) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:53,049 INFO] src.backtester: Backtest [H1]: Sharpe=0.885 | MaxDD=0.026 | WR=0.355 | Return=1.7% | Trades=31
[2026-05-15 01:21:53,049 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:53,062 INFO] src.optimizer: WFO [H1] window start=34560: trades=31 sharpe=0.885 cv_sharpe=-1.561 score=0.588
[2026-05-15 01:21:53,543 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:21:53,544 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:21:53,544 INFO] src.engine_hmm: Bull 0.9761 0.0076 0.0163
[2026-05-15 01:21:53,544 INFO] src.engine_hmm: Bear 0.0047 0.9743 0.0210
[2026-05-15 01:21:53,544 INFO] src.engine_hmm: Chop 0.0092 0.0154 0.9753
[2026-05-15 01:21:53,545 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:21:53,545 INFO] src.engine_hmm: Bull: return=0.719079, vol=1.295559, rsi_slope=-0.021367
[2026-05-15 01:21:53,545 INFO] src.engine_hmm: Bear: return=-0.838700, vol=-0.183607, rsi_slope=0.033987
[2026-05-15 01:21:53,545 INFO] src.engine_hmm: Chop: return=0.250736, vol=-0.554646, rsi_slope=-0.014323
[2026-05-15 01:21:53,546 INFO] src.engine_hmm: Total regime transitions: 237
[2026-05-15 01:21:53,547 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-16 06:00:00: Bull -> Chop
[2026-05-15 01:21:53,547 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-17 03:00:00: Chop -> Bear
[2026-05-15 01:21:53,547 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-23 20:00:00: Bear -> Chop
[2026-05-15 01:21:53,547 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-28 15:00:00: Chop -> Bear
[2026-05-15 01:21:53,549 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-29 06:00:00: Bear -> Chop
[2026-05-15 01:21:53,549 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 21:00:00: Chop -> Bull
[2026-05-15 01:21:53,550 INFO] src.engine_hmm: REGIME CHANGE at 2022-12-05 12:00:00: Bull -> Bear
[2026-05-15 01:21:53,550 INFO] src.engine_hmm: REGIME CHANGE at 2022-12-07 15:00:00: Bear -> Chop
[2026-05-15 01:21:53,550 INFO] src.engine_hmm: REGIME CHANGE at 2022-12-12 03:00:00: Chop -> Bear
[2026-05-15 01:21:53,550 INFO] src.engine_hmm: REGIME CHANGE at 2022-12-13 08:00:00: Bear -> Chop
[2026-05-15 01:21:53,571 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:21:53,582 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:21:53,797 INFO] src.engine_xgb: XGB Train Acc: 0.6768 | Test Acc: 0.6768
[2026-05-15 01:21:53,797 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11172123), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12159414), 'atr_normalized': np.float32(0.12709285), 'prev_log_return': np.float32(0.122279055), 'usdchf_log_return': np.float32(0.12908423), 'xagusd_log_return': np.float32(0.13234241), 'xtiusd_log_return': np.float32(0.12655175), 'synth_vix_zscore': np.float32(0.12933429)}
[2026-05-15 01:21:53,798 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:21:54,021 INFO] src.engine_xgb: XGB Train Acc: 0.6890 | Test Acc: 0.6890
[2026-05-15 01:21:54,021 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12270383), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12794758), 'atr_normalized': np.float32(0.12905733), 'prev_log_return': np.float32(0.12905361), 'usdchf_log_return': np.float32(0.12356664), 'xagusd_log_return': np.float32(0.12350773), 'xtiusd_log_return': np.float32(0.12552628), 'synth_vix_zscore': np.float32(0.11863703)}
[2026-05-15 01:21:54,022 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:21:54,277 INFO] src.engine_xgb: XGB Train Acc: 0.6728 | Test Acc: 0.6728
[2026-05-15 01:21:54,277 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1156586), 'gmm_vol_cluster': np.float32(0.104464814), 'rsi_slope': np.float32(0.12040897), 'atr_normalized': np.float32(0.10677284), 'prev_log_return': np.float32(0.114596695), 'usdchf_log_return': np.float32(0.111909404), 'xagusd_log_return': np.float32(0.11386803), 'xtiusd_log_return': np.float32(0.106770255), 'synth_vix_zscore': np.float32(0.105550386)}
[2026-05-15 01:21:54,278 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:21:54,280 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.13686, 0.71017) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:54,404 INFO] src.backtester: Backtest [H1]: Sharpe=-1.892 | MaxDD=0.058 | WR=0.206 | Return=-4.3% | Trades=97
[2026-05-15 01:21:54,405 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:54,724 INFO] src.engine_xgb: XGB Train Acc: 0.6946 | Test Acc: 0.6946
[2026-05-15 01:21:54,724 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13076383), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1277361), 'atr_normalized': np.float32(0.119359516), 'prev_log_return': np.float32(0.123334534), 'usdchf_log_return': np.float32(0.12219498), 'xagusd_log_return': np.float32(0.1211614), 'xtiusd_log_return': np.float32(0.13004938), 'synth_vix_zscore': np.float32(0.12540026)}
[2026-05-15 01:21:54,725 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:21:55,013 INFO] src.engine_xgb: XGB Train Acc: 0.6653 | Test Acc: 0.6653
[2026-05-15 01:21:55,014 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09576331), 'gmm_vol_cluster': np.float32(0.11873384), 'rsi_slope': np.float32(0.11350938), 'atr_normalized': np.float32(0.10461904), 'prev_log_return': np.float32(0.117396235), 'usdchf_log_return': np.float32(0.111176535), 'xagusd_log_return': np.float32(0.10911326), 'xtiusd_log_return': np.float32(0.11936911), 'synth_vix_zscore': np.float32(0.11031934)}
[2026-05-15 01:21:55,014 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:21:55,303 INFO] src.engine_xgb: XGB Train Acc: 0.6808 | Test Acc: 0.6808
[2026-05-15 01:21:55,303 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11095329), 'gmm_vol_cluster': np.float32(0.10135559), 'rsi_slope': np.float32(0.11120578), 'atr_normalized': np.float32(0.113058604), 'prev_log_return': np.float32(0.12308868), 'usdchf_log_return': np.float32(0.10644196), 'xagusd_log_return': np.float32(0.10681749), 'xtiusd_log_return': np.float32(0.116571985), 'synth_vix_zscore': np.float32(0.11050655)}
[2026-05-15 01:21:55,304 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:21:55,305 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.51565, 0.29314) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:55,426 INFO] src.backtester: Backtest [H1]: Sharpe=-2.885 | MaxDD=0.124 | WR=0.218 | Return=-9.4% | Trades=110
[2026-05-15 01:21:55,427 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:55,790 INFO] src.engine_xgb: XGB Train Acc: 0.6825 | Test Acc: 0.6825
[2026-05-15 01:21:55,790 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12547022), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12677227), 'atr_normalized': np.float32(0.120161116), 'prev_log_return': np.float32(0.12675619), 'usdchf_log_return': np.float32(0.1160082), 'xagusd_log_return': np.float32(0.13044621), 'xtiusd_log_return': np.float32(0.12835665), 'synth_vix_zscore': np.float32(0.12602913)}
[2026-05-15 01:21:55,791 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:21:56,131 INFO] src.engine_xgb: XGB Train Acc: 0.6564 | Test Acc: 0.6564
[2026-05-15 01:21:56,131 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.086148426), 'gmm_vol_cluster': np.float32(0.12928857), 'rsi_slope': np.float32(0.11193423), 'atr_normalized': np.float32(0.1040356), 'prev_log_return': np.float32(0.11761322), 'usdchf_log_return': np.float32(0.11756988), 'xagusd_log_return': np.float32(0.10712449), 'xtiusd_log_return': np.float32(0.11708403), 'synth_vix_zscore': np.float32(0.10920149)}
[2026-05-15 01:21:56,132 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:21:56,515 INFO] src.engine_xgb: XGB Train Acc: 0.6558 | Test Acc: 0.6558
[2026-05-15 01:21:56,516 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09990299), 'gmm_vol_cluster': np.float32(0.10723511), 'rsi_slope': np.float32(0.11841639), 'atr_normalized': np.float32(0.124280006), 'prev_log_return': np.float32(0.10992215), 'usdchf_log_return': np.float32(0.11202054), 'xagusd_log_return': np.float32(0.10555492), 'xtiusd_log_return': np.float32(0.10589255), 'synth_vix_zscore': np.float32(0.11677535)}
[2026-05-15 01:21:56,516 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:21:56,518 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.46960, 0.34543) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:56,613 INFO] src.backtester: Backtest [H1]: Sharpe=-5.097 | MaxDD=0.137 | WR=0.215 | Return=-11.9% | Trades=65
[2026-05-15 01:21:56,614 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:56,628 INFO] src.optimizer: WFO [H1] window start=38880: trades=65 sharpe=-5.097 cv_sharpe=-2.388 score=-0.500
[2026-05-15 01:21:57,026 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:21:57,026 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:21:57,027 INFO] src.engine_hmm: Bull 0.9766 0.0055 0.0178
[2026-05-15 01:21:57,027 INFO] src.engine_hmm: Bear 0.0107 0.9695 0.0198
[2026-05-15 01:21:57,027 INFO] src.engine_hmm: Chop 0.0117 0.0079 0.9804
[2026-05-15 01:21:57,027 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:21:57,028 INFO] src.engine_hmm: Bull: return=0.902070, vol=-0.075463, rsi_slope=-0.024845
[2026-05-15 01:21:57,028 INFO] src.engine_hmm: Bear: return=-0.753282, vol=1.358508, rsi_slope=0.003911
[2026-05-15 01:21:57,028 INFO] src.engine_hmm: Chop: return=-0.316248, vol=-0.465841, rsi_slope=0.015108
[2026-05-15 01:21:57,028 INFO] src.engine_hmm: Total regime transitions: 229
[2026-05-15 01:21:57,029 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-23 16:00:00: Chop -> Bull
[2026-05-15 01:21:57,029 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-24 13:00:00: Bull -> Chop
[2026-05-15 01:21:57,029 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-29 17:00:00: Chop -> Bull
[2026-05-15 01:21:57,030 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-31 10:00:00: Bull -> Chop
[2026-05-15 01:21:57,030 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-15 16:00:00: Chop -> Bull
[2026-05-15 01:21:57,030 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-18 13:00:00: Bull -> Chop
[2026-05-15 01:21:57,030 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-20 17:00:00: Chop -> Bull
[2026-05-15 01:21:57,031 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-20 23:00:00: Bull -> Chop
[2026-05-15 01:21:57,031 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-26 18:00:00: Chop -> Bear
[2026-05-15 01:21:57,031 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-29 08:00:00: Bear -> Chop
[2026-05-15 01:21:57,054 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:21:57,065 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:21:57,293 INFO] src.engine_xgb: XGB Train Acc: 0.7008 | Test Acc: 0.7008
[2026-05-15 01:21:57,294 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1458779), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12495566), 'atr_normalized': np.float32(0.11316024), 'prev_log_return': np.float32(0.12280585), 'usdchf_log_return': np.float32(0.12866707), 'xagusd_log_return': np.float32(0.11545331), 'xtiusd_log_return': np.float32(0.12824257), 'synth_vix_zscore': np.float32(0.120837316)}
[2026-05-15 01:21:57,294 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:21:57,544 INFO] src.engine_xgb: XGB Train Acc: 0.6670 | Test Acc: 0.6670
[2026-05-15 01:21:57,544 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.115607366), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11590024), 'atr_normalized': np.float32(0.11846738), 'prev_log_return': np.float32(0.121859446), 'usdchf_log_return': np.float32(0.12132765), 'xagusd_log_return': np.float32(0.12502351), 'xtiusd_log_return': np.float32(0.1322616), 'synth_vix_zscore': np.float32(0.14955287)}
[2026-05-15 01:21:57,545 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:21:57,771 INFO] src.engine_xgb: XGB Train Acc: 0.6657 | Test Acc: 0.6657
[2026-05-15 01:21:57,771 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09766005), 'gmm_vol_cluster': np.float32(0.08671717), 'rsi_slope': np.float32(0.111787125), 'atr_normalized': np.float32(0.10485274), 'prev_log_return': np.float32(0.120403185), 'usdchf_log_return': np.float32(0.12251889), 'xagusd_log_return': np.float32(0.11572254), 'xtiusd_log_return': np.float32(0.12432763), 'synth_vix_zscore': np.float32(0.11601059)}
[2026-05-15 01:21:57,771 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:21:57,773 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.73608, -0.15122) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:57,886 INFO] src.backtester: Backtest [H1]: Sharpe=-0.539 | MaxDD=0.081 | WR=0.349 | Return=-2.1% | Trades=109
[2026-05-15 01:21:57,886 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:58,181 INFO] src.engine_xgb: XGB Train Acc: 0.6722 | Test Acc: 0.6722
[2026-05-15 01:21:58,181 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13065827), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.116992965), 'atr_normalized': np.float32(0.11725126), 'prev_log_return': np.float32(0.1291301), 'usdchf_log_return': np.float32(0.12402834), 'xagusd_log_return': np.float32(0.12647037), 'xtiusd_log_return': np.float32(0.12957098), 'synth_vix_zscore': np.float32(0.12589772)}
[2026-05-15 01:21:58,181 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:21:58,465 INFO] src.engine_xgb: XGB Train Acc: 0.6606 | Test Acc: 0.6606
[2026-05-15 01:21:58,466 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.108485386), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12380165), 'atr_normalized': np.float32(0.118917346), 'prev_log_return': np.float32(0.13266166), 'usdchf_log_return': np.float32(0.13159151), 'xagusd_log_return': np.float32(0.12514302), 'xtiusd_log_return': np.float32(0.12638703), 'synth_vix_zscore': np.float32(0.1330124)}
[2026-05-15 01:21:58,466 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:21:58,773 INFO] src.engine_xgb: XGB Train Acc: 0.6510 | Test Acc: 0.6510
[2026-05-15 01:21:58,774 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1320015), 'gmm_vol_cluster': np.float32(0.093920216), 'rsi_slope': np.float32(0.11443599), 'atr_normalized': np.float32(0.11967371), 'prev_log_return': np.float32(0.10875262), 'usdchf_log_return': np.float32(0.11162976), 'xagusd_log_return': np.float32(0.106798746), 'xtiusd_log_return': np.float32(0.10534108), 'synth_vix_zscore': np.float32(0.10744639)}
[2026-05-15 01:21:58,774 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:21:58,777 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53526, 0.16378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:21:58,896 INFO] src.backtester: Backtest [H1]: Sharpe=0.295 | MaxDD=0.069 | WR=0.322 | Return=1.0% | Trades=121
[2026-05-15 01:21:58,897 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:21:59,233 INFO] src.engine_xgb: XGB Train Acc: 0.6427 | Test Acc: 0.6427
[2026-05-15 01:21:59,234 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14500152), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.119382896), 'atr_normalized': np.float32(0.11821244), 'prev_log_return': np.float32(0.13091956), 'usdchf_log_return': np.float32(0.11924969), 'xagusd_log_return': np.float32(0.119683005), 'xtiusd_log_return': np.float32(0.12957321), 'synth_vix_zscore': np.float32(0.11797771)}
[2026-05-15 01:21:59,234 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:21:59,585 INFO] src.engine_xgb: XGB Train Acc: 0.6464 | Test Acc: 0.6464
[2026-05-15 01:21:59,585 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.111863956), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12217835), 'atr_normalized': np.float32(0.1233382), 'prev_log_return': np.float32(0.12508741), 'usdchf_log_return': np.float32(0.12849073), 'xagusd_log_return': np.float32(0.12765433), 'xtiusd_log_return': np.float32(0.121235624), 'synth_vix_zscore': np.float32(0.14015141)}
[2026-05-15 01:21:59,586 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:21:59,920 INFO] src.engine_xgb: XGB Train Acc: 0.6239 | Test Acc: 0.6239
[2026-05-15 01:21:59,920 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1202578), 'gmm_vol_cluster': np.float32(0.10601375), 'rsi_slope': np.float32(0.11717577), 'atr_normalized': np.float32(0.11481428), 'prev_log_return': np.float32(0.10607537), 'usdchf_log_return': np.float32(0.105904914), 'xagusd_log_return': np.float32(0.11028686), 'xtiusd_log_return': np.float32(0.110281736), 'synth_vix_zscore': np.float32(0.10918948)}
[2026-05-15 01:21:59,921 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:21:59,922 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.43440, 0.22813) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:00,015 INFO] src.backtester: Backtest [H1]: Sharpe=-0.586 | MaxDD=0.079 | WR=0.362 | Return=-1.6% | Trades=58
[2026-05-15 01:22:00,015 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:00,028 INFO] src.optimizer: WFO [H1] window start=43200: trades=58 sharpe=-0.586 cv_sharpe=-0.122 score=-0.535
[2026-05-15 01:22:00,030 INFO] src.optimizer: WFO [H1]: 8/8 valid | median_trades=67 | score=-0.572 | std_sharpe=1.876 | WFE=1.38 | window_scores=[-0.5, -0.5, -0.5, -0.5, -0.5, 0.588, -0.5, -0.535]
[2026-05-15 01:22:00,081 INFO] src.optimizer: Trial 34 [H1/headway_cent $15 standard]: score=-1.010 | valid=8/8 | std_sharpe=1.876 | median_trades=67 | WFE=1.38 | scores=[-0.5, -0.5, -0.5, -0.5, -0.5, 0.588, -0.5, -0.535]
[ 35/200] Best Score: -0.320 | ETA: 1h 34m RAM: 62%
Best trial: 23. Best value: -0.320363: 18%|███████████▉ | 35/200 [19:59<1:34:55, 34.52s/it][2026-05-15 01:22:01,654 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:22:01,654 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:22:01,655 INFO] src.engine_hmm: Bull 0.9706 0.0000 0.0034 0.0260
[2026-05-15 01:22:01,655 INFO] src.engine_hmm: Bear 0.0031 0.9671 0.0248 0.0051
[2026-05-15 01:22:01,655 INFO] src.engine_hmm: Chop_Low 0.0060 0.0342 0.9436 0.0162
[2026-05-15 01:22:01,656 INFO] src.engine_hmm: Chop_High 0.0098 0.0055 0.0291 0.9556
[2026-05-15 01:22:01,656 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:22:01,656 INFO] src.engine_hmm: Bull: return=0.047942, vol=1.726887, rsi_slope=-0.023866
[2026-05-15 01:22:01,657 INFO] src.engine_hmm: Bear: return=-0.013657, vol=-0.821714, rsi_slope=-0.005271
[2026-05-15 01:22:01,657 INFO] src.engine_hmm: Chop_Low: return=-0.003386, vol=-0.335767, rsi_slope=-0.002998
[2026-05-15 01:22:01,657 INFO] src.engine_hmm: Chop_High: return=-0.011480, vol=0.289552, rsi_slope=0.027789
[2026-05-15 01:22:01,658 INFO] src.engine_hmm: Total regime transitions: 409
[2026-05-15 01:22:01,658 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-25 13:00:00: Bear -> Chop_Low
[2026-05-15 01:22:01,659 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-27 15:00:00: Chop_Low -> Chop_High
[2026-05-15 01:22:01,659 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-28 01:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:01,660 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-28 12:00:00: Chop_Low -> Bear
[2026-05-15 01:22:01,660 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-03 04:00:00: Bear -> Chop_Low
[2026-05-15 01:22:01,660 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-03 10:00:00: Chop_Low -> Chop_High
[2026-05-15 01:22:01,661 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-04 16:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:01,661 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-05 07:00:00: Chop_Low -> Bear
[2026-05-15 01:22:01,662 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-05 22:00:00: Bear -> Chop_Low
[2026-05-15 01:22:01,662 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-06 12:00:00: Chop_Low -> Bear
[2026-05-15 01:22:01,695 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:22:01,709 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:22:02,113 INFO] src.engine_xgb: XGB Train Acc: 0.8264 | Test Acc: 0.8264
[2026-05-15 01:22:02,113 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11196688), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12226064), 'atr_normalized': np.float32(0.12255514), 'prev_log_return': np.float32(0.12988937), 'usdchf_log_return': np.float32(0.12567548), 'xagusd_log_return': np.float32(0.1292201), 'xtiusd_log_return': np.float32(0.13109764), 'synth_vix_zscore': np.float32(0.12733476)}
[2026-05-15 01:22:02,114 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:22:02,520 INFO] src.engine_xgb: XGB Train Acc: 0.8220 | Test Acc: 0.8220
[2026-05-15 01:22:02,520 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10073881), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14462917), 'atr_normalized': np.float32(0.11571657), 'prev_log_return': np.float32(0.12182346), 'usdchf_log_return': np.float32(0.12549146), 'xagusd_log_return': np.float32(0.12559423), 'xtiusd_log_return': np.float32(0.12558529), 'synth_vix_zscore': np.float32(0.14042109)}
[2026-05-15 01:22:02,521 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:22:02,870 INFO] src.engine_xgb: XGB Train Acc: 0.8465 | Test Acc: 0.8465
[2026-05-15 01:22:02,871 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10517251), 'gmm_vol_cluster': np.float32(0.11270758), 'rsi_slope': np.float32(0.1160909), 'atr_normalized': np.float32(0.1151294), 'prev_log_return': np.float32(0.10827768), 'usdchf_log_return': np.float32(0.109316535), 'xagusd_log_return': np.float32(0.11446568), 'xtiusd_log_return': np.float32(0.11442734), 'synth_vix_zscore': np.float32(0.10441234)}
[2026-05-15 01:22:02,871 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:22:02,873 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.38336, 0.21891) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:02,998 INFO] src.backtester: Backtest [H1]: Sharpe=-6.764 | MaxDD=0.239 | WR=0.209 | Return=-19.4% | Trades=182
[2026-05-15 01:22:02,999 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:03,428 INFO] src.engine_xgb: XGB Train Acc: 0.7322 | Test Acc: 0.7322
[2026-05-15 01:22:03,428 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12520535), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.122807406), 'atr_normalized': np.float32(0.12849987), 'prev_log_return': np.float32(0.12617433), 'usdchf_log_return': np.float32(0.12510213), 'xagusd_log_return': np.float32(0.12537889), 'xtiusd_log_return': np.float32(0.1286574), 'synth_vix_zscore': np.float32(0.11817463)}
[2026-05-15 01:22:03,429 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:22:03,814 INFO] src.engine_xgb: XGB Train Acc: 0.7315 | Test Acc: 0.7315
[2026-05-15 01:22:03,815 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10389957), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14312063), 'atr_normalized': np.float32(0.12152294), 'prev_log_return': np.float32(0.11806648), 'usdchf_log_return': np.float32(0.12644237), 'xagusd_log_return': np.float32(0.12983358), 'xtiusd_log_return': np.float32(0.12425148), 'synth_vix_zscore': np.float32(0.13286297)}
[2026-05-15 01:22:03,815 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:22:04,229 INFO] src.engine_xgb: XGB Train Acc: 0.7309 | Test Acc: 0.7309
[2026-05-15 01:22:04,229 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11351817), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13315755), 'atr_normalized': np.float32(0.12432269), 'prev_log_return': np.float32(0.12530136), 'usdchf_log_return': np.float32(0.12674044), 'xagusd_log_return': np.float32(0.12674303), 'xtiusd_log_return': np.float32(0.13210821), 'synth_vix_zscore': np.float32(0.11810848)}
[2026-05-15 01:22:04,230 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:22:04,231 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53107, 0.07740) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:04,360 INFO] src.backtester: Backtest [H1]: Sharpe=-2.826 | MaxDD=0.128 | WR=0.254 | Return=-12.0% | Trades=173
[2026-05-15 01:22:04,360 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:04,779 INFO] src.engine_xgb: XGB Train Acc: 0.6908 | Test Acc: 0.6908
[2026-05-15 01:22:04,781 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11407733), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12720063), 'atr_normalized': np.float32(0.12525612), 'prev_log_return': np.float32(0.13104594), 'usdchf_log_return': np.float32(0.1230231), 'xagusd_log_return': np.float32(0.12238026), 'xtiusd_log_return': np.float32(0.13276042), 'synth_vix_zscore': np.float32(0.12425623)}
[2026-05-15 01:22:04,781 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:22:05,189 INFO] src.engine_xgb: XGB Train Acc: 0.6851 | Test Acc: 0.6851
[2026-05-15 01:22:05,189 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12164699), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13123277), 'atr_normalized': np.float32(0.11353728), 'prev_log_return': np.float32(0.11888523), 'usdchf_log_return': np.float32(0.12987232), 'xagusd_log_return': np.float32(0.12771614), 'xtiusd_log_return': np.float32(0.12626903), 'synth_vix_zscore': np.float32(0.13084023)}
[2026-05-15 01:22:05,190 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:22:05,620 INFO] src.engine_xgb: XGB Train Acc: 0.6844 | Test Acc: 0.6844
[2026-05-15 01:22:05,621 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09007046), 'gmm_vol_cluster': np.float32(0.08668973), 'rsi_slope': np.float32(0.13088898), 'atr_normalized': np.float32(0.11235024), 'prev_log_return': np.float32(0.110496484), 'usdchf_log_return': np.float32(0.113489695), 'xagusd_log_return': np.float32(0.11620482), 'xtiusd_log_return': np.float32(0.11853121), 'synth_vix_zscore': np.float32(0.1212783)}
[2026-05-15 01:22:05,621 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:22:05,623 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.38300, 0.44275) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:05,726 INFO] src.backtester: Backtest [H1]: Sharpe=-4.476 | MaxDD=0.292 | WR=0.243 | Return=-24.1% | Trades=107
[2026-05-15 01:22:05,726 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:05,741 INFO] src.optimizer: WFO [H1] window start=12960: trades=107 sharpe=-4.476 cv_sharpe=-4.795 score=-50.000
[2026-05-15 01:22:06,805 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:22:06,806 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:22:06,806 INFO] src.engine_hmm: Bull 0.9597 0.0058 0.0215 0.0129
[2026-05-15 01:22:06,806 INFO] src.engine_hmm: Bear 0.0000 0.9495 0.0000 0.0505
[2026-05-15 01:22:06,807 INFO] src.engine_hmm: Chop_Low 0.0193 0.0040 0.9767 0.0000
[2026-05-15 01:22:06,807 INFO] src.engine_hmm: Chop_High 0.0250 0.0091 0.0012 0.9647
[2026-05-15 01:22:06,807 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:22:06,807 INFO] src.engine_hmm: Bull: return=0.075730, vol=-0.303884, rsi_slope=0.030039
[2026-05-15 01:22:06,808 INFO] src.engine_hmm: Bear: return=-0.141824, vol=2.043393, rsi_slope=-0.047153
[2026-05-15 01:22:06,808 INFO] src.engine_hmm: Chop_Low: return=-0.007163, vol=-0.781412, rsi_slope=0.001615
[2026-05-15 01:22:06,808 INFO] src.engine_hmm: Chop_High: return=-0.022009, vol=0.407954, rsi_slope=-0.017441
[2026-05-15 01:22:06,808 INFO] src.engine_hmm: Total regime transitions: 351
[2026-05-15 01:22:06,809 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-20 20:00:00: Chop_Low -> Bear
[2026-05-15 01:22:06,809 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-20 21:00:00: Bear -> Chop_High
[2026-05-15 01:22:06,809 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-21 18:00:00: Chop_High -> Bull
[2026-05-15 01:22:06,810 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-22 14:00:00: Bull -> Chop_Low
[2026-05-15 01:22:06,810 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-28 14:00:00: Chop_Low -> Bear
[2026-05-15 01:22:06,810 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-28 17:00:00: Bear -> Chop_High
[2026-05-15 01:22:06,810 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-28 22:00:00: Chop_High -> Bull
[2026-05-15 01:22:06,811 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-01 12:00:00: Bull -> Chop_Low
[2026-05-15 01:22:06,811 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-01 16:00:00: Chop_Low -> Bull
[2026-05-15 01:22:06,811 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-02 12:00:00: Bull -> Chop_Low
[2026-05-15 01:22:06,837 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:22:06,848 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:22:07,192 INFO] src.engine_xgb: XGB Train Acc: 0.8410 | Test Acc: 0.8410
[2026-05-15 01:22:07,193 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1447847), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12191767), 'atr_normalized': np.float32(0.120719254), 'prev_log_return': np.float32(0.11789555), 'usdchf_log_return': np.float32(0.12136055), 'xagusd_log_return': np.float32(0.12048752), 'xtiusd_log_return': np.float32(0.12240056), 'synth_vix_zscore': np.float32(0.13043424)}
[2026-05-15 01:22:07,193 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:22:07,540 INFO] src.engine_xgb: XGB Train Acc: 0.8272 | Test Acc: 0.8272
[2026-05-15 01:22:07,540 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11327605), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11973505), 'atr_normalized': np.float32(0.13303146), 'prev_log_return': np.float32(0.120015725), 'usdchf_log_return': np.float32(0.12598357), 'xagusd_log_return': np.float32(0.12638567), 'xtiusd_log_return': np.float32(0.13322079), 'synth_vix_zscore': np.float32(0.12835169)}
[2026-05-15 01:22:07,541 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:22:07,913 INFO] src.engine_xgb: XGB Train Acc: 0.8161 | Test Acc: 0.8161
[2026-05-15 01:22:07,913 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09622305), 'gmm_vol_cluster': np.float32(0.11157021), 'rsi_slope': np.float32(0.116275474), 'atr_normalized': np.float32(0.104609646), 'prev_log_return': np.float32(0.11237387), 'usdchf_log_return': np.float32(0.1131334), 'xagusd_log_return': np.float32(0.11182004), 'xtiusd_log_return': np.float32(0.12012718), 'synth_vix_zscore': np.float32(0.11386707)}
[2026-05-15 01:22:07,914 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:22:07,916 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.50441, -0.08685) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:08,046 INFO] src.backtester: Backtest [H1]: Sharpe=0.828 | MaxDD=0.066 | WR=0.325 | Return=5.4% | Trades=163
[2026-05-15 01:22:08,046 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:08,437 INFO] src.engine_xgb: XGB Train Acc: 0.7587 | Test Acc: 0.7587
[2026-05-15 01:22:08,437 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11555923), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12617847), 'atr_normalized': np.float32(0.12464938), 'prev_log_return': np.float32(0.118189365), 'usdchf_log_return': np.float32(0.1232882), 'xagusd_log_return': np.float32(0.12769888), 'xtiusd_log_return': np.float32(0.122803636), 'synth_vix_zscore': np.float32(0.14163281)}
[2026-05-15 01:22:08,438 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:22:08,815 INFO] src.engine_xgb: XGB Train Acc: 0.7351 | Test Acc: 0.7351
[2026-05-15 01:22:08,815 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12727553), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12649591), 'atr_normalized': np.float32(0.1266462), 'prev_log_return': np.float32(0.12235134), 'usdchf_log_return': np.float32(0.12502381), 'xagusd_log_return': np.float32(0.12773617), 'xtiusd_log_return': np.float32(0.122064024), 'synth_vix_zscore': np.float32(0.12240697)}
[2026-05-15 01:22:08,816 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:22:09,207 INFO] src.engine_xgb: XGB Train Acc: 0.7167 | Test Acc: 0.7167
[2026-05-15 01:22:09,208 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09343954), 'gmm_vol_cluster': np.float32(0.09040642), 'rsi_slope': np.float32(0.12937102), 'atr_normalized': np.float32(0.10429452), 'prev_log_return': np.float32(0.11098506), 'usdchf_log_return': np.float32(0.11140121), 'xagusd_log_return': np.float32(0.121695004), 'xtiusd_log_return': np.float32(0.119335495), 'synth_vix_zscore': np.float32(0.11907169)}
[2026-05-15 01:22:09,208 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:22:09,210 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.49357, -0.10582) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:09,333 INFO] src.backtester: Backtest [H1]: Sharpe=-1.681 | MaxDD=0.162 | WR=0.328 | Return=-11.3% | Trades=174
[2026-05-15 01:22:09,333 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:09,781 INFO] src.engine_xgb: XGB Train Acc: 0.6894 | Test Acc: 0.6894
[2026-05-15 01:22:09,781 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.17725976), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.112815544), 'atr_normalized': np.float32(0.11595676), 'prev_log_return': np.float32(0.120029636), 'usdchf_log_return': np.float32(0.11866035), 'xagusd_log_return': np.float32(0.12015675), 'xtiusd_log_return': np.float32(0.11377282), 'synth_vix_zscore': np.float32(0.12134839)}
[2026-05-15 01:22:09,782 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:22:10,207 INFO] src.engine_xgb: XGB Train Acc: 0.6941 | Test Acc: 0.6941
[2026-05-15 01:22:10,208 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.094892725), 'gmm_vol_cluster': np.float32(0.11287621), 'rsi_slope': np.float32(0.12059565), 'atr_normalized': np.float32(0.10912418), 'prev_log_return': np.float32(0.11474298), 'usdchf_log_return': np.float32(0.11666481), 'xagusd_log_return': np.float32(0.11379293), 'xtiusd_log_return': np.float32(0.105370164), 'synth_vix_zscore': np.float32(0.111940295)}
[2026-05-15 01:22:10,208 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:22:10,644 INFO] src.engine_xgb: XGB Train Acc: 0.6820 | Test Acc: 0.6820
[2026-05-15 01:22:10,644 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.103754945), 'gmm_vol_cluster': np.float32(0.085482724), 'rsi_slope': np.float32(0.11627611), 'atr_normalized': np.float32(0.1098948), 'prev_log_return': np.float32(0.109967306), 'usdchf_log_return': np.float32(0.115720734), 'xagusd_log_return': np.float32(0.12386887), 'xtiusd_log_return': np.float32(0.12118296), 'synth_vix_zscore': np.float32(0.11385158)}
[2026-05-15 01:22:10,645 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:22:10,647 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.36542, 0.20284) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:10,745 INFO] src.backtester: Backtest [H1]: Sharpe=-3.478 | MaxDD=0.137 | WR=0.272 | Return=-11.7% | Trades=136
[2026-05-15 01:22:10,745 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:10,758 INFO] src.optimizer: WFO [H1] window start=17280: trades=136 sharpe=-3.478 cv_sharpe=-0.426 score=-1.000
[2026-05-15 01:22:12,029 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:22:12,030 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:22:12,030 INFO] src.engine_hmm: Bull 0.9522 0.0054 0.0286 0.0138
[2026-05-15 01:22:12,030 INFO] src.engine_hmm: Bear 0.0017 0.9517 0.0000 0.0466
[2026-05-15 01:22:12,030 INFO] src.engine_hmm: Chop_Low 0.0258 0.0072 0.9670 0.0000
[2026-05-15 01:22:12,031 INFO] src.engine_hmm: Chop_High 0.0277 0.0079 0.0030 0.9615
[2026-05-15 01:22:12,031 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:22:12,031 INFO] src.engine_hmm: Bull: return=0.073443, vol=-0.292272, rsi_slope=0.003121
[2026-05-15 01:22:12,031 INFO] src.engine_hmm: Bear: return=-0.457561, vol=1.926451, rsi_slope=-0.009959
[2026-05-15 01:22:12,031 INFO] src.engine_hmm: Chop_Low: return=0.062726, vol=-0.788037, rsi_slope=-0.008431
[2026-05-15 01:22:12,032 INFO] src.engine_hmm: Chop_High: return=0.054160, vol=0.352576, rsi_slope=0.010576
[2026-05-15 01:22:12,032 INFO] src.engine_hmm: Total regime transitions: 410
[2026-05-15 01:22:12,032 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 15:00:00: Chop_Low -> Bear
[2026-05-15 01:22:12,033 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 17:00:00: Bear -> Chop_High
[2026-05-15 01:22:12,033 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-13 13:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:12,033 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-13 15:00:00: Chop_Low -> Bull
[2026-05-15 01:22:12,033 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-16 06:00:00: Bull -> Chop_Low
[2026-05-15 01:22:12,034 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 01:00:00: Chop_Low -> Bear
[2026-05-15 01:22:12,034 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 07:00:00: Bear -> Chop_High
[2026-05-15 01:22:12,034 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 21:00:00: Chop_High -> Bull
[2026-05-15 01:22:12,034 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-08 01:00:00: Bull -> Bear
[2026-05-15 01:22:12,036 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-09 01:00:00: Bear -> Chop_High
[2026-05-15 01:22:12,056 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:22:12,069 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:22:12,389 INFO] src.engine_xgb: XGB Train Acc: 0.8295 | Test Acc: 0.8295
[2026-05-15 01:22:12,389 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14361347), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12099891), 'atr_normalized': np.float32(0.1207079), 'prev_log_return': np.float32(0.120124936), 'usdchf_log_return': np.float32(0.12430304), 'xagusd_log_return': np.float32(0.12934543), 'xtiusd_log_return': np.float32(0.12629224), 'synth_vix_zscore': np.float32(0.11461413)}
[2026-05-15 01:22:12,390 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:22:12,768 INFO] src.engine_xgb: XGB Train Acc: 0.8545 | Test Acc: 0.8545
[2026-05-15 01:22:12,768 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.104121976), 'gmm_vol_cluster': np.float32(0.102472775), 'rsi_slope': np.float32(0.11905238), 'atr_normalized': np.float32(0.117845856), 'prev_log_return': np.float32(0.10748778), 'usdchf_log_return': np.float32(0.10815452), 'xagusd_log_return': np.float32(0.118456595), 'xtiusd_log_return': np.float32(0.11223512), 'synth_vix_zscore': np.float32(0.11017304)}
[2026-05-15 01:22:12,769 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:22:13,126 INFO] src.engine_xgb: XGB Train Acc: 0.8333 | Test Acc: 0.8333
[2026-05-15 01:22:13,127 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09329505), 'gmm_vol_cluster': np.float32(0.108697355), 'rsi_slope': np.float32(0.11713898), 'atr_normalized': np.float32(0.11590243), 'prev_log_return': np.float32(0.11183765), 'usdchf_log_return': np.float32(0.10594528), 'xagusd_log_return': np.float32(0.11558191), 'xtiusd_log_return': np.float32(0.11891669), 'synth_vix_zscore': np.float32(0.11268464)}
[2026-05-15 01:22:13,127 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:22:13,129 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.54544, 0.24324) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:13,255 INFO] src.backtester: Backtest [H1]: Sharpe=-3.531 | MaxDD=0.226 | WR=0.298 | Return=-18.1% | Trades=205
[2026-05-15 01:22:13,256 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:13,657 INFO] src.engine_xgb: XGB Train Acc: 0.7405 | Test Acc: 0.7405
[2026-05-15 01:22:13,658 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13704446), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12451615), 'atr_normalized': np.float32(0.122657105), 'prev_log_return': np.float32(0.12218145), 'usdchf_log_return': np.float32(0.1230547), 'xagusd_log_return': np.float32(0.1283227), 'xtiusd_log_return': np.float32(0.12240255), 'synth_vix_zscore': np.float32(0.119820885)}
[2026-05-15 01:22:13,658 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:22:14,055 INFO] src.engine_xgb: XGB Train Acc: 0.7513 | Test Acc: 0.7513
[2026-05-15 01:22:14,055 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09487774), 'gmm_vol_cluster': np.float32(0.13786961), 'rsi_slope': np.float32(0.11403961), 'atr_normalized': np.float32(0.10817676), 'prev_log_return': np.float32(0.10706822), 'usdchf_log_return': np.float32(0.11042785), 'xagusd_log_return': np.float32(0.10948788), 'xtiusd_log_return': np.float32(0.10694238), 'synth_vix_zscore': np.float32(0.111109994)}
[2026-05-15 01:22:14,056 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:22:14,446 INFO] src.engine_xgb: XGB Train Acc: 0.7390 | Test Acc: 0.7390
[2026-05-15 01:22:14,446 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11813423), 'gmm_vol_cluster': np.float32(0.09022868), 'rsi_slope': np.float32(0.114157416), 'atr_normalized': np.float32(0.108529314), 'prev_log_return': np.float32(0.107704684), 'usdchf_log_return': np.float32(0.109394245), 'xagusd_log_return': np.float32(0.11262311), 'xtiusd_log_return': np.float32(0.119254306), 'synth_vix_zscore': np.float32(0.11997399)}
[2026-05-15 01:22:14,447 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:22:14,448 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.48586, 0.08539) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:14,580 INFO] src.backtester: Backtest [H1]: Sharpe=-3.061 | MaxDD=0.187 | WR=0.301 | Return=-13.8% | Trades=193
[2026-05-15 01:22:14,580 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:15,052 INFO] src.engine_xgb: XGB Train Acc: 0.6915 | Test Acc: 0.6915
[2026-05-15 01:22:15,053 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.110558555), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.124917515), 'atr_normalized': np.float32(0.13121043), 'prev_log_return': np.float32(0.12981501), 'usdchf_log_return': np.float32(0.123464756), 'xagusd_log_return': np.float32(0.1302911), 'xtiusd_log_return': np.float32(0.12354933), 'synth_vix_zscore': np.float32(0.12619336)}
[2026-05-15 01:22:15,053 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:22:15,506 INFO] src.engine_xgb: XGB Train Acc: 0.7024 | Test Acc: 0.7024
[2026-05-15 01:22:15,506 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10149676), 'gmm_vol_cluster': np.float32(0.12517208), 'rsi_slope': np.float32(0.11354782), 'atr_normalized': np.float32(0.105841376), 'prev_log_return': np.float32(0.10908476), 'usdchf_log_return': np.float32(0.10735534), 'xagusd_log_return': np.float32(0.11681465), 'xtiusd_log_return': np.float32(0.10876682), 'synth_vix_zscore': np.float32(0.111920305)}
[2026-05-15 01:22:15,506 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:22:15,954 INFO] src.engine_xgb: XGB Train Acc: 0.6860 | Test Acc: 0.6860
[2026-05-15 01:22:15,954 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.099907614), 'gmm_vol_cluster': np.float32(0.1056328), 'rsi_slope': np.float32(0.11391303), 'atr_normalized': np.float32(0.11556481), 'prev_log_return': np.float32(0.11023295), 'usdchf_log_return': np.float32(0.10712632), 'xagusd_log_return': np.float32(0.1177306), 'xtiusd_log_return': np.float32(0.116204314), 'synth_vix_zscore': np.float32(0.11368753)}
[2026-05-15 01:22:15,955 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:22:15,956 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.51495, -0.03378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:16,056 INFO] src.backtester: Backtest [H1]: Sharpe=-1.188 | MaxDD=0.073 | WR=0.286 | Return=-3.5% | Trades=140
[2026-05-15 01:22:16,057 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:16,070 INFO] src.optimizer: WFO [H1] window start=21600: trades=140 sharpe=-1.188 cv_sharpe=-3.296 score=-0.500
[2026-05-15 01:22:17,957 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:22:17,957 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:22:17,957 INFO] src.engine_hmm: Bull 0.9513 0.0114 0.0341 0.0032
[2026-05-15 01:22:17,958 INFO] src.engine_hmm: Bear 0.0069 0.8977 0.0000 0.0954
[2026-05-15 01:22:17,958 INFO] src.engine_hmm: Chop_Low 0.0212 0.0115 0.9673 0.0000
[2026-05-15 01:22:17,958 INFO] src.engine_hmm: Chop_High 0.0342 0.0057 0.0131 0.9470
[2026-05-15 01:22:17,959 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:22:17,959 INFO] src.engine_hmm: Bull: return=0.135313, vol=-0.062923, rsi_slope=0.020054
[2026-05-15 01:22:17,959 INFO] src.engine_hmm: Bear: return=-0.656530, vol=1.967839, rsi_slope=-0.051256
[2026-05-15 01:22:17,959 INFO] src.engine_hmm: Chop_Low: return=0.055772, vol=-0.718558, rsi_slope=-0.020028
[2026-05-15 01:22:17,959 INFO] src.engine_hmm: Chop_High: return=-0.032065, vol=0.720959, rsi_slope=0.034976
[2026-05-15 01:22:17,960 INFO] src.engine_hmm: Total regime transitions: 489
[2026-05-15 01:22:17,960 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-07 12:00:00: Chop_High -> Bull
[2026-05-15 01:22:17,960 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-07 18:00:00: Bull -> Chop_Low
[2026-05-15 01:22:17,961 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-08 12:00:00: Chop_Low -> Bull
[2026-05-15 01:22:17,961 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-08 19:00:00: Bull -> Bear
[2026-05-15 01:22:17,961 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-08 22:00:00: Bear -> Chop_High
[2026-05-15 01:22:17,961 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 12:00:00: Chop_High -> Bull
[2026-05-15 01:22:17,962 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 13:00:00: Bull -> Chop_Low
[2026-05-15 01:22:17,962 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 15:00:00: Chop_Low -> Bull
[2026-05-15 01:22:17,962 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 21:00:00: Bull -> Chop_High
[2026-05-15 01:22:17,962 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-11 14:00:00: Chop_High -> Bull
[2026-05-15 01:22:17,983 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:22:17,994 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:22:18,346 INFO] src.engine_xgb: XGB Train Acc: 0.8347 | Test Acc: 0.8347
[2026-05-15 01:22:18,346 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10703837), 'gmm_vol_cluster': np.float32(0.12631927), 'rsi_slope': np.float32(0.11080007), 'atr_normalized': np.float32(0.110912696), 'prev_log_return': np.float32(0.1114376), 'usdchf_log_return': np.float32(0.10843104), 'xagusd_log_return': np.float32(0.10837488), 'xtiusd_log_return': np.float32(0.10803616), 'synth_vix_zscore': np.float32(0.108649954)}
[2026-05-15 01:22:18,347 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:22:18,694 INFO] src.engine_xgb: XGB Train Acc: 0.8366 | Test Acc: 0.8366
[2026-05-15 01:22:18,695 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.105212174), 'gmm_vol_cluster': np.float32(0.09938805), 'rsi_slope': np.float32(0.118113056), 'atr_normalized': np.float32(0.11741051), 'prev_log_return': np.float32(0.110488325), 'usdchf_log_return': np.float32(0.11001281), 'xagusd_log_return': np.float32(0.12152619), 'xtiusd_log_return': np.float32(0.106807455), 'synth_vix_zscore': np.float32(0.11104147)}
[2026-05-15 01:22:18,695 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:22:19,044 INFO] src.engine_xgb: XGB Train Acc: 0.8404 | Test Acc: 0.8404
[2026-05-15 01:22:19,046 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.106667735), 'gmm_vol_cluster': np.float32(0.103925355), 'rsi_slope': np.float32(0.11481307), 'atr_normalized': np.float32(0.117666505), 'prev_log_return': np.float32(0.10784894), 'usdchf_log_return': np.float32(0.11234529), 'xagusd_log_return': np.float32(0.111789644), 'xtiusd_log_return': np.float32(0.10652762), 'synth_vix_zscore': np.float32(0.11841583)}
[2026-05-15 01:22:19,046 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:22:19,047 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.16146, 0.63340) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:19,172 INFO] src.backtester: Backtest [H1]: Sharpe=-2.037 | MaxDD=0.117 | WR=0.309 | Return=-10.1% | Trades=181
[2026-05-15 01:22:19,172 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:19,613 INFO] src.engine_xgb: XGB Train Acc: 0.7452 | Test Acc: 0.7452
[2026-05-15 01:22:19,613 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11883638), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12636665), 'atr_normalized': np.float32(0.13163696), 'prev_log_return': np.float32(0.12077374), 'usdchf_log_return': np.float32(0.1186112), 'xagusd_log_return': np.float32(0.13136087), 'xtiusd_log_return': np.float32(0.12592396), 'synth_vix_zscore': np.float32(0.12649025)}
[2026-05-15 01:22:19,614 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:22:20,001 INFO] src.engine_xgb: XGB Train Acc: 0.7440 | Test Acc: 0.7440
[2026-05-15 01:22:20,002 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.102730274), 'gmm_vol_cluster': np.float32(0.12502444), 'rsi_slope': np.float32(0.11532097), 'atr_normalized': np.float32(0.11239828), 'prev_log_return': np.float32(0.11333567), 'usdchf_log_return': np.float32(0.105815336), 'xagusd_log_return': np.float32(0.10638813), 'xtiusd_log_return': np.float32(0.1079303), 'synth_vix_zscore': np.float32(0.111056596)}
[2026-05-15 01:22:20,002 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:22:20,380 INFO] src.engine_xgb: XGB Train Acc: 0.7370 | Test Acc: 0.7370
[2026-05-15 01:22:20,381 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.112369925), 'gmm_vol_cluster': np.float32(0.09656476), 'rsi_slope': np.float32(0.11193762), 'atr_normalized': np.float32(0.12017036), 'prev_log_return': np.float32(0.10872826), 'usdchf_log_return': np.float32(0.112754084), 'xagusd_log_return': np.float32(0.116313554), 'xtiusd_log_return': np.float32(0.103088245), 'synth_vix_zscore': np.float32(0.11807323)}
[2026-05-15 01:22:20,381 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:22:20,383 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47142, 0.22575) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:20,507 INFO] src.backtester: Backtest [H1]: Sharpe=-4.442 | MaxDD=0.199 | WR=0.251 | Return=-15.0% | Trades=183
[2026-05-15 01:22:20,508 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:20,930 INFO] src.engine_xgb: XGB Train Acc: 0.6790 | Test Acc: 0.6790
[2026-05-15 01:22:20,931 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11935686), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13050313), 'atr_normalized': np.float32(0.13163777), 'prev_log_return': np.float32(0.12711355), 'usdchf_log_return': np.float32(0.117853984), 'xagusd_log_return': np.float32(0.12261474), 'xtiusd_log_return': np.float32(0.122928984), 'synth_vix_zscore': np.float32(0.12799096)}
[2026-05-15 01:22:20,932 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:22:21,351 INFO] src.engine_xgb: XGB Train Acc: 0.6830 | Test Acc: 0.6830
[2026-05-15 01:22:21,352 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10797506), 'gmm_vol_cluster': np.float32(0.09804876), 'rsi_slope': np.float32(0.12130835), 'atr_normalized': np.float32(0.1190922), 'prev_log_return': np.float32(0.11629188), 'usdchf_log_return': np.float32(0.110985674), 'xagusd_log_return': np.float32(0.10720994), 'xtiusd_log_return': np.float32(0.11111184), 'synth_vix_zscore': np.float32(0.107976265)}
[2026-05-15 01:22:21,352 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:22:21,798 INFO] src.engine_xgb: XGB Train Acc: 0.6944 | Test Acc: 0.6944
[2026-05-15 01:22:21,799 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10887741), 'gmm_vol_cluster': np.float32(0.10562135), 'rsi_slope': np.float32(0.11051863), 'atr_normalized': np.float32(0.11757474), 'prev_log_return': np.float32(0.1065809), 'usdchf_log_return': np.float32(0.10803878), 'xagusd_log_return': np.float32(0.11465507), 'xtiusd_log_return': np.float32(0.106184624), 'synth_vix_zscore': np.float32(0.121948555)}
[2026-05-15 01:22:21,799 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:22:21,801 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.62208, 0.06248) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:21,910 INFO] src.backtester: Backtest [H1]: Sharpe=-2.372 | MaxDD=0.117 | WR=0.325 | Return=-8.3% | Trades=126
[2026-05-15 01:22:21,911 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:21,924 INFO] src.optimizer: WFO [H1] window start=25920: trades=126 sharpe=-2.372 cv_sharpe=-3.240 score=-0.500
[2026-05-15 01:22:23,405 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:22:23,405 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:22:23,405 INFO] src.engine_hmm: Bull 0.8999 0.0916 0.0029 0.0055
[2026-05-15 01:22:23,405 INFO] src.engine_hmm: Bear 0.0056 0.9505 0.0092 0.0346
[2026-05-15 01:22:23,406 INFO] src.engine_hmm: Chop_Low 0.0144 0.0000 0.9669 0.0187
[2026-05-15 01:22:23,406 INFO] src.engine_hmm: Chop_High 0.0074 0.0069 0.0322 0.9534
[2026-05-15 01:22:23,406 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:22:23,406 INFO] src.engine_hmm: Bull: return=0.036247, vol=1.997290, rsi_slope=0.014112
[2026-05-15 01:22:23,407 INFO] src.engine_hmm: Bear: return=-0.065757, vol=0.637358, rsi_slope=0.009927
[2026-05-15 01:22:23,407 INFO] src.engine_hmm: Chop_Low: return=0.019856, vol=-0.722700, rsi_slope=-0.017502
[2026-05-15 01:22:23,407 INFO] src.engine_hmm: Chop_High: return=0.009848, vol=-0.129882, rsi_slope=0.010121
[2026-05-15 01:22:23,407 INFO] src.engine_hmm: Total regime transitions: 470
[2026-05-15 01:22:23,408 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-02 14:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:23,408 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 15:00:00: Chop_Low -> Bull
[2026-05-15 01:22:23,408 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 18:00:00: Bull -> Bear
[2026-05-15 01:22:23,409 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 12:00:00: Bear -> Chop_Low
[2026-05-15 01:22:23,409 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-08 16:00:00: Chop_Low -> Chop_High
[2026-05-15 01:22:23,409 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-09 12:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:23,410 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 15:00:00: Chop_Low -> Bull
[2026-05-15 01:22:23,410 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 16:00:00: Bull -> Bear
[2026-05-15 01:22:23,410 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-11 12:00:00: Bear -> Chop_Low
[2026-05-15 01:22:23,411 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-14 15:00:00: Chop_Low -> Bull
[2026-05-15 01:22:23,433 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:22:23,444 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:22:23,851 INFO] src.engine_xgb: XGB Train Acc: 0.8222 | Test Acc: 0.8222
[2026-05-15 01:22:23,851 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10988587), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12832813), 'atr_normalized': np.float32(0.13036765), 'prev_log_return': np.float32(0.12821427), 'usdchf_log_return': np.float32(0.12833443), 'xagusd_log_return': np.float32(0.12828413), 'xtiusd_log_return': np.float32(0.12339194), 'synth_vix_zscore': np.float32(0.12319363)}
[2026-05-15 01:22:23,852 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:22:24,263 INFO] src.engine_xgb: XGB Train Acc: 0.8241 | Test Acc: 0.8241
[2026-05-15 01:22:24,263 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1188984), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12888359), 'atr_normalized': np.float32(0.12362118), 'prev_log_return': np.float32(0.124644555), 'usdchf_log_return': np.float32(0.12532945), 'xagusd_log_return': np.float32(0.117308624), 'xtiusd_log_return': np.float32(0.12996933), 'synth_vix_zscore': np.float32(0.13134488)}
[2026-05-15 01:22:24,263 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:22:24,636 INFO] src.engine_xgb: XGB Train Acc: 0.8364 | Test Acc: 0.8364
[2026-05-15 01:22:24,637 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.092466965), 'gmm_vol_cluster': np.float32(0.10126354), 'rsi_slope': np.float32(0.11767091), 'atr_normalized': np.float32(0.11361909), 'prev_log_return': np.float32(0.10845138), 'usdchf_log_return': np.float32(0.11853993), 'xagusd_log_return': np.float32(0.114256755), 'xtiusd_log_return': np.float32(0.12087865), 'synth_vix_zscore': np.float32(0.112852715)}
[2026-05-15 01:22:24,637 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:22:24,639 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.56732, -0.02191) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:24,761 INFO] src.backtester: Backtest [H1]: Sharpe=-5.340 | MaxDD=0.273 | WR=0.249 | Return=-22.3% | Trades=189
[2026-05-15 01:22:24,762 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:25,223 INFO] src.engine_xgb: XGB Train Acc: 0.7389 | Test Acc: 0.7389
[2026-05-15 01:22:25,224 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12501201), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12825277), 'atr_normalized': np.float32(0.123775005), 'prev_log_return': np.float32(0.1260598), 'usdchf_log_return': np.float32(0.11920715), 'xagusd_log_return': np.float32(0.12683487), 'xtiusd_log_return': np.float32(0.119837046), 'synth_vix_zscore': np.float32(0.13102137)}
[2026-05-15 01:22:25,224 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:22:25,626 INFO] src.engine_xgb: XGB Train Acc: 0.7581 | Test Acc: 0.7581
[2026-05-15 01:22:25,627 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.107242234), 'gmm_vol_cluster': np.float32(0.082423575), 'rsi_slope': np.float32(0.113973156), 'atr_normalized': np.float32(0.10946351), 'prev_log_return': np.float32(0.11457265), 'usdchf_log_return': np.float32(0.11496031), 'xagusd_log_return': np.float32(0.11899956), 'xtiusd_log_return': np.float32(0.118934214), 'synth_vix_zscore': np.float32(0.11943078)}
[2026-05-15 01:22:25,627 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:22:26,045 INFO] src.engine_xgb: XGB Train Acc: 0.7248 | Test Acc: 0.7248
[2026-05-15 01:22:26,045 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1120686), 'gmm_vol_cluster': np.float32(0.10450945), 'rsi_slope': np.float32(0.119203575), 'atr_normalized': np.float32(0.107634716), 'prev_log_return': np.float32(0.114617445), 'usdchf_log_return': np.float32(0.106965505), 'xagusd_log_return': np.float32(0.11572849), 'xtiusd_log_return': np.float32(0.1076951), 'synth_vix_zscore': np.float32(0.11157716)}
[2026-05-15 01:22:26,046 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:22:26,047 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47816, 0.15210) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:26,176 INFO] src.backtester: Backtest [H1]: Sharpe=-3.110 | MaxDD=0.137 | WR=0.286 | Return=-12.2% | Trades=168
[2026-05-15 01:22:26,177 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:26,618 INFO] src.engine_xgb: XGB Train Acc: 0.6883 | Test Acc: 0.6883
[2026-05-15 01:22:26,618 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12565626), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12787929), 'atr_normalized': np.float32(0.12078901), 'prev_log_return': np.float32(0.11824592), 'usdchf_log_return': np.float32(0.118884355), 'xagusd_log_return': np.float32(0.13149612), 'xtiusd_log_return': np.float32(0.12356533), 'synth_vix_zscore': np.float32(0.13348374)}
[2026-05-15 01:22:26,619 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:22:27,133 INFO] src.engine_xgb: XGB Train Acc: 0.6806 | Test Acc: 0.6806
[2026-05-15 01:22:27,134 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09848033), 'gmm_vol_cluster': np.float32(0.08115845), 'rsi_slope': np.float32(0.12370348), 'atr_normalized': np.float32(0.116896324), 'prev_log_return': np.float32(0.11616285), 'usdchf_log_return': np.float32(0.11725724), 'xagusd_log_return': np.float32(0.12628694), 'xtiusd_log_return': np.float32(0.108754545), 'synth_vix_zscore': np.float32(0.11129982)}
[2026-05-15 01:22:27,134 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:22:27,570 INFO] src.engine_xgb: XGB Train Acc: 0.6803 | Test Acc: 0.6803
[2026-05-15 01:22:27,570 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.103623144), 'gmm_vol_cluster': np.float32(0.1120183), 'rsi_slope': np.float32(0.11259383), 'atr_normalized': np.float32(0.11741566), 'prev_log_return': np.float32(0.11833776), 'usdchf_log_return': np.float32(0.10638005), 'xagusd_log_return': np.float32(0.10797125), 'xtiusd_log_return': np.float32(0.10965811), 'synth_vix_zscore': np.float32(0.112001866)}
[2026-05-15 01:22:27,571 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:22:27,572 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.40708, 0.22442) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:27,676 INFO] src.backtester: Backtest [H1]: Sharpe=-2.233 | MaxDD=0.090 | WR=0.286 | Return=-6.2% | Trades=119
[2026-05-15 01:22:27,677 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:27,690 INFO] src.optimizer: WFO [H1] window start=30240: trades=119 sharpe=-2.233 cv_sharpe=-4.225 score=-0.500
[2026-05-15 01:22:28,770 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:22:28,770 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:22:28,770 INFO] src.engine_hmm: Bull 0.9171 0.0061 0.0025 0.0743
[2026-05-15 01:22:28,770 INFO] src.engine_hmm: Bear 0.0115 0.9535 0.0295 0.0055
[2026-05-15 01:22:28,771 INFO] src.engine_hmm: Chop_Low 0.0132 0.0256 0.9613 0.0000
[2026-05-15 01:22:28,771 INFO] src.engine_hmm: Chop_High 0.0053 0.0401 0.0063 0.9483
[2026-05-15 01:22:28,771 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:22:28,771 INFO] src.engine_hmm: Bull: return=0.240396, vol=1.863162, rsi_slope=0.046622
[2026-05-15 01:22:28,771 INFO] src.engine_hmm: Bear: return=-0.111552, vol=-0.213701, rsi_slope=-0.015294
[2026-05-15 01:22:28,771 INFO] src.engine_hmm: Chop_Low: return=-0.061455, vol=-0.879666, rsi_slope=-0.004034
[2026-05-15 01:22:28,772 INFO] src.engine_hmm: Chop_High: return=0.162529, vol=0.714671, rsi_slope=0.007724
[2026-05-15 01:22:28,772 INFO] src.engine_hmm: Total regime transitions: 490
[2026-05-15 01:22:28,772 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-23 08:00:00: Bear -> Chop_Low
[2026-05-15 01:22:28,773 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-24 04:00:00: Chop_Low -> Bull
[2026-05-15 01:22:28,773 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-25 19:00:00: Bull -> Chop_High
[2026-05-15 01:22:28,773 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-28 01:00:00: Chop_High -> Bull
[2026-05-15 01:22:28,773 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-01 06:00:00: Bull -> Chop_High
[2026-05-15 01:22:28,774 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-03 09:00:00: Chop_High -> Bear
[2026-05-15 01:22:28,774 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-03 18:00:00: Bear -> Chop_Low
[2026-05-15 01:22:28,774 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-04 02:00:00: Chop_Low -> Bull
[2026-05-15 01:22:28,774 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-04 04:00:00: Bull -> Chop_High
[2026-05-15 01:22:28,775 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-04 23:00:00: Chop_High -> Bull
[2026-05-15 01:22:28,795 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:22:28,805 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:22:29,136 INFO] src.engine_xgb: XGB Train Acc: 0.8253 | Test Acc: 0.8253
[2026-05-15 01:22:29,137 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10974262), 'gmm_vol_cluster': np.float32(0.10504026), 'rsi_slope': np.float32(0.10920196), 'atr_normalized': np.float32(0.11718645), 'prev_log_return': np.float32(0.11098003), 'usdchf_log_return': np.float32(0.12057217), 'xagusd_log_return': np.float32(0.10809201), 'xtiusd_log_return': np.float32(0.105380654), 'synth_vix_zscore': np.float32(0.11380388)}
[2026-05-15 01:22:29,137 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:22:29,475 INFO] src.engine_xgb: XGB Train Acc: 0.8188 | Test Acc: 0.8188
[2026-05-15 01:22:29,476 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09950725), 'gmm_vol_cluster': np.float32(0.10454371), 'rsi_slope': np.float32(0.115179785), 'atr_normalized': np.float32(0.10822025), 'prev_log_return': np.float32(0.11922712), 'usdchf_log_return': np.float32(0.1097048), 'xagusd_log_return': np.float32(0.11290643), 'xtiusd_log_return': np.float32(0.112058125), 'synth_vix_zscore': np.float32(0.11865256)}
[2026-05-15 01:22:29,476 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:22:29,803 INFO] src.engine_xgb: XGB Train Acc: 0.8394 | Test Acc: 0.8394
[2026-05-15 01:22:29,805 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1020204), 'gmm_vol_cluster': np.float32(0.10479996), 'rsi_slope': np.float32(0.11281849), 'atr_normalized': np.float32(0.116928115), 'prev_log_return': np.float32(0.112604074), 'usdchf_log_return': np.float32(0.111466385), 'xagusd_log_return': np.float32(0.12180138), 'xtiusd_log_return': np.float32(0.110432506), 'synth_vix_zscore': np.float32(0.10712871)}
[2026-05-15 01:22:29,805 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:22:29,806 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.42962, 0.34995) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:29,928 INFO] src.backtester: Backtest [H1]: Sharpe=-4.435 | MaxDD=0.243 | WR=0.256 | Return=-20.6% | Trades=203
[2026-05-15 01:22:29,929 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:30,297 INFO] src.engine_xgb: XGB Train Acc: 0.7546 | Test Acc: 0.7546
[2026-05-15 01:22:30,297 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10390273), 'gmm_vol_cluster': np.float32(0.095323995), 'rsi_slope': np.float32(0.115671866), 'atr_normalized': np.float32(0.111179344), 'prev_log_return': np.float32(0.10922265), 'usdchf_log_return': np.float32(0.11981283), 'xagusd_log_return': np.float32(0.11203078), 'xtiusd_log_return': np.float32(0.10828856), 'synth_vix_zscore': np.float32(0.12456725)}
[2026-05-15 01:22:30,298 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:22:30,646 INFO] src.engine_xgb: XGB Train Acc: 0.7216 | Test Acc: 0.7216
[2026-05-15 01:22:30,646 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09611703), 'gmm_vol_cluster': np.float32(0.12483275), 'rsi_slope': np.float32(0.117890276), 'atr_normalized': np.float32(0.11169904), 'prev_log_return': np.float32(0.102320984), 'usdchf_log_return': np.float32(0.11181212), 'xagusd_log_return': np.float32(0.11376311), 'xtiusd_log_return': np.float32(0.11274943), 'synth_vix_zscore': np.float32(0.10881525)}
[2026-05-15 01:22:30,646 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:22:31,036 INFO] src.engine_xgb: XGB Train Acc: 0.7324 | Test Acc: 0.7324
[2026-05-15 01:22:31,036 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.114608705), 'gmm_vol_cluster': np.float32(0.08874457), 'rsi_slope': np.float32(0.10972105), 'atr_normalized': np.float32(0.11036019), 'prev_log_return': np.float32(0.12086197), 'usdchf_log_return': np.float32(0.11138919), 'xagusd_log_return': np.float32(0.11507588), 'xtiusd_log_return': np.float32(0.11254786), 'synth_vix_zscore': np.float32(0.116690576)}
[2026-05-15 01:22:31,037 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:22:31,038 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47849, 0.22854) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:31,165 INFO] src.backtester: Backtest [H1]: Sharpe=-2.264 | MaxDD=0.126 | WR=0.292 | Return=-8.5% | Trades=161
[2026-05-15 01:22:31,166 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:31,550 INFO] src.engine_xgb: XGB Train Acc: 0.6939 | Test Acc: 0.6939
[2026-05-15 01:22:31,551 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.100771196), 'gmm_vol_cluster': np.float32(0.14290613), 'rsi_slope': np.float32(0.10393047), 'atr_normalized': np.float32(0.10470579), 'prev_log_return': np.float32(0.10913064), 'usdchf_log_return': np.float32(0.10972943), 'xagusd_log_return': np.float32(0.10698527), 'xtiusd_log_return': np.float32(0.10896013), 'synth_vix_zscore': np.float32(0.112880915)}
[2026-05-15 01:22:31,551 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:22:31,923 INFO] src.engine_xgb: XGB Train Acc: 0.6862 | Test Acc: 0.6862
[2026-05-15 01:22:31,924 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09989563), 'gmm_vol_cluster': np.float32(0.11271792), 'rsi_slope': np.float32(0.117245845), 'atr_normalized': np.float32(0.11664362), 'prev_log_return': np.float32(0.10550137), 'usdchf_log_return': np.float32(0.11121839), 'xagusd_log_return': np.float32(0.116113804), 'xtiusd_log_return': np.float32(0.11063691), 'synth_vix_zscore': np.float32(0.11002652)}
[2026-05-15 01:22:31,924 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:22:32,315 INFO] src.engine_xgb: XGB Train Acc: 0.6874 | Test Acc: 0.6874
[2026-05-15 01:22:32,316 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11328743), 'gmm_vol_cluster': np.float32(0.09588256), 'rsi_slope': np.float32(0.11176398), 'atr_normalized': np.float32(0.10846339), 'prev_log_return': np.float32(0.11887784), 'usdchf_log_return': np.float32(0.11587531), 'xagusd_log_return': np.float32(0.112767994), 'xtiusd_log_return': np.float32(0.109597936), 'synth_vix_zscore': np.float32(0.113483556)}
[2026-05-15 01:22:32,316 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:22:32,318 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.64128, 0.06038) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:32,418 INFO] src.backtester: Backtest [H1]: Sharpe=-5.442 | MaxDD=0.147 | WR=0.273 | Return=-12.8% | Trades=121
[2026-05-15 01:22:32,418 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:32,432 INFO] src.optimizer: WFO [H1] window start=34560: trades=121 sharpe=-5.442 cv_sharpe=-3.349 score=-0.500
[2026-05-15 01:22:33,809 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:22:33,809 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:22:33,810 INFO] src.engine_hmm: Bull 0.9573 0.0314 0.0037 0.0075
[2026-05-15 01:22:33,810 INFO] src.engine_hmm: Bear 0.0074 0.9467 0.0083 0.0376
[2026-05-15 01:22:33,810 INFO] src.engine_hmm: Chop_Low 0.0097 0.0000 0.9649 0.0254
[2026-05-15 01:22:33,810 INFO] src.engine_hmm: Chop_High 0.0073 0.0222 0.0300 0.9406
[2026-05-15 01:22:33,811 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:22:33,811 INFO] src.engine_hmm: Bull: return=0.304205, vol=1.715395, rsi_slope=-0.009621
[2026-05-15 01:22:33,811 INFO] src.engine_hmm: Bear: return=-0.099362, vol=0.374946, rsi_slope=-0.010091
[2026-05-15 01:22:33,811 INFO] src.engine_hmm: Chop_Low: return=-0.085179, vol=-0.890099, rsi_slope=-0.006265
[2026-05-15 01:22:33,812 INFO] src.engine_hmm: Chop_High: return=0.000160, vol=-0.244231, rsi_slope=0.019484
[2026-05-15 01:22:33,812 INFO] src.engine_hmm: Total regime transitions: 484
[2026-05-15 01:22:33,812 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-16 06:00:00: Bear -> Chop_High
[2026-05-15 01:22:33,813 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-18 12:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:33,813 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-18 16:00:00: Chop_Low -> Chop_High
[2026-05-15 01:22:33,813 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-22 16:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:33,813 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-23 09:00:00: Chop_Low -> Chop_High
[2026-05-15 01:22:33,813 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-23 21:00:00: Chop_High -> Bear
[2026-05-15 01:22:33,814 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-24 07:00:00: Bear -> Chop_High
[2026-05-15 01:22:33,814 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-24 18:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:33,814 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-28 01:00:00: Chop_Low -> Chop_High
[2026-05-15 01:22:33,814 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-28 10:00:00: Chop_High -> Bear
[2026-05-15 01:22:33,834 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:22:33,843 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:22:34,133 INFO] src.engine_xgb: XGB Train Acc: 0.8421 | Test Acc: 0.8421
[2026-05-15 01:22:34,134 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11659349), 'gmm_vol_cluster': np.float32(0.06284348), 'rsi_slope': np.float32(0.11625813), 'atr_normalized': np.float32(0.1109174), 'prev_log_return': np.float32(0.112692386), 'usdchf_log_return': np.float32(0.12411738), 'xagusd_log_return': np.float32(0.11859904), 'xtiusd_log_return': np.float32(0.119406536), 'synth_vix_zscore': np.float32(0.11857213)}
[2026-05-15 01:22:34,134 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:22:34,446 INFO] src.engine_xgb: XGB Train Acc: 0.8105 | Test Acc: 0.8105
[2026-05-15 01:22:34,447 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.102059335), 'gmm_vol_cluster': np.float32(0.12885027), 'rsi_slope': np.float32(0.10766292), 'atr_normalized': np.float32(0.115523994), 'prev_log_return': np.float32(0.111062266), 'usdchf_log_return': np.float32(0.10482057), 'xagusd_log_return': np.float32(0.10795798), 'xtiusd_log_return': np.float32(0.114524625), 'synth_vix_zscore': np.float32(0.107538)}
[2026-05-15 01:22:34,447 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:22:34,765 INFO] src.engine_xgb: XGB Train Acc: 0.8557 | Test Acc: 0.8557
[2026-05-15 01:22:34,765 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11830966), 'gmm_vol_cluster': np.float32(0.10593097), 'rsi_slope': np.float32(0.11547485), 'atr_normalized': np.float32(0.10791424), 'prev_log_return': np.float32(0.11166277), 'usdchf_log_return': np.float32(0.11251511), 'xagusd_log_return': np.float32(0.114897594), 'xtiusd_log_return': np.float32(0.10789137), 'synth_vix_zscore': np.float32(0.10540342)}
[2026-05-15 01:22:34,766 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:22:34,767 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.13686, 0.71017) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:34,892 INFO] src.backtester: Backtest [H1]: Sharpe=-5.534 | MaxDD=0.180 | WR=0.227 | Return=-15.6% | Trades=176
[2026-05-15 01:22:34,893 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:35,250 INFO] src.engine_xgb: XGB Train Acc: 0.7447 | Test Acc: 0.7447
[2026-05-15 01:22:35,250 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12666592), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12525193), 'atr_normalized': np.float32(0.123752214), 'prev_log_return': np.float32(0.123857334), 'usdchf_log_return': np.float32(0.12321911), 'xagusd_log_return': np.float32(0.12327056), 'xtiusd_log_return': np.float32(0.12754239), 'synth_vix_zscore': np.float32(0.12644063)}
[2026-05-15 01:22:35,251 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:22:35,622 INFO] src.engine_xgb: XGB Train Acc: 0.7529 | Test Acc: 0.7529
[2026-05-15 01:22:35,623 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10688249), 'gmm_vol_cluster': np.float32(0.110619225), 'rsi_slope': np.float32(0.10785623), 'atr_normalized': np.float32(0.10728402), 'prev_log_return': np.float32(0.113855466), 'usdchf_log_return': np.float32(0.114650436), 'xagusd_log_return': np.float32(0.109431505), 'xtiusd_log_return': np.float32(0.119507335), 'synth_vix_zscore': np.float32(0.10991329)}
[2026-05-15 01:22:35,623 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:22:35,965 INFO] src.engine_xgb: XGB Train Acc: 0.7208 | Test Acc: 0.7208
[2026-05-15 01:22:35,965 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10846516), 'gmm_vol_cluster': np.float32(0.12205617), 'rsi_slope': np.float32(0.11096487), 'atr_normalized': np.float32(0.11173975), 'prev_log_return': np.float32(0.11304729), 'usdchf_log_return': np.float32(0.109145574), 'xagusd_log_return': np.float32(0.10510093), 'xtiusd_log_return': np.float32(0.11333508), 'synth_vix_zscore': np.float32(0.106145196)}
[2026-05-15 01:22:35,966 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:22:35,967 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.51565, 0.29314) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:36,092 INFO] src.backtester: Backtest [H1]: Sharpe=-5.505 | MaxDD=0.243 | WR=0.231 | Return=-21.3% | Trades=182
[2026-05-15 01:22:36,092 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:36,478 INFO] src.engine_xgb: XGB Train Acc: 0.6932 | Test Acc: 0.6932
[2026-05-15 01:22:36,480 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13322894), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.121210515), 'atr_normalized': np.float32(0.12312312), 'prev_log_return': np.float32(0.118799895), 'usdchf_log_return': np.float32(0.12465077), 'xagusd_log_return': np.float32(0.124063514), 'xtiusd_log_return': np.float32(0.12870249), 'synth_vix_zscore': np.float32(0.12622078)}
[2026-05-15 01:22:36,480 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:22:36,855 INFO] src.engine_xgb: XGB Train Acc: 0.6872 | Test Acc: 0.6872
[2026-05-15 01:22:36,855 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10061941), 'gmm_vol_cluster': np.float32(0.1398), 'rsi_slope': np.float32(0.09989544), 'atr_normalized': np.float32(0.10624772), 'prev_log_return': np.float32(0.112702355), 'usdchf_log_return': np.float32(0.10945644), 'xagusd_log_return': np.float32(0.108767994), 'xtiusd_log_return': np.float32(0.11529336), 'synth_vix_zscore': np.float32(0.10721729)}
[2026-05-15 01:22:36,856 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:22:37,240 INFO] src.engine_xgb: XGB Train Acc: 0.6954 | Test Acc: 0.6954
[2026-05-15 01:22:37,240 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09456613), 'gmm_vol_cluster': np.float32(0.10290539), 'rsi_slope': np.float32(0.12369997), 'atr_normalized': np.float32(0.124845274), 'prev_log_return': np.float32(0.109278046), 'usdchf_log_return': np.float32(0.109760925), 'xagusd_log_return': np.float32(0.11073456), 'xtiusd_log_return': np.float32(0.1127252), 'synth_vix_zscore': np.float32(0.11148455)}
[2026-05-15 01:22:37,241 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:22:37,242 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.46960, 0.34543) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:37,340 INFO] src.backtester: Backtest [H1]: Sharpe=-7.512 | MaxDD=0.197 | WR=0.252 | Return=-17.7% | Trades=123
[2026-05-15 01:22:37,341 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:37,355 INFO] src.optimizer: WFO [H1] window start=38880: trades=123 sharpe=-7.512 cv_sharpe=-5.519 score=-50.000
[2026-05-15 01:22:38,685 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:22:38,686 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:22:38,686 INFO] src.engine_hmm: Bull 0.9506 0.0083 0.0064 0.0346
[2026-05-15 01:22:38,686 INFO] src.engine_hmm: Bear 0.0426 0.9501 0.0016 0.0057
[2026-05-15 01:22:38,686 INFO] src.engine_hmm: Chop_Low 0.0001 0.0088 0.9593 0.0318
[2026-05-15 01:22:38,687 INFO] src.engine_hmm: Chop_High 0.0228 0.0057 0.0319 0.9396
[2026-05-15 01:22:38,687 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:22:38,687 INFO] src.engine_hmm: Bull: return=0.097309, vol=0.386128, rsi_slope=0.019187
[2026-05-15 01:22:38,687 INFO] src.engine_hmm: Bear: return=-0.302205, vol=1.858210, rsi_slope=-0.043518
[2026-05-15 01:22:38,687 INFO] src.engine_hmm: Chop_Low: return=-0.046441, vol=-0.891365, rsi_slope=-0.001679
[2026-05-15 01:22:38,687 INFO] src.engine_hmm: Chop_High: return=0.089268, vol=-0.255503, rsi_slope=0.003913
[2026-05-15 01:22:38,688 INFO] src.engine_hmm: Total regime transitions: 490
[2026-05-15 01:22:38,688 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-10 17:00:00: Chop_Low -> Chop_High
[2026-05-15 01:22:38,688 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-11 14:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:38,689 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-21 05:00:00: Chop_Low -> Chop_High
[2026-05-15 01:22:38,689 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-21 16:00:00: Chop_High -> Bull
[2026-05-15 01:22:38,689 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-22 02:00:00: Bull -> Chop_High
[2026-05-15 01:22:38,689 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-22 13:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:38,689 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-22 16:00:00: Chop_Low -> Chop_High
[2026-05-15 01:22:38,690 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-23 12:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:38,690 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-23 16:00:00: Chop_Low -> Bear
[2026-05-15 01:22:38,690 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-23 17:00:00: Bear -> Bull
[2026-05-15 01:22:38,708 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:22:38,717 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:22:38,958 INFO] src.engine_xgb: XGB Train Acc: 0.8651 | Test Acc: 0.8651
[2026-05-15 01:22:38,958 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12514246), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12768668), 'atr_normalized': np.float32(0.11515478), 'prev_log_return': np.float32(0.12393346), 'usdchf_log_return': np.float32(0.13707164), 'xagusd_log_return': np.float32(0.12322152), 'xtiusd_log_return': np.float32(0.124655694), 'synth_vix_zscore': np.float32(0.12313377)}
[2026-05-15 01:22:38,959 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:22:39,223 INFO] src.engine_xgb: XGB Train Acc: 0.8262 | Test Acc: 0.8262
[2026-05-15 01:22:39,224 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13340832), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1162285), 'atr_normalized': np.float32(0.11729673), 'prev_log_return': np.float32(0.11976681), 'usdchf_log_return': np.float32(0.1293017), 'xagusd_log_return': np.float32(0.12012996), 'xtiusd_log_return': np.float32(0.12911215), 'synth_vix_zscore': np.float32(0.13475586)}
[2026-05-15 01:22:39,224 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:22:39,547 INFO] src.engine_xgb: XGB Train Acc: 0.8343 | Test Acc: 0.8343
[2026-05-15 01:22:39,547 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09745117), 'gmm_vol_cluster': np.float32(0.11625352), 'rsi_slope': np.float32(0.103224486), 'atr_normalized': np.float32(0.113738604), 'prev_log_return': np.float32(0.11022656), 'usdchf_log_return': np.float32(0.11849516), 'xagusd_log_return': np.float32(0.10845146), 'xtiusd_log_return': np.float32(0.119965285), 'synth_vix_zscore': np.float32(0.112193674)}
[2026-05-15 01:22:39,548 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:22:39,549 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.73608, -0.15122) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:39,675 INFO] src.backtester: Backtest [H1]: Sharpe=-3.727 | MaxDD=0.203 | WR=0.323 | Return=-17.3% | Trades=195
[2026-05-15 01:22:39,676 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:40,064 INFO] src.engine_xgb: XGB Train Acc: 0.7483 | Test Acc: 0.7483
[2026-05-15 01:22:40,064 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12145009), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1225592), 'atr_normalized': np.float32(0.12022216), 'prev_log_return': np.float32(0.13021643), 'usdchf_log_return': np.float32(0.12596367), 'xagusd_log_return': np.float32(0.12211021), 'xtiusd_log_return': np.float32(0.13061488), 'synth_vix_zscore': np.float32(0.12686335)}
[2026-05-15 01:22:40,065 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:22:40,464 INFO] src.engine_xgb: XGB Train Acc: 0.7581 | Test Acc: 0.7581
[2026-05-15 01:22:40,465 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11637026), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.121490486), 'atr_normalized': np.float32(0.12610915), 'prev_log_return': np.float32(0.13151155), 'usdchf_log_return': np.float32(0.12499572), 'xagusd_log_return': np.float32(0.122706376), 'xtiusd_log_return': np.float32(0.1250507), 'synth_vix_zscore': np.float32(0.1317657)}
[2026-05-15 01:22:40,466 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:22:40,781 INFO] src.engine_xgb: XGB Train Acc: 0.7511 | Test Acc: 0.7511
[2026-05-15 01:22:40,781 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11760302), 'gmm_vol_cluster': np.float32(0.099149495), 'rsi_slope': np.float32(0.11999646), 'atr_normalized': np.float32(0.11591075), 'prev_log_return': np.float32(0.1134341), 'usdchf_log_return': np.float32(0.10935882), 'xagusd_log_return': np.float32(0.11483929), 'xtiusd_log_return': np.float32(0.10838377), 'synth_vix_zscore': np.float32(0.10132429)}
[2026-05-15 01:22:40,782 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:22:40,783 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53526, 0.16378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:40,905 INFO] src.backtester: Backtest [H1]: Sharpe=-3.328 | MaxDD=0.150 | WR=0.308 | Return=-11.6% | Trades=172
[2026-05-15 01:22:40,905 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:41,248 INFO] src.engine_xgb: XGB Train Acc: 0.6918 | Test Acc: 0.6918
[2026-05-15 01:22:41,249 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11269659), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12359021), 'atr_normalized': np.float32(0.12958501), 'prev_log_return': np.float32(0.13025923), 'usdchf_log_return': np.float32(0.13478789), 'xagusd_log_return': np.float32(0.11733032), 'xtiusd_log_return': np.float32(0.13194554), 'synth_vix_zscore': np.float32(0.11980519)}
[2026-05-15 01:22:41,249 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:22:41,582 INFO] src.engine_xgb: XGB Train Acc: 0.6986 | Test Acc: 0.6986
[2026-05-15 01:22:41,583 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11739009), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.123640925), 'atr_normalized': np.float32(0.123446874), 'prev_log_return': np.float32(0.12489658), 'usdchf_log_return': np.float32(0.127624), 'xagusd_log_return': np.float32(0.123412855), 'xtiusd_log_return': np.float32(0.11962335), 'synth_vix_zscore': np.float32(0.13996533)}
[2026-05-15 01:22:41,583 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:22:41,910 INFO] src.engine_xgb: XGB Train Acc: 0.7042 | Test Acc: 0.7042
[2026-05-15 01:22:41,910 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.118670024), 'gmm_vol_cluster': np.float32(0.10182489), 'rsi_slope': np.float32(0.11575302), 'atr_normalized': np.float32(0.118541345), 'prev_log_return': np.float32(0.11160713), 'usdchf_log_return': np.float32(0.10702512), 'xagusd_log_return': np.float32(0.1067339), 'xtiusd_log_return': np.float32(0.11056422), 'synth_vix_zscore': np.float32(0.109280325)}
[2026-05-15 01:22:41,911 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:22:41,912 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.43440, 0.22813) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:42,007 INFO] src.backtester: Backtest [H1]: Sharpe=-3.915 | MaxDD=0.183 | WR=0.295 | Return=-14.2% | Trades=112
[2026-05-15 01:22:42,007 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:42,021 INFO] src.optimizer: WFO [H1] window start=43200: trades=112 sharpe=-3.915 cv_sharpe=-3.527 score=-0.500
[2026-05-15 01:22:42,022 INFO] src.optimizer: WFO [H1]: 6/8 valid | median_trades=122 | score=-1.537 | std_sharpe=1.883 | WFE=1.08 | window_scores=[-50.0, -1.0, -0.5, -0.5, -0.5, -0.5, -50.0, -0.5]
[2026-05-15 01:22:42,074 INFO] src.optimizer: Trial 35 [H1/headway_cent $15 standard]: score=-1.979 | valid=6/8 | std_sharpe=1.883 | median_trades=122 | WFE=1.08 | scores=[-50.0, -1.0, -0.5, -0.5, -0.5, -0.5, -50.0, -0.5]
Best trial: 23. Best value: -0.320363: 18%|████████████▏ | 36/200 [20:41<1:40:27, 36.75s/it][2026-05-15 01:22:43,502 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:22:43,502 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:22:43,502 INFO] src.engine_hmm: Bull 0.9737 0.0101 0.0152 0.0010
[2026-05-15 01:22:43,502 INFO] src.engine_hmm: Bear 0.0062 0.9679 0.0000 0.0259
[2026-05-15 01:22:43,502 INFO] src.engine_hmm: Chop_Low 0.0101 0.0008 0.9704 0.0186
[2026-05-15 01:22:43,502 INFO] src.engine_hmm: Chop_High 0.0040 0.0113 0.0198 0.9649
[2026-05-15 01:22:43,503 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:22:43,503 INFO] src.engine_hmm: Bull: return=1.251119, vol=0.785376, rsi_slope=-0.051030
[2026-05-15 01:22:43,503 INFO] src.engine_hmm: Bear: return=-1.165212, vol=0.940534, rsi_slope=0.051396
[2026-05-15 01:22:43,503 INFO] src.engine_hmm: Chop_Low: return=0.317277, vol=-0.643136, rsi_slope=-0.024420
[2026-05-15 01:22:43,503 INFO] src.engine_hmm: Chop_High: return=-0.488988, vol=-0.441060, rsi_slope=0.029358
[2026-05-15 01:22:43,503 INFO] src.engine_hmm: Total regime transitions: 304
[2026-05-15 01:22:43,504 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-25 06:00:00: Chop_Low -> Chop_High
[2026-05-15 01:22:43,504 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-27 15:00:00: Chop_High -> Bear
[2026-05-15 01:22:43,504 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-28 03:00:00: Bear -> Chop_High
[2026-05-15 01:22:43,504 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-02 19:00:00: Chop_High -> Bear
[2026-05-15 01:22:43,504 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-03 09:00:00: Bear -> Chop_High
[2026-05-15 01:22:43,505 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-03 16:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:43,505 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-03 19:00:00: Chop_Low -> Bull
[2026-05-15 01:22:43,505 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-04 16:00:00: Bull -> Chop_Low
[2026-05-15 01:22:43,505 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-10 11:00:00: Chop_Low -> Chop_High
[2026-05-15 01:22:43,505 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-11 03:00:00: Chop_High -> Bear
[2026-05-15 01:22:43,521 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:22:43,529 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:22:43,609 INFO] src.engine_xgb: XGB Train Acc: 0.6789 | Test Acc: 0.6789
[2026-05-15 01:22:43,609 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1140229), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12946871), 'atr_normalized': np.float32(0.12643148), 'prev_log_return': np.float32(0.12832996), 'usdchf_log_return': np.float32(0.12181827), 'xagusd_log_return': np.float32(0.13216776), 'xtiusd_log_return': np.float32(0.12179065), 'synth_vix_zscore': np.float32(0.12597026)}
[2026-05-15 01:22:43,610 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:22:43,693 INFO] src.engine_xgb: XGB Train Acc: 0.6932 | Test Acc: 0.6932
[2026-05-15 01:22:43,693 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.096979305), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1435548), 'atr_normalized': np.float32(0.12948097), 'prev_log_return': np.float32(0.11623859), 'usdchf_log_return': np.float32(0.14614792), 'xagusd_log_return': np.float32(0.11574092), 'xtiusd_log_return': np.float32(0.120143086), 'synth_vix_zscore': np.float32(0.13171443)}
[2026-05-15 01:22:43,694 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:22:43,784 INFO] src.engine_xgb: XGB Train Acc: 0.6778 | Test Acc: 0.6778
[2026-05-15 01:22:43,785 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09304523), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13177238), 'atr_normalized': np.float32(0.121830374), 'prev_log_return': np.float32(0.12969393), 'usdchf_log_return': np.float32(0.13690794), 'xagusd_log_return': np.float32(0.13139398), 'xtiusd_log_return': np.float32(0.13593845), 'synth_vix_zscore': np.float32(0.11941772)}
[2026-05-15 01:22:43,785 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:22:43,786 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.38336, 0.21891) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:43,887 INFO] src.backtester: Backtest [H1]: Sharpe=-1.841 | MaxDD=0.074 | WR=0.293 | Return=-5.2% | Trades=174
[2026-05-15 01:22:43,887 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:44,033 INFO] src.engine_xgb: XGB Train Acc: 0.6738 | Test Acc: 0.6738
[2026-05-15 01:22:44,033 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16154899), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11737958), 'atr_normalized': np.float32(0.11834371), 'prev_log_return': np.float32(0.11863277), 'usdchf_log_return': np.float32(0.117201515), 'xagusd_log_return': np.float32(0.12848647), 'xtiusd_log_return': np.float32(0.12184388), 'synth_vix_zscore': np.float32(0.11656309)}
[2026-05-15 01:22:44,034 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:22:44,161 INFO] src.engine_xgb: XGB Train Acc: 0.6908 | Test Acc: 0.6908
[2026-05-15 01:22:44,162 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11104323), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13331209), 'atr_normalized': np.float32(0.1271709), 'prev_log_return': np.float32(0.13116758), 'usdchf_log_return': np.float32(0.11759794), 'xagusd_log_return': np.float32(0.13376941), 'xtiusd_log_return': np.float32(0.11569881), 'synth_vix_zscore': np.float32(0.13024005)}
[2026-05-15 01:22:44,162 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:22:44,291 INFO] src.engine_xgb: XGB Train Acc: 0.6813 | Test Acc: 0.6813
[2026-05-15 01:22:44,292 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10135802), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13243194), 'atr_normalized': np.float32(0.1290492), 'prev_log_return': np.float32(0.12741984), 'usdchf_log_return': np.float32(0.12430813), 'xagusd_log_return': np.float32(0.12486612), 'xtiusd_log_return': np.float32(0.14344928), 'synth_vix_zscore': np.float32(0.11711752)}
[2026-05-15 01:22:44,292 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:22:44,294 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53107, 0.07740) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:44,401 INFO] src.backtester: Backtest [H1]: Sharpe=-2.543 | MaxDD=0.155 | WR=0.223 | Return=-12.1% | Trades=175
[2026-05-15 01:22:44,402 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:44,583 INFO] src.engine_xgb: XGB Train Acc: 0.6904 | Test Acc: 0.6904
[2026-05-15 01:22:44,584 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.121439934), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.114743404), 'atr_normalized': np.float32(0.13005131), 'prev_log_return': np.float32(0.12084758), 'usdchf_log_return': np.float32(0.12241216), 'xagusd_log_return': np.float32(0.13098283), 'xtiusd_log_return': np.float32(0.13287543), 'synth_vix_zscore': np.float32(0.12664726)}
[2026-05-15 01:22:44,584 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:22:44,746 INFO] src.engine_xgb: XGB Train Acc: 0.6820 | Test Acc: 0.6820
[2026-05-15 01:22:44,746 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10624175), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12533183), 'atr_normalized': np.float32(0.12147958), 'prev_log_return': np.float32(0.12980685), 'usdchf_log_return': np.float32(0.12814216), 'xagusd_log_return': np.float32(0.12590232), 'xtiusd_log_return': np.float32(0.12143478), 'synth_vix_zscore': np.float32(0.14166063)}
[2026-05-15 01:22:44,747 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:22:44,905 INFO] src.engine_xgb: XGB Train Acc: 0.6897 | Test Acc: 0.6897
[2026-05-15 01:22:44,905 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.115066975), 'gmm_vol_cluster': np.float32(0.07418325), 'rsi_slope': np.float32(0.12204626), 'atr_normalized': np.float32(0.10966628), 'prev_log_return': np.float32(0.1099681), 'usdchf_log_return': np.float32(0.10877663), 'xagusd_log_return': np.float32(0.11362928), 'xtiusd_log_return': np.float32(0.12241174), 'synth_vix_zscore': np.float32(0.12425147)}
[2026-05-15 01:22:44,906 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:22:44,907 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.38300, 0.44275) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:44,991 INFO] src.backtester: Backtest [H1]: Sharpe=1.363 | MaxDD=0.093 | WR=0.361 | Return=10.7% | Trades=119
[2026-05-15 01:22:44,992 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:45,005 INFO] src.optimizer: WFO [H1] window start=12960: trades=119 sharpe=1.363 cv_sharpe=-2.192 score=1.096
[2026-05-15 01:22:46,085 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:22:46,085 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:22:46,086 INFO] src.engine_hmm: Bull 0.9764 0.0098 0.0085 0.0053
[2026-05-15 01:22:46,086 INFO] src.engine_hmm: Bear 0.0026 0.9748 0.0176 0.0049
[2026-05-15 01:22:46,086 INFO] src.engine_hmm: Chop_Low 0.0094 0.0063 0.9843 0.0000
[2026-05-15 01:22:46,086 INFO] src.engine_hmm: Chop_High 0.0130 0.0103 0.0000 0.9767
[2026-05-15 01:22:46,086 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:22:46,087 INFO] src.engine_hmm: Bull: return=0.792971, vol=0.019853, rsi_slope=-0.028161
[2026-05-15 01:22:46,087 INFO] src.engine_hmm: Bear: return=-0.724468, vol=0.216402, rsi_slope=0.019099
[2026-05-15 01:22:46,087 INFO] src.engine_hmm: Chop_Low: return=-0.110777, vol=-0.680826, rsi_slope=0.014374
[2026-05-15 01:22:46,087 INFO] src.engine_hmm: Chop_High: return=0.206884, vol=2.052996, rsi_slope=-0.032146
[2026-05-15 01:22:46,087 INFO] src.engine_hmm: Total regime transitions: 214
[2026-05-15 01:22:46,088 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-20 20:00:00: Chop_Low -> Bull
[2026-05-15 01:22:46,088 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-21 16:00:00: Bull -> Bear
[2026-05-15 01:22:46,088 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-21 21:00:00: Bear -> Chop_Low
[2026-05-15 01:22:46,088 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-28 14:00:00: Chop_Low -> Bear
[2026-05-15 01:22:46,089 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-02 12:00:00: Bear -> Chop_Low
[2026-05-15 01:22:46,089 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-11 18:00:00: Chop_Low -> Bear
[2026-05-15 01:22:46,089 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-12 12:00:00: Bear -> Chop_Low
[2026-05-15 01:22:46,090 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-16 15:00:00: Chop_Low -> Bear
[2026-05-15 01:22:46,090 INFO] src.engine_hmm: REGIME CHANGE at 2019-04-17 08:00:00: Bear -> Chop_Low
[2026-05-15 01:22:46,090 INFO] src.engine_hmm: REGIME CHANGE at 2019-05-01 21:00:00: Chop_Low -> Bear
[2026-05-15 01:22:46,107 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:22:46,115 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:22:46,204 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-15 01:22:46,204 INFO] src.engine_xgb: XGB Train Acc: 0.6820 | Test Acc: 0.6820
[2026-05-15 01:22:46,205 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14063609), 'atr_normalized': np.float32(0.15570235), 'prev_log_return': np.float32(0.1480495), 'usdchf_log_return': np.float32(0.13562985), 'xagusd_log_return': np.float32(0.13098773), 'xtiusd_log_return': np.float32(0.14644296), 'synth_vix_zscore': np.float32(0.14255153)}
[2026-05-15 01:22:46,205 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:22:46,288 INFO] src.engine_xgb: XGB Train Acc: 0.6503 | Test Acc: 0.6503
[2026-05-15 01:22:46,289 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11194808), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12346089), 'atr_normalized': np.float32(0.14148526), 'prev_log_return': np.float32(0.113806665), 'usdchf_log_return': np.float32(0.12950683), 'xagusd_log_return': np.float32(0.13573231), 'xtiusd_log_return': np.float32(0.1312673), 'synth_vix_zscore': np.float32(0.11279264)}
[2026-05-15 01:22:46,289 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:22:46,389 INFO] src.engine_xgb: XGB Train Acc: 0.6717 | Test Acc: 0.6717
[2026-05-15 01:22:46,390 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10566824), 'gmm_vol_cluster': np.float32(0.084703304), 'rsi_slope': np.float32(0.12209308), 'atr_normalized': np.float32(0.12626824), 'prev_log_return': np.float32(0.12355005), 'usdchf_log_return': np.float32(0.11133084), 'xagusd_log_return': np.float32(0.11251912), 'xtiusd_log_return': np.float32(0.10771643), 'synth_vix_zscore': np.float32(0.10615071)}
[2026-05-15 01:22:46,390 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:22:46,391 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.50441, -0.08685) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:46,492 INFO] src.backtester: Backtest [H1]: Sharpe=0.536 | MaxDD=0.110 | WR=0.268 | Return=3.4% | Trades=157
[2026-05-15 01:22:46,492 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:46,638 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-15 01:22:46,639 INFO] src.engine_xgb: XGB Train Acc: 0.6889 | Test Acc: 0.6889
[2026-05-15 01:22:46,639 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13537855), 'atr_normalized': np.float32(0.14747179), 'prev_log_return': np.float32(0.12935726), 'usdchf_log_return': np.float32(0.13568085), 'xagusd_log_return': np.float32(0.15617102), 'xtiusd_log_return': np.float32(0.13634035), 'synth_vix_zscore': np.float32(0.15960024)}
[2026-05-15 01:22:46,640 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:22:46,803 INFO] src.engine_xgb: XGB Train Acc: 0.6835 | Test Acc: 0.6835
[2026-05-15 01:22:46,803 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13021626), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12558565), 'atr_normalized': np.float32(0.124421835), 'prev_log_return': np.float32(0.120550774), 'usdchf_log_return': np.float32(0.124823175), 'xagusd_log_return': np.float32(0.12005574), 'xtiusd_log_return': np.float32(0.12658146), 'synth_vix_zscore': np.float32(0.12776518)}
[2026-05-15 01:22:46,804 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:22:46,945 INFO] src.engine_xgb: XGB Train Acc: 0.6677 | Test Acc: 0.6677
[2026-05-15 01:22:46,945 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09327369), 'gmm_vol_cluster': np.float32(0.077656), 'rsi_slope': np.float32(0.1272853), 'atr_normalized': np.float32(0.1048368), 'prev_log_return': np.float32(0.1078183), 'usdchf_log_return': np.float32(0.11733701), 'xagusd_log_return': np.float32(0.12569748), 'xtiusd_log_return': np.float32(0.13117029), 'synth_vix_zscore': np.float32(0.114925146)}
[2026-05-15 01:22:46,946 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:22:46,947 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.49357, -0.10582) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:47,058 INFO] src.backtester: Backtest [H1]: Sharpe=-1.906 | MaxDD=0.161 | WR=0.288 | Return=-12.5% | Trades=184
[2026-05-15 01:22:47,059 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:47,242 INFO] src.engine_xgb: XGB Train Acc: 0.6811 | Test Acc: 0.6811
[2026-05-15 01:22:47,243 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.15365273), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.118438706), 'atr_normalized': np.float32(0.12274315), 'prev_log_return': np.float32(0.121623114), 'usdchf_log_return': np.float32(0.11904646), 'xagusd_log_return': np.float32(0.12255833), 'xtiusd_log_return': np.float32(0.11795813), 'synth_vix_zscore': np.float32(0.12397943)}
[2026-05-15 01:22:47,243 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:22:47,414 INFO] src.engine_xgb: XGB Train Acc: 0.6983 | Test Acc: 0.6983
[2026-05-15 01:22:47,414 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11614488), 'gmm_vol_cluster': np.float32(0.08175221), 'rsi_slope': np.float32(0.11365377), 'atr_normalized': np.float32(0.11117272), 'prev_log_return': np.float32(0.11756142), 'usdchf_log_return': np.float32(0.11264124), 'xagusd_log_return': np.float32(0.11289358), 'xtiusd_log_return': np.float32(0.115968175), 'synth_vix_zscore': np.float32(0.118212014)}
[2026-05-15 01:22:47,415 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:22:47,584 INFO] src.engine_xgb: XGB Train Acc: 0.6800 | Test Acc: 0.6800
[2026-05-15 01:22:47,585 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10437978), 'gmm_vol_cluster': np.float32(0.101330735), 'rsi_slope': np.float32(0.11479638), 'atr_normalized': np.float32(0.11378145), 'prev_log_return': np.float32(0.10570543), 'usdchf_log_return': np.float32(0.10756529), 'xagusd_log_return': np.float32(0.12073144), 'xtiusd_log_return': np.float32(0.11311782), 'synth_vix_zscore': np.float32(0.118591696)}
[2026-05-15 01:22:47,585 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:22:47,586 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.36542, 0.20284) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:47,675 INFO] src.backtester: Backtest [H1]: Sharpe=-2.406 | MaxDD=0.134 | WR=0.284 | Return=-10.1% | Trades=134
[2026-05-15 01:22:47,676 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:47,689 INFO] src.optimizer: WFO [H1] window start=17280: trades=134 sharpe=-2.406 cv_sharpe=-0.685 score=-1.000
[2026-05-15 01:22:48,282 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:22:48,282 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:22:48,282 INFO] src.engine_hmm: Bull 0.9740 0.0096 0.0164 0.0000
[2026-05-15 01:22:48,282 INFO] src.engine_hmm: Bear 0.0114 0.9636 0.0147 0.0103
[2026-05-15 01:22:48,283 INFO] src.engine_hmm: Chop_Low 0.0108 0.0100 0.9767 0.0025
[2026-05-15 01:22:48,283 INFO] src.engine_hmm: Chop_High 0.0000 0.0211 0.0000 0.9789
[2026-05-15 01:22:48,283 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:22:48,283 INFO] src.engine_hmm: Bull: return=0.643765, vol=-0.280684, rsi_slope=-0.032750
[2026-05-15 01:22:48,283 INFO] src.engine_hmm: Bear: return=-0.673922, vol=0.214515, rsi_slope=0.037166
[2026-05-15 01:22:48,283 INFO] src.engine_hmm: Chop_Low: return=-0.061851, vol=-0.686950, rsi_slope=0.001022
[2026-05-15 01:22:48,283 INFO] src.engine_hmm: Chop_High: return=0.185855, vol=1.518246, rsi_slope=-0.009547
[2026-05-15 01:22:48,284 INFO] src.engine_hmm: Total regime transitions: 279
[2026-05-15 01:22:48,284 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 15:00:00: Chop_Low -> Bear
[2026-05-15 01:22:48,284 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-13 13:00:00: Bear -> Chop_Low
[2026-05-15 01:22:48,284 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-24 17:00:00: Chop_Low -> Bull
[2026-05-15 01:22:48,284 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-27 22:00:00: Bull -> Chop_Low
[2026-05-15 01:22:48,285 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-31 03:00:00: Chop_Low -> Bull
[2026-05-15 01:22:48,285 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-31 14:00:00: Bull -> Chop_Low
[2026-05-15 01:22:48,285 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-02 15:00:00: Chop_Low -> Bull
[2026-05-15 01:22:48,285 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 01:00:00: Bull -> Bear
[2026-05-15 01:22:48,285 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 02:00:00: Bear -> Chop_High
[2026-05-15 01:22:48,285 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 20:00:00: Chop_High -> Bear
[2026-05-15 01:22:48,301 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:22:48,309 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:22:48,392 INFO] src.engine_xgb: XGB Train Acc: 0.6883 | Test Acc: 0.6883
[2026-05-15 01:22:48,393 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1785798), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.115346864), 'atr_normalized': np.float32(0.110919915), 'prev_log_return': np.float32(0.118313074), 'usdchf_log_return': np.float32(0.106660046), 'xagusd_log_return': np.float32(0.123959586), 'xtiusd_log_return': np.float32(0.12661502), 'synth_vix_zscore': np.float32(0.119605646)}
[2026-05-15 01:22:48,393 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:22:48,476 INFO] src.engine_xgb: XGB Train Acc: 0.6921 | Test Acc: 0.6921
[2026-05-15 01:22:48,477 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1338242), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11980204), 'atr_normalized': np.float32(0.11857059), 'prev_log_return': np.float32(0.12487332), 'usdchf_log_return': np.float32(0.12938336), 'xagusd_log_return': np.float32(0.12608902), 'xtiusd_log_return': np.float32(0.12476553), 'synth_vix_zscore': np.float32(0.122691974)}
[2026-05-15 01:22:48,477 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:22:48,566 INFO] src.engine_xgb: XGB Train Acc: 0.6585 | Test Acc: 0.6585
[2026-05-15 01:22:48,567 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08968222), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.142142), 'atr_normalized': np.float32(0.11945543), 'prev_log_return': np.float32(0.12952407), 'usdchf_log_return': np.float32(0.12773228), 'xagusd_log_return': np.float32(0.12671965), 'xtiusd_log_return': np.float32(0.14797066), 'synth_vix_zscore': np.float32(0.11677371)}
[2026-05-15 01:22:48,567 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:22:48,568 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.54544, 0.24324) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:48,667 INFO] src.backtester: Backtest [H1]: Sharpe=-2.700 | MaxDD=0.176 | WR=0.234 | Return=-14.6% | Trades=184
[2026-05-15 01:22:48,668 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:48,804 INFO] src.engine_xgb: XGB Train Acc: 0.6748 | Test Acc: 0.6748
[2026-05-15 01:22:48,805 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.16161558), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11518013), 'atr_normalized': np.float32(0.110834286), 'prev_log_return': np.float32(0.1232268), 'usdchf_log_return': np.float32(0.12828831), 'xagusd_log_return': np.float32(0.11922048), 'xtiusd_log_return': np.float32(0.121300645), 'synth_vix_zscore': np.float32(0.12033373)}
[2026-05-15 01:22:48,805 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:22:48,931 INFO] src.engine_xgb: XGB Train Acc: 0.6992 | Test Acc: 0.6992
[2026-05-15 01:22:48,931 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09900551), 'gmm_vol_cluster': np.float32(0.08409083), 'rsi_slope': np.float32(0.12296188), 'atr_normalized': np.float32(0.12235569), 'prev_log_return': np.float32(0.12211325), 'usdchf_log_return': np.float32(0.116400965), 'xagusd_log_return': np.float32(0.10817833), 'xtiusd_log_return': np.float32(0.10970172), 'synth_vix_zscore': np.float32(0.115191884)}
[2026-05-15 01:22:48,932 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:22:49,095 INFO] src.engine_xgb: XGB Train Acc: 0.6945 | Test Acc: 0.6945
[2026-05-15 01:22:49,095 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11593562), 'gmm_vol_cluster': np.float32(0.100278914), 'rsi_slope': np.float32(0.10656358), 'atr_normalized': np.float32(0.10926016), 'prev_log_return': np.float32(0.11532325), 'usdchf_log_return': np.float32(0.120805785), 'xagusd_log_return': np.float32(0.10789828), 'xtiusd_log_return': np.float32(0.10695631), 'synth_vix_zscore': np.float32(0.11697807)}
[2026-05-15 01:22:49,096 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:22:49,097 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.48586, 0.08539) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:49,205 INFO] src.backtester: Backtest [H1]: Sharpe=-3.082 | MaxDD=0.194 | WR=0.305 | Return=-15.4% | Trades=187
[2026-05-15 01:22:49,206 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:49,378 INFO] src.engine_xgb: XGB Train Acc: 0.6956 | Test Acc: 0.6956
[2026-05-15 01:22:49,379 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12691376), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12711604), 'atr_normalized': np.float32(0.124069415), 'prev_log_return': np.float32(0.1231717), 'usdchf_log_return': np.float32(0.12003941), 'xagusd_log_return': np.float32(0.12111425), 'xtiusd_log_return': np.float32(0.12756543), 'synth_vix_zscore': np.float32(0.13001007)}
[2026-05-15 01:22:49,379 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:22:49,538 INFO] src.engine_xgb: XGB Train Acc: 0.6962 | Test Acc: 0.6962
[2026-05-15 01:22:49,539 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.108804576), 'gmm_vol_cluster': np.float32(0.10726254), 'rsi_slope': np.float32(0.106570244), 'atr_normalized': np.float32(0.11536235), 'prev_log_return': np.float32(0.10681719), 'usdchf_log_return': np.float32(0.10983512), 'xagusd_log_return': np.float32(0.11813643), 'xtiusd_log_return': np.float32(0.118442014), 'synth_vix_zscore': np.float32(0.10876951)}
[2026-05-15 01:22:49,539 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:22:49,691 INFO] src.engine_xgb: XGB Train Acc: 0.6837 | Test Acc: 0.6837
[2026-05-15 01:22:49,692 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08607342), 'gmm_vol_cluster': np.float32(0.09339465), 'rsi_slope': np.float32(0.12035006), 'atr_normalized': np.float32(0.12142654), 'prev_log_return': np.float32(0.113547705), 'usdchf_log_return': np.float32(0.115903825), 'xagusd_log_return': np.float32(0.116154745), 'xtiusd_log_return': np.float32(0.121882305), 'synth_vix_zscore': np.float32(0.111266665)}
[2026-05-15 01:22:49,692 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:22:49,693 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.51495, -0.03378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:49,780 INFO] src.backtester: Backtest [H1]: Sharpe=-3.090 | MaxDD=0.099 | WR=0.267 | Return=-9.4% | Trades=131
[2026-05-15 01:22:49,780 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:49,794 INFO] src.optimizer: WFO [H1] window start=21600: trades=131 sharpe=-3.090 cv_sharpe=-2.891 score=-0.500
[2026-05-15 01:22:50,428 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:22:50,429 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:22:50,429 INFO] src.engine_hmm: Bull 0.9751 0.0082 0.0136 0.0031
[2026-05-15 01:22:50,429 INFO] src.engine_hmm: Bear 0.0000 0.9524 0.0000 0.0476
[2026-05-15 01:22:50,430 INFO] src.engine_hmm: Chop_Low 0.0120 0.0066 0.9682 0.0132
[2026-05-15 01:22:50,430 INFO] src.engine_hmm: Chop_High 0.0100 0.0066 0.0259 0.9574
[2026-05-15 01:22:50,430 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:22:50,430 INFO] src.engine_hmm: Bull: return=0.925185, vol=-0.420346, rsi_slope=-0.040417
[2026-05-15 01:22:50,430 INFO] src.engine_hmm: Bear: return=-0.705610, vol=1.755531, rsi_slope=-0.019200
[2026-05-15 01:22:50,431 INFO] src.engine_hmm: Chop_Low: return=-0.071829, vol=-0.579516, rsi_slope=0.008641
[2026-05-15 01:22:50,431 INFO] src.engine_hmm: Chop_High: return=-0.488528, vol=0.292722, rsi_slope=0.038491
[2026-05-15 01:22:50,431 INFO] src.engine_hmm: Total regime transitions: 346
[2026-05-15 01:22:50,432 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-07 17:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:50,432 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-08 12:00:00: Chop_Low -> Chop_High
[2026-05-15 01:22:50,432 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 12:00:00: Chop_High -> Bull
[2026-05-15 01:22:50,433 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 21:00:00: Bull -> Chop_High
[2026-05-15 01:22:50,433 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-11 19:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:50,433 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-14 15:00:00: Chop_Low -> Bull
[2026-05-15 01:22:50,433 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-15 16:00:00: Bull -> Bear
[2026-05-15 01:22:50,433 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-15 17:00:00: Bear -> Chop_High
[2026-05-15 01:22:50,433 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-16 10:00:00: Chop_High -> Bull
[2026-05-15 01:22:50,435 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-16 21:00:00: Bull -> Chop_Low
[2026-05-15 01:22:50,455 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:22:50,465 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:22:50,579 INFO] src.engine_xgb: XGB Train Acc: 0.6632 | Test Acc: 0.6632
[2026-05-15 01:22:50,579 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.17104349), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.118590504), 'atr_normalized': np.float32(0.118469015), 'prev_log_return': np.float32(0.1132826), 'usdchf_log_return': np.float32(0.115920514), 'xagusd_log_return': np.float32(0.11462815), 'xtiusd_log_return': np.float32(0.12363239), 'synth_vix_zscore': np.float32(0.12443335)}
[2026-05-15 01:22:50,579 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:22:50,685 INFO] src.engine_xgb: XGB Train Acc: 0.6586 | Test Acc: 0.6586
[2026-05-15 01:22:50,686 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.116747126), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1436122), 'atr_normalized': np.float32(0.1306271), 'prev_log_return': np.float32(0.12497959), 'usdchf_log_return': np.float32(0.12417528), 'xagusd_log_return': np.float32(0.12008077), 'xtiusd_log_return': np.float32(0.11646121), 'synth_vix_zscore': np.float32(0.12331686)}
[2026-05-15 01:22:50,686 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:22:50,786 INFO] src.engine_xgb: XGB Train Acc: 0.6616 | Test Acc: 0.6616
[2026-05-15 01:22:50,787 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.106159605), 'gmm_vol_cluster': np.float32(0.09710278), 'rsi_slope': np.float32(0.12164483), 'atr_normalized': np.float32(0.113831304), 'prev_log_return': np.float32(0.10135159), 'usdchf_log_return': np.float32(0.10973666), 'xagusd_log_return': np.float32(0.1040186), 'xtiusd_log_return': np.float32(0.11705931), 'synth_vix_zscore': np.float32(0.12909533)}
[2026-05-15 01:22:50,787 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:22:50,788 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.16146, 0.63340) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:50,890 INFO] src.backtester: Backtest [H1]: Sharpe=-2.568 | MaxDD=0.152 | WR=0.301 | Return=-12.8% | Trades=173
[2026-05-15 01:22:50,891 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:51,037 INFO] src.engine_xgb: XGB Train Acc: 0.6884 | Test Acc: 0.6884
[2026-05-15 01:22:51,038 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1446541), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.111307405), 'atr_normalized': np.float32(0.13944598), 'prev_log_return': np.float32(0.1179457), 'usdchf_log_return': np.float32(0.11402597), 'xagusd_log_return': np.float32(0.125141), 'xtiusd_log_return': np.float32(0.12602897), 'synth_vix_zscore': np.float32(0.12145086)}
[2026-05-15 01:22:51,038 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:22:51,166 INFO] src.engine_xgb: XGB Train Acc: 0.6840 | Test Acc: 0.6840
[2026-05-15 01:22:51,166 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12040774), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1269702), 'atr_normalized': np.float32(0.13636144), 'prev_log_return': np.float32(0.13232625), 'usdchf_log_return': np.float32(0.11657061), 'xagusd_log_return': np.float32(0.11599436), 'xtiusd_log_return': np.float32(0.12209515), 'synth_vix_zscore': np.float32(0.12927419)}
[2026-05-15 01:22:51,167 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:22:51,329 INFO] src.engine_xgb: XGB Train Acc: 0.6748 | Test Acc: 0.6748
[2026-05-15 01:22:51,330 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10371502), 'gmm_vol_cluster': np.float32(0.08488859), 'rsi_slope': np.float32(0.119510226), 'atr_normalized': np.float32(0.12329265), 'prev_log_return': np.float32(0.11232151), 'usdchf_log_return': np.float32(0.10758779), 'xagusd_log_return': np.float32(0.112657055), 'xtiusd_log_return': np.float32(0.11423797), 'synth_vix_zscore': np.float32(0.12178919)}
[2026-05-15 01:22:51,330 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:22:51,331 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47142, 0.22575) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:51,440 INFO] src.backtester: Backtest [H1]: Sharpe=-3.005 | MaxDD=0.164 | WR=0.239 | Return=-12.4% | Trades=184
[2026-05-15 01:22:51,440 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:51,614 INFO] src.engine_xgb: XGB Train Acc: 0.6939 | Test Acc: 0.6939
[2026-05-15 01:22:51,614 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11555369), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14014108), 'atr_normalized': np.float32(0.12504582), 'prev_log_return': np.float32(0.12786956), 'usdchf_log_return': np.float32(0.12110949), 'xagusd_log_return': np.float32(0.12111361), 'xtiusd_log_return': np.float32(0.12525232), 'synth_vix_zscore': np.float32(0.12391438)}
[2026-05-15 01:22:51,615 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:22:51,772 INFO] src.engine_xgb: XGB Train Acc: 0.6875 | Test Acc: 0.6875
[2026-05-15 01:22:51,772 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.122182906), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13049306), 'atr_normalized': np.float32(0.13182001), 'prev_log_return': np.float32(0.13233648), 'usdchf_log_return': np.float32(0.11669098), 'xagusd_log_return': np.float32(0.119679116), 'xtiusd_log_return': np.float32(0.11499421), 'synth_vix_zscore': np.float32(0.13180321)}
[2026-05-15 01:22:51,773 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:22:51,925 INFO] src.engine_xgb: XGB Train Acc: 0.6904 | Test Acc: 0.6904
[2026-05-15 01:22:51,926 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09957234), 'gmm_vol_cluster': np.float32(0.09688028), 'rsi_slope': np.float32(0.12245506), 'atr_normalized': np.float32(0.12110743), 'prev_log_return': np.float32(0.11107599), 'usdchf_log_return': np.float32(0.10940707), 'xagusd_log_return': np.float32(0.11154291), 'xtiusd_log_return': np.float32(0.10590832), 'synth_vix_zscore': np.float32(0.12205057)}
[2026-05-15 01:22:51,926 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:22:51,927 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.62208, 0.06248) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:52,013 INFO] src.backtester: Backtest [H1]: Sharpe=-1.093 | MaxDD=0.125 | WR=0.299 | Return=-4.4% | Trades=137
[2026-05-15 01:22:52,014 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:52,027 INFO] src.optimizer: WFO [H1] window start=25920: trades=137 sharpe=-1.093 cv_sharpe=-2.787 score=-0.500
[2026-05-15 01:22:52,919 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:22:52,919 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:22:52,919 INFO] src.engine_hmm: Bull 0.9695 0.0000 0.0213 0.0091
[2026-05-15 01:22:52,920 INFO] src.engine_hmm: Bear 0.0000 0.9668 0.0254 0.0079
[2026-05-15 01:22:52,920 INFO] src.engine_hmm: Chop_Low 0.0169 0.0142 0.9637 0.0051
[2026-05-15 01:22:52,920 INFO] src.engine_hmm: Chop_High 0.0126 0.0321 0.0001 0.9552
[2026-05-15 01:22:52,920 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:22:52,920 INFO] src.engine_hmm: Bull: return=0.859526, vol=-0.498122, rsi_slope=-0.035106
[2026-05-15 01:22:52,920 INFO] src.engine_hmm: Bear: return=-0.761598, vol=0.172534, rsi_slope=0.024860
[2026-05-15 01:22:52,920 INFO] src.engine_hmm: Chop_Low: return=-0.044019, vol=-0.457577, rsi_slope=0.008379
[2026-05-15 01:22:52,921 INFO] src.engine_hmm: Chop_High: return=0.115670, vol=1.663722, rsi_slope=-0.008305
[2026-05-15 01:22:52,921 INFO] src.engine_hmm: Total regime transitions: 350
[2026-05-15 01:22:52,921 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-02 19:00:00: Chop_Low -> Bull
[2026-05-15 01:22:52,921 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 07:00:00: Bull -> Chop_Low
[2026-05-15 01:22:52,922 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 15:00:00: Chop_Low -> Bear
[2026-05-15 01:22:52,922 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-04 04:00:00: Bear -> Chop_High
[2026-05-15 01:22:52,922 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-04 12:00:00: Chop_High -> Bear
[2026-05-15 01:22:52,922 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 12:00:00: Bear -> Chop_Low
[2026-05-15 01:22:52,922 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 16:00:00: Chop_Low -> Bull
[2026-05-15 01:22:52,923 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-08 15:00:00: Bull -> Chop_Low
[2026-05-15 01:22:52,923 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 15:00:00: Chop_Low -> Chop_High
[2026-05-15 01:22:52,923 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 16:00:00: Chop_High -> Bear
[2026-05-15 01:22:52,938 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:22:52,946 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:22:53,024 INFO] src.engine_xgb: XGB Train Acc: 0.6674 | Test Acc: 0.6674
[2026-05-15 01:22:53,024 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13232376), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1487546), 'atr_normalized': np.float32(0.120275706), 'prev_log_return': np.float32(0.14423391), 'usdchf_log_return': np.float32(0.12209146), 'xagusd_log_return': np.float32(0.11247894), 'xtiusd_log_return': np.float32(0.10761542), 'synth_vix_zscore': np.float32(0.112226315)}
[2026-05-15 01:22:53,025 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:22:53,108 INFO] src.engine_xgb: XGB Train Acc: 0.6607 | Test Acc: 0.6607
[2026-05-15 01:22:53,109 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10029617), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13019784), 'atr_normalized': np.float32(0.1211501), 'prev_log_return': np.float32(0.13305475), 'usdchf_log_return': np.float32(0.13641393), 'xagusd_log_return': np.float32(0.122510254), 'xtiusd_log_return': np.float32(0.13174789), 'synth_vix_zscore': np.float32(0.124629095)}
[2026-05-15 01:22:53,109 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:22:53,198 INFO] src.engine_xgb: XGB Train Acc: 0.6789 | Test Acc: 0.6789
[2026-05-15 01:22:53,198 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09363435), 'gmm_vol_cluster': np.float32(0.14970346), 'rsi_slope': np.float32(0.10576603), 'atr_normalized': np.float32(0.1284315), 'prev_log_return': np.float32(0.10566883), 'usdchf_log_return': np.float32(0.10740949), 'xagusd_log_return': np.float32(0.10231444), 'xtiusd_log_return': np.float32(0.11049873), 'synth_vix_zscore': np.float32(0.09657319)}
[2026-05-15 01:22:53,199 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:22:53,199 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.56732, -0.02191) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:53,295 INFO] src.backtester: Backtest [H1]: Sharpe=-1.707 | MaxDD=0.124 | WR=0.298 | Return=-8.1% | Trades=178
[2026-05-15 01:22:53,296 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:53,439 INFO] src.engine_xgb: XGB Train Acc: 0.6665 | Test Acc: 0.6665
[2026-05-15 01:22:53,439 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1172235), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13854763), 'atr_normalized': np.float32(0.1264594), 'prev_log_return': np.float32(0.13129075), 'usdchf_log_return': np.float32(0.13208038), 'xagusd_log_return': np.float32(0.12517494), 'xtiusd_log_return': np.float32(0.108462505), 'synth_vix_zscore': np.float32(0.12076092)}
[2026-05-15 01:22:53,440 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:22:53,585 INFO] src.engine_xgb: XGB Train Acc: 0.6908 | Test Acc: 0.6908
[2026-05-15 01:22:53,587 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10738705), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1208943), 'atr_normalized': np.float32(0.11592638), 'prev_log_return': np.float32(0.12577416), 'usdchf_log_return': np.float32(0.12594567), 'xagusd_log_return': np.float32(0.13066196), 'xtiusd_log_return': np.float32(0.14270431), 'synth_vix_zscore': np.float32(0.13070616)}
[2026-05-15 01:22:53,587 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:22:53,735 INFO] src.engine_xgb: XGB Train Acc: 0.6778 | Test Acc: 0.6778
[2026-05-15 01:22:53,735 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10513435), 'gmm_vol_cluster': np.float32(0.1032404), 'rsi_slope': np.float32(0.11048901), 'atr_normalized': np.float32(0.11016273), 'prev_log_return': np.float32(0.11929699), 'usdchf_log_return': np.float32(0.10474288), 'xagusd_log_return': np.float32(0.10848307), 'xtiusd_log_return': np.float32(0.11354928), 'synth_vix_zscore': np.float32(0.124901295)}
[2026-05-15 01:22:53,736 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:22:53,737 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47816, 0.15210) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:53,849 INFO] src.backtester: Backtest [H1]: Sharpe=-1.983 | MaxDD=0.171 | WR=0.265 | Return=-10.1% | Trades=185
[2026-05-15 01:22:53,850 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:54,011 INFO] src.engine_xgb: XGB Train Acc: 0.6859 | Test Acc: 0.6859
[2026-05-15 01:22:54,011 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.100200415), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12910864), 'atr_normalized': np.float32(0.12762679), 'prev_log_return': np.float32(0.12131913), 'usdchf_log_return': np.float32(0.12715551), 'xagusd_log_return': np.float32(0.12419954), 'xtiusd_log_return': np.float32(0.13062099), 'synth_vix_zscore': np.float32(0.13976899)}
[2026-05-15 01:22:54,011 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:22:54,169 INFO] src.engine_xgb: XGB Train Acc: 0.6931 | Test Acc: 0.6931
[2026-05-15 01:22:54,170 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12996224), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12156128), 'atr_normalized': np.float32(0.13688713), 'prev_log_return': np.float32(0.11865547), 'usdchf_log_return': np.float32(0.13017029), 'xagusd_log_return': np.float32(0.12637508), 'xtiusd_log_return': np.float32(0.12078062), 'synth_vix_zscore': np.float32(0.115607835)}
[2026-05-15 01:22:54,170 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:22:54,336 INFO] src.engine_xgb: XGB Train Acc: 0.6860 | Test Acc: 0.6860
[2026-05-15 01:22:54,337 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12109367), 'gmm_vol_cluster': np.float32(0.091317534), 'rsi_slope': np.float32(0.11488084), 'atr_normalized': np.float32(0.11348854), 'prev_log_return': np.float32(0.117577024), 'usdchf_log_return': np.float32(0.110219724), 'xagusd_log_return': np.float32(0.11314314), 'xtiusd_log_return': np.float32(0.10849966), 'synth_vix_zscore': np.float32(0.109779894)}
[2026-05-15 01:22:54,337 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:22:54,338 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.40708, 0.22442) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:54,428 INFO] src.backtester: Backtest [H1]: Sharpe=-4.910 | MaxDD=0.191 | WR=0.234 | Return=-16.3% | Trades=141
[2026-05-15 01:22:54,429 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:54,438 INFO] src.optimizer: WFO [H1] window start=30240: trades=141 sharpe=-4.910 cv_sharpe=-1.845 score=-50.000
[2026-05-15 01:22:55,177 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:22:55,177 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:22:55,178 INFO] src.engine_hmm: Bull 0.9739 0.0085 0.0000 0.0176
[2026-05-15 01:22:55,178 INFO] src.engine_hmm: Bear 0.0037 0.9715 0.0209 0.0038
[2026-05-15 01:22:55,178 INFO] src.engine_hmm: Chop_Low 0.0046 0.0105 0.9655 0.0194
[2026-05-15 01:22:55,178 INFO] src.engine_hmm: Chop_High 0.0098 0.0077 0.0165 0.9661
[2026-05-15 01:22:55,178 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:22:55,178 INFO] src.engine_hmm: Bull: return=1.281422, vol=1.116930, rsi_slope=-0.026845
[2026-05-15 01:22:55,178 INFO] src.engine_hmm: Bear: return=-1.040504, vol=0.478777, rsi_slope=0.031913
[2026-05-15 01:22:55,178 INFO] src.engine_hmm: Chop_Low: return=-0.425730, vol=-0.711072, rsi_slope=0.030584
[2026-05-15 01:22:55,178 INFO] src.engine_hmm: Chop_High: return=0.423626, vol=-0.444493, rsi_slope=-0.038214
[2026-05-15 01:22:55,180 INFO] src.engine_hmm: Total regime transitions: 306
[2026-05-15 01:22:55,180 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-24 04:00:00: Chop_High -> Bull
[2026-05-15 01:22:55,180 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-25 18:00:00: Bull -> Bear
[2026-05-15 01:22:55,180 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-28 01:00:00: Bear -> Bull
[2026-05-15 01:22:55,180 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-03 06:00:00: Bull -> Chop_High
[2026-05-15 01:22:55,181 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-04 02:00:00: Chop_High -> Bull
[2026-05-15 01:22:55,181 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-10 23:00:00: Bull -> Bear
[2026-05-15 01:22:55,181 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-17 12:00:00: Bear -> Chop_High
[2026-05-15 01:22:55,181 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-18 04:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:55,181 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-21 17:00:00: Chop_Low -> Chop_High
[2026-05-15 01:22:55,181 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-22 10:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:55,197 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:22:55,205 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:22:55,285 INFO] src.engine_xgb: XGB Train Acc: 0.6726 | Test Acc: 0.6726
[2026-05-15 01:22:55,285 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12476388), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11956602), 'atr_normalized': np.float32(0.1220506), 'prev_log_return': np.float32(0.12739785), 'usdchf_log_return': np.float32(0.1330262), 'xagusd_log_return': np.float32(0.12256989), 'xtiusd_log_return': np.float32(0.11976579), 'synth_vix_zscore': np.float32(0.13085967)}
[2026-05-15 01:22:55,285 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:22:55,369 INFO] src.engine_xgb: XGB Train Acc: 0.6628 | Test Acc: 0.6628
[2026-05-15 01:22:55,369 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09481958), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13895272), 'atr_normalized': np.float32(0.1237252), 'prev_log_return': np.float32(0.13953325), 'usdchf_log_return': np.float32(0.13845117), 'xagusd_log_return': np.float32(0.12302192), 'xtiusd_log_return': np.float32(0.12580413), 'synth_vix_zscore': np.float32(0.11569201)}
[2026-05-15 01:22:55,369 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:22:55,459 INFO] src.engine_xgb: XGB Train Acc: 0.6839 | Test Acc: 0.6839
[2026-05-15 01:22:55,460 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12143534), 'gmm_vol_cluster': np.float32(0.09758458), 'rsi_slope': np.float32(0.111229524), 'atr_normalized': np.float32(0.11862548), 'prev_log_return': np.float32(0.110717766), 'usdchf_log_return': np.float32(0.110887736), 'xagusd_log_return': np.float32(0.12980208), 'xtiusd_log_return': np.float32(0.09872311), 'synth_vix_zscore': np.float32(0.10099443)}
[2026-05-15 01:22:55,460 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:22:55,461 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.42962, 0.34995) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:55,561 INFO] src.backtester: Backtest [H1]: Sharpe=-1.896 | MaxDD=0.193 | WR=0.263 | Return=-9.5% | Trades=194
[2026-05-15 01:22:55,561 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:55,701 INFO] src.engine_xgb: XGB Train Acc: 0.6774 | Test Acc: 0.6774
[2026-05-15 01:22:55,701 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13796546), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12989274), 'atr_normalized': np.float32(0.12416024), 'prev_log_return': np.float32(0.111591), 'usdchf_log_return': np.float32(0.13579102), 'xagusd_log_return': np.float32(0.11658844), 'xtiusd_log_return': np.float32(0.119091034), 'synth_vix_zscore': np.float32(0.12491998)}
[2026-05-15 01:22:55,702 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:22:55,844 INFO] src.engine_xgb: XGB Train Acc: 0.6872 | Test Acc: 0.6872
[2026-05-15 01:22:55,844 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13660061), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12534663), 'atr_normalized': np.float32(0.12628771), 'prev_log_return': np.float32(0.123427175), 'usdchf_log_return': np.float32(0.12222692), 'xagusd_log_return': np.float32(0.116251975), 'xtiusd_log_return': np.float32(0.12678865), 'synth_vix_zscore': np.float32(0.123070344)}
[2026-05-15 01:22:55,844 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:22:55,999 INFO] src.engine_xgb: XGB Train Acc: 0.6773 | Test Acc: 0.6773
[2026-05-15 01:22:55,999 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13302015), 'gmm_vol_cluster': np.float32(0.09215802), 'rsi_slope': np.float32(0.10268526), 'atr_normalized': np.float32(0.11314125), 'prev_log_return': np.float32(0.1177955), 'usdchf_log_return': np.float32(0.110448696), 'xagusd_log_return': np.float32(0.11443998), 'xtiusd_log_return': np.float32(0.10747906), 'synth_vix_zscore': np.float32(0.1088321)}
[2026-05-15 01:22:56,000 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:22:56,001 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47849, 0.22854) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:56,110 INFO] src.backtester: Backtest [H1]: Sharpe=-1.863 | MaxDD=0.120 | WR=0.238 | Return=-7.9% | Trades=185
[2026-05-15 01:22:56,111 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:56,291 INFO] src.engine_xgb: XGB Train Acc: 0.6870 | Test Acc: 0.6870
[2026-05-15 01:22:56,291 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13015784), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.115667686), 'atr_normalized': np.float32(0.118956424), 'prev_log_return': np.float32(0.13036914), 'usdchf_log_return': np.float32(0.12854904), 'xagusd_log_return': np.float32(0.12006848), 'xtiusd_log_return': np.float32(0.12299795), 'synth_vix_zscore': np.float32(0.13323341)}
[2026-05-15 01:22:56,292 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:22:56,457 INFO] src.engine_xgb: XGB Train Acc: 0.6889 | Test Acc: 0.6889
[2026-05-15 01:22:56,458 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09896249), 'gmm_vol_cluster': np.float32(0.09387426), 'rsi_slope': np.float32(0.12167606), 'atr_normalized': np.float32(0.117923625), 'prev_log_return': np.float32(0.11564237), 'usdchf_log_return': np.float32(0.12138363), 'xagusd_log_return': np.float32(0.10867921), 'xtiusd_log_return': np.float32(0.10956357), 'synth_vix_zscore': np.float32(0.11229472)}
[2026-05-15 01:22:56,458 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:22:56,617 INFO] src.engine_xgb: XGB Train Acc: 0.6850 | Test Acc: 0.6850
[2026-05-15 01:22:56,618 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11560731), 'gmm_vol_cluster': np.float32(0.09978274), 'rsi_slope': np.float32(0.11426188), 'atr_normalized': np.float32(0.12043147), 'prev_log_return': np.float32(0.11444826), 'usdchf_log_return': np.float32(0.110345416), 'xagusd_log_return': np.float32(0.10649025), 'xtiusd_log_return': np.float32(0.109834634), 'synth_vix_zscore': np.float32(0.10879796)}
[2026-05-15 01:22:56,618 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:22:56,619 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.64128, 0.06038) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:56,705 INFO] src.backtester: Backtest [H1]: Sharpe=-3.350 | MaxDD=0.109 | WR=0.256 | Return=-9.9% | Trades=117
[2026-05-15 01:22:56,705 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:56,714 INFO] src.optimizer: WFO [H1] window start=34560: trades=117 sharpe=-3.350 cv_sharpe=-1.879 score=-0.500
[2026-05-15 01:22:57,721 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:22:57,722 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:22:57,722 INFO] src.engine_hmm: Bull 0.9750 0.0055 0.0000 0.0194
[2026-05-15 01:22:57,722 INFO] src.engine_hmm: Bear 0.0024 0.9710 0.0210 0.0055
[2026-05-15 01:22:57,722 INFO] src.engine_hmm: Chop_Low 0.0025 0.0128 0.9671 0.0176
[2026-05-15 01:22:57,722 INFO] src.engine_hmm: Chop_High 0.0108 0.0068 0.0138 0.9687
[2026-05-15 01:22:57,722 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:22:57,722 INFO] src.engine_hmm: Bull: return=1.428809, vol=1.017683, rsi_slope=-0.029487
[2026-05-15 01:22:57,723 INFO] src.engine_hmm: Bear: return=-1.058457, vol=0.482554, rsi_slope=0.030171
[2026-05-15 01:22:57,723 INFO] src.engine_hmm: Chop_Low: return=-0.478244, vol=-0.626778, rsi_slope=0.023580
[2026-05-15 01:22:57,723 INFO] src.engine_hmm: Chop_High: return=0.362588, vol=-0.401348, rsi_slope=-0.025896
[2026-05-15 01:22:57,723 INFO] src.engine_hmm: Total regime transitions: 289
[2026-05-15 01:22:57,724 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-16 15:00:00: Bull -> Chop_High
[2026-05-15 01:22:57,724 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-17 04:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:57,725 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-18 19:00:00: Chop_Low -> Bear
[2026-05-15 01:22:57,725 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-22 04:00:00: Bear -> Chop_Low
[2026-05-15 01:22:57,725 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-23 21:00:00: Chop_Low -> Chop_High
[2026-05-15 01:22:57,725 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-25 10:00:00: Chop_High -> Chop_Low
[2026-05-15 01:22:57,726 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-28 10:00:00: Chop_Low -> Chop_High
[2026-05-15 01:22:57,726 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-28 16:00:00: Chop_High -> Bear
[2026-05-15 01:22:57,726 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-29 06:00:00: Bear -> Chop_High
[2026-05-15 01:22:57,726 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 21:00:00: Chop_High -> Bull
[2026-05-15 01:22:57,743 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:22:57,751 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:22:57,836 INFO] src.engine_xgb: XGB Train Acc: 0.6684 | Test Acc: 0.6684
[2026-05-15 01:22:57,836 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11613855), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1228085), 'atr_normalized': np.float32(0.13754752), 'prev_log_return': np.float32(0.111831665), 'usdchf_log_return': np.float32(0.12275368), 'xagusd_log_return': np.float32(0.12807444), 'xtiusd_log_return': np.float32(0.13112237), 'synth_vix_zscore': np.float32(0.12972334)}
[2026-05-15 01:22:57,836 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:22:57,921 INFO] src.engine_xgb: XGB Train Acc: 0.6628 | Test Acc: 0.6628
[2026-05-15 01:22:57,921 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.14793587), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.119135275), 'atr_normalized': np.float32(0.13847311), 'prev_log_return': np.float32(0.13358857), 'usdchf_log_return': np.float32(0.11127482), 'xagusd_log_return': np.float32(0.10761948), 'xtiusd_log_return': np.float32(0.1290418), 'synth_vix_zscore': np.float32(0.11293116)}
[2026-05-15 01:22:57,922 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:22:58,011 INFO] src.engine_xgb: XGB Train Acc: 0.6961 | Test Acc: 0.6961
[2026-05-15 01:22:58,012 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.07676142), 'gmm_vol_cluster': np.float32(0.10269295), 'rsi_slope': np.float32(0.12768966), 'atr_normalized': np.float32(0.1091092), 'prev_log_return': np.float32(0.118988924), 'usdchf_log_return': np.float32(0.1289899), 'xagusd_log_return': np.float32(0.10608033), 'xtiusd_log_return': np.float32(0.10459125), 'synth_vix_zscore': np.float32(0.12509644)}
[2026-05-15 01:22:58,012 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:22:58,014 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.13686, 0.71017) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:58,112 INFO] src.backtester: Backtest [H1]: Sharpe=-4.261 | MaxDD=0.155 | WR=0.218 | Return=-13.9% | Trades=174
[2026-05-15 01:22:58,112 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:58,278 INFO] src.engine_xgb: XGB Train Acc: 0.6790 | Test Acc: 0.6790
[2026-05-15 01:22:58,279 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11881961), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.1253703), 'atr_normalized': np.float32(0.112313546), 'prev_log_return': np.float32(0.12401389), 'usdchf_log_return': np.float32(0.123284385), 'xagusd_log_return': np.float32(0.13042621), 'xtiusd_log_return': np.float32(0.12837404), 'synth_vix_zscore': np.float32(0.13739805)}
[2026-05-15 01:22:58,279 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:22:58,418 INFO] src.engine_xgb: XGB Train Acc: 0.6814 | Test Acc: 0.6814
[2026-05-15 01:22:58,419 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13629639), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11805515), 'atr_normalized': np.float32(0.12787582), 'prev_log_return': np.float32(0.12400655), 'usdchf_log_return': np.float32(0.12351504), 'xagusd_log_return': np.float32(0.11828947), 'xtiusd_log_return': np.float32(0.13348052), 'synth_vix_zscore': np.float32(0.11848109)}
[2026-05-15 01:22:58,419 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:22:58,556 INFO] src.engine_xgb: XGB Train Acc: 0.6813 | Test Acc: 0.6813
[2026-05-15 01:22:58,556 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11344582), 'gmm_vol_cluster': np.float32(0.12217265), 'rsi_slope': np.float32(0.108574554), 'atr_normalized': np.float32(0.11103842), 'prev_log_return': np.float32(0.112795256), 'usdchf_log_return': np.float32(0.107309975), 'xagusd_log_return': np.float32(0.10299355), 'xtiusd_log_return': np.float32(0.112734325), 'synth_vix_zscore': np.float32(0.10893554)}
[2026-05-15 01:22:58,557 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:22:58,558 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.51565, 0.29314) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:58,664 INFO] src.backtester: Backtest [H1]: Sharpe=-3.923 | MaxDD=0.208 | WR=0.263 | Return=-17.9% | Trades=175
[2026-05-15 01:22:58,664 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:58,824 INFO] src.engine_xgb: XGB Train Acc: 0.6755 | Test Acc: 0.6755
[2026-05-15 01:22:58,824 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13554278), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12391371), 'atr_normalized': np.float32(0.12084188), 'prev_log_return': np.float32(0.12095683), 'usdchf_log_return': np.float32(0.12754491), 'xagusd_log_return': np.float32(0.12616904), 'xtiusd_log_return': np.float32(0.12804547), 'synth_vix_zscore': np.float32(0.11698538)}
[2026-05-15 01:22:58,825 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:22:58,982 INFO] src.engine_xgb: XGB Train Acc: 0.6865 | Test Acc: 0.6865
[2026-05-15 01:22:58,983 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11377402), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13010928), 'atr_normalized': np.float32(0.1308801), 'prev_log_return': np.float32(0.1312661), 'usdchf_log_return': np.float32(0.12720993), 'xagusd_log_return': np.float32(0.11673932), 'xtiusd_log_return': np.float32(0.12645844), 'synth_vix_zscore': np.float32(0.12356275)}
[2026-05-15 01:22:58,983 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:22:59,136 INFO] src.engine_xgb: XGB Train Acc: 0.6951 | Test Acc: 0.6951
[2026-05-15 01:22:59,137 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11250447), 'gmm_vol_cluster': np.float32(0.11400182), 'rsi_slope': np.float32(0.11627958), 'atr_normalized': np.float32(0.11680343), 'prev_log_return': np.float32(0.11271163), 'usdchf_log_return': np.float32(0.11241101), 'xagusd_log_return': np.float32(0.098142564), 'xtiusd_log_return': np.float32(0.10566484), 'synth_vix_zscore': np.float32(0.11148066)}
[2026-05-15 01:22:59,137 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:22:59,138 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.46960, 0.34543) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:22:59,224 INFO] src.backtester: Backtest [H1]: Sharpe=-4.711 | MaxDD=0.194 | WR=0.269 | Return=-16.1% | Trades=145
[2026-05-15 01:22:59,225 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:22:59,237 INFO] src.optimizer: WFO [H1] window start=38880: trades=145 sharpe=-4.711 cv_sharpe=-4.092 score=-50.000
[2026-05-15 01:23:00,815 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:23:00,815 INFO] src.engine_hmm: Bull Bear Chop_Low Chop_High
[2026-05-15 01:23:00,816 INFO] src.engine_hmm: Bull 0.9775 0.0000 0.0171 0.0054
[2026-05-15 01:23:00,816 INFO] src.engine_hmm: Bear 0.0000 0.9697 0.0225 0.0077
[2026-05-15 01:23:00,816 INFO] src.engine_hmm: Chop_Low 0.0147 0.0161 0.9657 0.0035
[2026-05-15 01:23:00,816 INFO] src.engine_hmm: Chop_High 0.0111 0.0180 0.0006 0.9703
[2026-05-15 01:23:00,816 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:23:00,816 INFO] src.engine_hmm: Bull: return=1.048028, vol=-0.071790, rsi_slope=-0.032613
[2026-05-15 01:23:00,816 INFO] src.engine_hmm: Bear: return=-0.734143, vol=-0.226133, rsi_slope=0.043057
[2026-05-15 01:23:00,817 INFO] src.engine_hmm: Chop_Low: return=0.044149, vol=-0.529090, rsi_slope=-0.001920
[2026-05-15 01:23:00,817 INFO] src.engine_hmm: Chop_High: return=-0.718431, vol=1.569642, rsi_slope=-0.010538
[2026-05-15 01:23:00,817 INFO] src.engine_hmm: Total regime transitions: 300
[2026-05-15 01:23:00,817 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-21 21:00:00: Bear -> Chop_Low
[2026-05-15 01:23:00,817 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-23 16:00:00: Chop_Low -> Bull
[2026-05-15 01:23:00,818 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-24 14:00:00: Bull -> Chop_Low
[2026-05-15 01:23:00,818 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-29 17:00:00: Chop_Low -> Bull
[2026-05-15 01:23:00,818 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-31 12:00:00: Bull -> Chop_Low
[2026-05-15 01:23:00,818 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-05 11:00:00: Chop_Low -> Bear
[2026-05-15 01:23:00,818 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-08 03:00:00: Bear -> Chop_Low
[2026-05-15 01:23:00,819 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-08 18:00:00: Chop_Low -> Bear
[2026-05-15 01:23:00,819 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-11 05:00:00: Bear -> Chop_Low
[2026-05-15 01:23:00,819 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-12 10:00:00: Chop_Low -> Bear
[2026-05-15 01:23:00,834 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:23:00,841 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:23:00,922 INFO] src.engine_xgb: XGB Train Acc: 0.6810 | Test Acc: 0.6810
[2026-05-15 01:23:00,922 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11170528), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12713227), 'atr_normalized': np.float32(0.12121922), 'prev_log_return': np.float32(0.13072121), 'usdchf_log_return': np.float32(0.12747134), 'xagusd_log_return': np.float32(0.12573004), 'xtiusd_log_return': np.float32(0.13151965), 'synth_vix_zscore': np.float32(0.124501094)}
[2026-05-15 01:23:00,922 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:23:01,009 INFO] src.engine_xgb: XGB Train Acc: 0.6859 | Test Acc: 0.6859
[2026-05-15 01:23:01,009 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10566091), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.114340484), 'atr_normalized': np.float32(0.13566965), 'prev_log_return': np.float32(0.09081011), 'usdchf_log_return': np.float32(0.118678614), 'xagusd_log_return': np.float32(0.13397479), 'xtiusd_log_return': np.float32(0.14856365), 'synth_vix_zscore': np.float32(0.15230185)}
[2026-05-15 01:23:01,010 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:23:01,101 INFO] src.engine_xgb: XGB Train Acc: 0.6555 | Test Acc: 0.6555
[2026-05-15 01:23:01,101 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10565444), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.106565006), 'atr_normalized': np.float32(0.12413808), 'prev_log_return': np.float32(0.12794383), 'usdchf_log_return': np.float32(0.13074456), 'xagusd_log_return': np.float32(0.12719254), 'xtiusd_log_return': np.float32(0.15784903), 'synth_vix_zscore': np.float32(0.119912565)}
[2026-05-15 01:23:01,101 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:23:01,102 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.73608, -0.15122) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:01,200 INFO] src.backtester: Backtest [H1]: Sharpe=-2.811 | MaxDD=0.166 | WR=0.326 | Return=-13.3% | Trades=172
[2026-05-15 01:23:01,200 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:01,343 INFO] src.engine_xgb: XGB Train Acc: 0.6863 | Test Acc: 0.6863
[2026-05-15 01:23:01,343 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.116251424), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13155796), 'atr_normalized': np.float32(0.12660539), 'prev_log_return': np.float32(0.12565574), 'usdchf_log_return': np.float32(0.13072333), 'xagusd_log_return': np.float32(0.124380395), 'xtiusd_log_return': np.float32(0.12670074), 'synth_vix_zscore': np.float32(0.118125014)}
[2026-05-15 01:23:01,343 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:23:01,504 INFO] src.engine_xgb: XGB Train Acc: 0.6872 | Test Acc: 0.6872
[2026-05-15 01:23:01,505 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12032273), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.120060995), 'atr_normalized': np.float32(0.13123927), 'prev_log_return': np.float32(0.13252975), 'usdchf_log_return': np.float32(0.1180857), 'xagusd_log_return': np.float32(0.1185139), 'xtiusd_log_return': np.float32(0.124469735), 'synth_vix_zscore': np.float32(0.1347779)}
[2026-05-15 01:23:01,505 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:23:01,665 INFO] src.engine_xgb: XGB Train Acc: 0.7031 | Test Acc: 0.7031
[2026-05-15 01:23:01,665 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13875599), 'gmm_vol_cluster': np.float32(0.08513383), 'rsi_slope': np.float32(0.115890995), 'atr_normalized': np.float32(0.116504334), 'prev_log_return': np.float32(0.100879624), 'usdchf_log_return': np.float32(0.10375206), 'xagusd_log_return': np.float32(0.117690705), 'xtiusd_log_return': np.float32(0.109932855), 'synth_vix_zscore': np.float32(0.1114596)}
[2026-05-15 01:23:01,666 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:23:01,667 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53526, 0.16378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:01,777 INFO] src.backtester: Backtest [H1]: Sharpe=-1.052 | MaxDD=0.080 | WR=0.349 | Return=-4.7% | Trades=172
[2026-05-15 01:23:01,778 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:01,949 INFO] src.engine_xgb: XGB Train Acc: 0.6859 | Test Acc: 0.6859
[2026-05-15 01:23:01,949 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13291973), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11626466), 'atr_normalized': np.float32(0.1194263), 'prev_log_return': np.float32(0.13194183), 'usdchf_log_return': np.float32(0.13058288), 'xagusd_log_return': np.float32(0.11707058), 'xtiusd_log_return': np.float32(0.1249498), 'synth_vix_zscore': np.float32(0.12684421)}
[2026-05-15 01:23:01,950 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:23:02,108 INFO] src.engine_xgb: XGB Train Acc: 0.7014 | Test Acc: 0.7014
[2026-05-15 01:23:02,109 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11525978), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.129591), 'atr_normalized': np.float32(0.12926), 'prev_log_return': np.float32(0.11813577), 'usdchf_log_return': np.float32(0.13308156), 'xagusd_log_return': np.float32(0.12756428), 'xtiusd_log_return': np.float32(0.121626176), 'synth_vix_zscore': np.float32(0.1254814)}
[2026-05-15 01:23:02,109 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:23:02,264 INFO] src.engine_xgb: XGB Train Acc: 0.7011 | Test Acc: 0.7011
[2026-05-15 01:23:02,265 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12668118), 'gmm_vol_cluster': np.float32(0.09983008), 'rsi_slope': np.float32(0.106908545), 'atr_normalized': np.float32(0.11100792), 'prev_log_return': np.float32(0.10580836), 'usdchf_log_return': np.float32(0.108280525), 'xagusd_log_return': np.float32(0.12023198), 'xtiusd_log_return': np.float32(0.112521514), 'synth_vix_zscore': np.float32(0.10872981)}
[2026-05-15 01:23:02,265 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:23:02,266 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.43440, 0.22813) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:02,354 INFO] src.backtester: Backtest [H1]: Sharpe=-1.449 | MaxDD=0.141 | WR=0.266 | Return=-7.1% | Trades=128
[2026-05-15 01:23:02,355 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:02,368 INFO] src.optimizer: WFO [H1] window start=43200: trades=128 sharpe=-1.449 cv_sharpe=-1.932 score=-0.500
[2026-05-15 01:23:02,369 INFO] src.optimizer: WFO [H1]: 6/8 valid | median_trades=132 | score=-1.632 | std_sharpe=1.929 | WFE=1.07 | window_scores=[1.096, -1.0, -0.5, -0.5, -50.0, -0.5, -50.0, -0.5]
[2026-05-15 01:23:02,417 INFO] src.optimizer: Trial 36 [H1/headway_cent $15 standard]: score=-2.096 | valid=6/8 | std_sharpe=1.929 | median_trades=132 | WFE=1.07 | scores=[1.096, -1.0, -0.5, -0.5, -50.0, -0.5, -50.0, -0.5]
Best trial: 23. Best value: -0.320363: 18%|████████████▌ | 37/200 [21:01<1:26:29, 31.84s/it][2026-05-15 01:23:04,224 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:23:04,225 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:23:04,225 INFO] src.engine_hmm: Bull 0.9765 0.0020 0.0215
[2026-05-15 01:23:04,225 INFO] src.engine_hmm: Bear 0.0062 0.9730 0.0208
[2026-05-15 01:23:04,225 INFO] src.engine_hmm: Chop 0.0138 0.0269 0.9594
[2026-05-15 01:23:04,226 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:23:04,226 INFO] src.engine_hmm: Bull: return=0.103526, vol=1.182481, rsi_slope=-0.000874
[2026-05-15 01:23:04,226 INFO] src.engine_hmm: Bear: return=-0.060085, vol=-0.786722, rsi_slope=-0.010790
[2026-05-15 01:23:04,226 INFO] src.engine_hmm: Chop: return=-0.025957, vol=-0.189968, rsi_slope=0.012201
[2026-05-15 01:23:04,226 INFO] src.engine_hmm: Total regime transitions: 305
[2026-05-15 01:23:04,227 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-25 14:00:00: Bear -> Chop
[2026-05-15 01:23:04,227 INFO] src.engine_hmm: REGIME CHANGE at 2018-06-28 12:00:00: Chop -> Bear
[2026-05-15 01:23:04,227 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-03 04:00:00: Bear -> Chop
[2026-05-15 01:23:04,227 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-05 05:00:00: Chop -> Bear
[2026-05-15 01:23:04,228 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-10 14:00:00: Bear -> Bull
[2026-05-15 01:23:04,228 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-11 08:00:00: Bull -> Chop
[2026-05-15 01:23:04,228 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-12 12:00:00: Chop -> Bear
[2026-05-15 01:23:04,228 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-13 15:00:00: Bear -> Bull
[2026-05-15 01:23:04,228 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-16 07:00:00: Bull -> Chop
[2026-05-15 01:23:04,229 INFO] src.engine_hmm: REGIME CHANGE at 2018-07-16 12:00:00: Chop -> Bear
[2026-05-15 01:23:04,244 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:23:04,252 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:23:04,497 INFO] src.engine_xgb: XGB Train Acc: 0.5941 | Test Acc: 0.5941
[2026-05-15 01:23:04,497 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12127936), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11413059), 'atr_normalized': np.float32(0.121521145), 'prev_log_return': np.float32(0.1311701), 'usdchf_log_return': np.float32(0.120255716), 'xagusd_log_return': np.float32(0.12916441), 'xtiusd_log_return': np.float32(0.1356388), 'synth_vix_zscore': np.float32(0.12683985)}
[2026-05-15 01:23:04,497 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:23:04,871 INFO] src.engine_xgb: XGB Train Acc: 0.6785 | Test Acc: 0.6785
[2026-05-15 01:23:04,871 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11861403), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14233214), 'atr_normalized': np.float32(0.11690908), 'prev_log_return': np.float32(0.11625466), 'usdchf_log_return': np.float32(0.12768027), 'xagusd_log_return': np.float32(0.12253938), 'xtiusd_log_return': np.float32(0.12196079), 'synth_vix_zscore': np.float32(0.13370965)}
[2026-05-15 01:23:04,872 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:23:05,235 INFO] src.engine_xgb: XGB Train Acc: 0.6006 | Test Acc: 0.6006
[2026-05-15 01:23:05,235 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11100181), 'gmm_vol_cluster': np.float32(0.07993384), 'rsi_slope': np.float32(0.13327646), 'atr_normalized': np.float32(0.11661425), 'prev_log_return': np.float32(0.10928907), 'usdchf_log_return': np.float32(0.11020581), 'xagusd_log_return': np.float32(0.11696047), 'xtiusd_log_return': np.float32(0.12076434), 'synth_vix_zscore': np.float32(0.10195397)}
[2026-05-15 01:23:05,236 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:23:05,237 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.38336, 0.21891) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:05,361 INFO] src.backtester: Backtest [H1]: Sharpe=-0.892 | MaxDD=0.081 | WR=0.338 | Return=-2.3% | Trades=65
[2026-05-15 01:23:05,361 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:05,721 INFO] src.engine_xgb: XGB Train Acc: 0.5169 | Test Acc: 0.5169
[2026-05-15 01:23:05,722 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.093108416), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12244903), 'atr_normalized': np.float32(0.13579333), 'prev_log_return': np.float32(0.12711892), 'usdchf_log_return': np.float32(0.13110603), 'xagusd_log_return': np.float32(0.12787983), 'xtiusd_log_return': np.float32(0.13750498), 'synth_vix_zscore': np.float32(0.12503949)}
[2026-05-15 01:23:05,722 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:23:06,059 INFO] src.engine_xgb: XGB Train Acc: 0.5214 | Test Acc: 0.5214
[2026-05-15 01:23:06,060 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09522864), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14074214), 'atr_normalized': np.float32(0.12067618), 'prev_log_return': np.float32(0.12680767), 'usdchf_log_return': np.float32(0.122526556), 'xagusd_log_return': np.float32(0.13665462), 'xtiusd_log_return': np.float32(0.12244221), 'synth_vix_zscore': np.float32(0.13492201)}
[2026-05-15 01:23:06,060 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:23:06,409 INFO] src.engine_xgb: XGB Train Acc: 0.5271 | Test Acc: 0.5271
[2026-05-15 01:23:06,410 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09075994), 'gmm_vol_cluster': np.float32(0.10728907), 'rsi_slope': np.float32(0.123190254), 'atr_normalized': np.float32(0.11101341), 'prev_log_return': np.float32(0.10492434), 'usdchf_log_return': np.float32(0.11583071), 'xagusd_log_return': np.float32(0.11850318), 'xtiusd_log_return': np.float32(0.11991371), 'synth_vix_zscore': np.float32(0.10857535)}
[2026-05-15 01:23:06,410 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:23:06,412 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53107, 0.07740) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:06,530 INFO] src.backtester: Backtest [H1]: Sharpe=-1.924 | MaxDD=0.163 | WR=0.312 | Return=-10.6% | Trades=64
[2026-05-15 01:23:06,531 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:06,887 INFO] src.engine_xgb: XGB Train Acc: 0.5050 | Test Acc: 0.5050
[2026-05-15 01:23:06,888 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11819089), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12719625), 'atr_normalized': np.float32(0.12753567), 'prev_log_return': np.float32(0.121449165), 'usdchf_log_return': np.float32(0.12068095), 'xagusd_log_return': np.float32(0.12740377), 'xtiusd_log_return': np.float32(0.1333335), 'synth_vix_zscore': np.float32(0.124209814)}
[2026-05-15 01:23:06,888 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:23:07,293 INFO] src.engine_xgb: XGB Train Acc: 0.5114 | Test Acc: 0.5114
[2026-05-15 01:23:07,294 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.098397836), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14839105), 'atr_normalized': np.float32(0.1190126), 'prev_log_return': np.float32(0.113025025), 'usdchf_log_return': np.float32(0.13319173), 'xagusd_log_return': np.float32(0.12753773), 'xtiusd_log_return': np.float32(0.13029553), 'synth_vix_zscore': np.float32(0.13014853)}
[2026-05-15 01:23:07,294 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:23:07,673 INFO] src.engine_xgb: XGB Train Acc: 0.5007 | Test Acc: 0.5007
[2026-05-15 01:23:07,673 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.107975274), 'gmm_vol_cluster': np.float32(0.07233592), 'rsi_slope': np.float32(0.13916504), 'atr_normalized': np.float32(0.10831947), 'prev_log_return': np.float32(0.100495055), 'usdchf_log_return': np.float32(0.11009822), 'xagusd_log_return': np.float32(0.11836144), 'xtiusd_log_return': np.float32(0.11682092), 'synth_vix_zscore': np.float32(0.12642865)}
[2026-05-15 01:23:07,674 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:23:07,675 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.38300, 0.44275) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:07,768 INFO] src.backtester: Backtest [H1]: Sharpe=-1.483 | MaxDD=0.168 | WR=0.304 | Return=-10.9% | Trades=46
[2026-05-15 01:23:07,768 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:07,781 INFO] src.optimizer: WFO [H1] window start=12960: trades=46 sharpe=-1.483 cv_sharpe=-1.408 score=-50.000
[2026-05-15 01:23:08,334 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:23:08,334 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:23:08,334 INFO] src.engine_hmm: Bull 0.9753 0.0000 0.0247
[2026-05-15 01:23:08,334 INFO] src.engine_hmm: Bear 0.0000 0.9863 0.0137
[2026-05-15 01:23:08,335 INFO] src.engine_hmm: Chop 0.0076 0.0153 0.9771
[2026-05-15 01:23:08,335 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:23:08,335 INFO] src.engine_hmm: Bull: return=0.287757, vol=1.859302, rsi_slope=-0.025528
[2026-05-15 01:23:08,335 INFO] src.engine_hmm: Bear: return=-0.070229, vol=-0.652569, rsi_slope=0.011082
[2026-05-15 01:23:08,335 INFO] src.engine_hmm: Chop: return=-0.009785, vol=0.161117, rsi_slope=-0.004607
[2026-05-15 01:23:08,335 INFO] src.engine_hmm: Total regime transitions: 193
[2026-05-15 01:23:08,336 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-20 20:00:00: Bear -> Chop
[2026-05-15 01:23:08,336 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-21 21:00:00: Chop -> Bear
[2026-05-15 01:23:08,336 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-28 15:00:00: Bear -> Chop
[2026-05-15 01:23:08,336 INFO] src.engine_hmm: REGIME CHANGE at 2019-03-29 13:00:00: Chop -> Bear
[2026-05-15 01:23:08,336 INFO] src.engine_hmm: REGIME CHANGE at 2019-05-13 15:00:00: Bear -> Chop
[2026-05-15 01:23:08,337 INFO] src.engine_hmm: REGIME CHANGE at 2019-05-14 12:00:00: Chop -> Bear
[2026-05-15 01:23:08,337 INFO] src.engine_hmm: REGIME CHANGE at 2019-05-31 17:00:00: Bear -> Chop
[2026-05-15 01:23:08,337 INFO] src.engine_hmm: REGIME CHANGE at 2019-06-04 17:00:00: Chop -> Bear
[2026-05-15 01:23:08,337 INFO] src.engine_hmm: REGIME CHANGE at 2019-06-05 09:00:00: Bear -> Chop
[2026-05-15 01:23:08,337 INFO] src.engine_hmm: REGIME CHANGE at 2019-06-06 13:00:00: Chop -> Bear
[2026-05-15 01:23:08,354 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:23:08,363 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:23:08,630 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-15 01:23:08,630 INFO] src.engine_xgb: XGB Train Acc: 0.5659 | Test Acc: 0.5659
[2026-05-15 01:23:08,631 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.14769575), 'atr_normalized': np.float32(0.14491268), 'prev_log_return': np.float32(0.13391303), 'usdchf_log_return': np.float32(0.14374204), 'xagusd_log_return': np.float32(0.13328016), 'xtiusd_log_return': np.float32(0.1432718), 'synth_vix_zscore': np.float32(0.1531845)}
[2026-05-15 01:23:08,631 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:23:08,921 INFO] src.engine_xgb: XGB Train Acc: 0.6230 | Test Acc: 0.6230
[2026-05-15 01:23:08,922 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.095653675), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12696742), 'atr_normalized': np.float32(0.13866138), 'prev_log_return': np.float32(0.120374694), 'usdchf_log_return': np.float32(0.12966959), 'xagusd_log_return': np.float32(0.124792255), 'xtiusd_log_return': np.float32(0.14192522), 'synth_vix_zscore': np.float32(0.12195585)}
[2026-05-15 01:23:08,922 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:23:09,218 INFO] src.engine_xgb: XGB Train Acc: 0.6159 | Test Acc: 0.6159
[2026-05-15 01:23:09,218 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10470814), 'gmm_vol_cluster': np.float32(0.07923349), 'rsi_slope': np.float32(0.12110932), 'atr_normalized': np.float32(0.10570068), 'prev_log_return': np.float32(0.11490088), 'usdchf_log_return': np.float32(0.12528229), 'xagusd_log_return': np.float32(0.11386177), 'xtiusd_log_return': np.float32(0.123703845), 'synth_vix_zscore': np.float32(0.111499585)}
[2026-05-15 01:23:09,218 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:23:09,221 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.50441, -0.08685) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:09,336 INFO] src.backtester: Backtest [H1]: Sharpe=-1.996 | MaxDD=0.179 | WR=0.346 | Return=-12.5% | Trades=52
[2026-05-15 01:23:09,337 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:09,728 INFO] src.engine_xgb: XGB Train Acc: 0.5274 | Test Acc: 0.5274
[2026-05-15 01:23:09,729 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12849675), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12942676), 'atr_normalized': np.float32(0.11656995), 'prev_log_return': np.float32(0.1107329), 'usdchf_log_return': np.float32(0.12398868), 'xagusd_log_return': np.float32(0.13013323), 'xtiusd_log_return': np.float32(0.11409684), 'synth_vix_zscore': np.float32(0.14655489)}
[2026-05-15 01:23:09,729 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:23:10,069 INFO] src.engine_xgb: XGB Train Acc: 0.5198 | Test Acc: 0.5198
[2026-05-15 01:23:10,069 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11273194), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12391042), 'atr_normalized': np.float32(0.1372106), 'prev_log_return': np.float32(0.11741792), 'usdchf_log_return': np.float32(0.13188736), 'xagusd_log_return': np.float32(0.12947287), 'xtiusd_log_return': np.float32(0.12728472), 'synth_vix_zscore': np.float32(0.120084174)}
[2026-05-15 01:23:10,070 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:23:10,443 INFO] src.engine_xgb: XGB Train Acc: 0.5144 | Test Acc: 0.5144
[2026-05-15 01:23:10,443 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10553208), 'gmm_vol_cluster': np.float32(0.07908737), 'rsi_slope': np.float32(0.13655058), 'atr_normalized': np.float32(0.100004345), 'prev_log_return': np.float32(0.10387476), 'usdchf_log_return': np.float32(0.11394382), 'xagusd_log_return': np.float32(0.12467865), 'xtiusd_log_return': np.float32(0.1214806), 'synth_vix_zscore': np.float32(0.11484782)}
[2026-05-15 01:23:10,444 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:23:10,445 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.49357, -0.10582) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:10,566 INFO] src.backtester: Backtest [H1]: Sharpe=0.132 | MaxDD=0.084 | WR=0.446 | Return=0.9% | Trades=74
[2026-05-15 01:23:10,567 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:10,937 INFO] src.engine_xgb: XGB Train Acc: 0.5265 | Test Acc: 0.5265
[2026-05-15 01:23:10,937 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1520502), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11257011), 'atr_normalized': np.float32(0.11763855), 'prev_log_return': np.float32(0.11813701), 'usdchf_log_return': np.float32(0.12528646), 'xagusd_log_return': np.float32(0.12691002), 'xtiusd_log_return': np.float32(0.11533991), 'synth_vix_zscore': np.float32(0.1320677)}
[2026-05-15 01:23:10,939 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:23:11,302 INFO] src.engine_xgb: XGB Train Acc: 0.5156 | Test Acc: 0.5156
[2026-05-15 01:23:11,303 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09203538), 'gmm_vol_cluster': np.float32(0.11508253), 'rsi_slope': np.float32(0.12196046), 'atr_normalized': np.float32(0.10832), 'prev_log_return': np.float32(0.10890697), 'usdchf_log_return': np.float32(0.11786989), 'xagusd_log_return': np.float32(0.11455245), 'xtiusd_log_return': np.float32(0.11125253), 'synth_vix_zscore': np.float32(0.11001976)}
[2026-05-15 01:23:11,303 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:23:11,718 INFO] src.engine_xgb: XGB Train Acc: 0.5047 | Test Acc: 0.5047
[2026-05-15 01:23:11,718 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09666286), 'gmm_vol_cluster': np.float32(0.087215714), 'rsi_slope': np.float32(0.12672523), 'atr_normalized': np.float32(0.11368498), 'prev_log_return': np.float32(0.10235552), 'usdchf_log_return': np.float32(0.1145061), 'xagusd_log_return': np.float32(0.12525687), 'xtiusd_log_return': np.float32(0.11963824), 'synth_vix_zscore': np.float32(0.11395445)}
[2026-05-15 01:23:11,719 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:23:11,720 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.36542, 0.20284) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:11,820 INFO] src.backtester: Backtest [H1]: Sharpe=-1.112 | MaxDD=0.069 | WR=0.404 | Return=-3.7% | Trades=47
[2026-05-15 01:23:11,821 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:11,835 INFO] src.optimizer: WFO [H1] window start=17280: trades=47 sharpe=-1.112 cv_sharpe=-0.932 score=-1.000
[2026-05-15 01:23:12,648 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:23:12,649 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:23:12,649 INFO] src.engine_hmm: Bull 0.9669 0.0094 0.0238
[2026-05-15 01:23:12,649 INFO] src.engine_hmm: Bear 0.0242 0.9735 0.0023
[2026-05-15 01:23:12,649 INFO] src.engine_hmm: Chop 0.0181 0.0058 0.9761
[2026-05-15 01:23:12,649 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:23:12,649 INFO] src.engine_hmm: Bull: return=0.305337, vol=-0.053657, rsi_slope=0.005489
[2026-05-15 01:23:12,650 INFO] src.engine_hmm: Bear: return=-0.322472, vol=1.276269, rsi_slope=0.006640
[2026-05-15 01:23:12,650 INFO] src.engine_hmm: Chop: return=-0.111466, vol=-0.656836, rsi_slope=-0.008901
[2026-05-15 01:23:12,650 INFO] src.engine_hmm: Total regime transitions: 274
[2026-05-15 01:23:12,650 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 15:00:00: Chop -> Bear
[2026-05-15 01:23:12,651 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-12 17:00:00: Bear -> Bull
[2026-05-15 01:23:12,651 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-13 13:00:00: Bull -> Chop
[2026-05-15 01:23:12,651 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-24 18:00:00: Chop -> Bull
[2026-05-15 01:23:12,652 INFO] src.engine_hmm: REGIME CHANGE at 2019-12-27 08:00:00: Bull -> Chop
[2026-05-15 01:23:12,652 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-03 03:00:00: Chop -> Bull
[2026-05-15 01:23:12,652 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 01:00:00: Bull -> Bear
[2026-05-15 01:23:12,652 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-06 21:00:00: Bear -> Bull
[2026-05-15 01:23:12,652 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-08 01:00:00: Bull -> Bear
[2026-05-15 01:23:12,653 INFO] src.engine_hmm: REGIME CHANGE at 2020-01-09 15:00:00: Bear -> Bull
[2026-05-15 01:23:12,671 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:23:12,682 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:23:12,978 INFO] src.engine_xgb: XGB Train Acc: 0.5795 | Test Acc: 0.5795
[2026-05-15 01:23:12,979 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13778627), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12069389), 'atr_normalized': np.float32(0.11795023), 'prev_log_return': np.float32(0.11819444), 'usdchf_log_return': np.float32(0.1273148), 'xagusd_log_return': np.float32(0.13335666), 'xtiusd_log_return': np.float32(0.12916096), 'synth_vix_zscore': np.float32(0.11554279)}
[2026-05-15 01:23:12,979 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:23:13,273 INFO] src.engine_xgb: XGB Train Acc: 0.5759 | Test Acc: 0.5759
[2026-05-15 01:23:13,273 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10249531), 'gmm_vol_cluster': np.float32(0.10756795), 'rsi_slope': np.float32(0.11705899), 'atr_normalized': np.float32(0.12019751), 'prev_log_return': np.float32(0.10517696), 'usdchf_log_return': np.float32(0.1097789), 'xagusd_log_return': np.float32(0.11424521), 'xtiusd_log_return': np.float32(0.108537965), 'synth_vix_zscore': np.float32(0.11494115)}
[2026-05-15 01:23:13,273 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:23:13,612 INFO] src.engine_xgb: XGB Train Acc: 0.5650 | Test Acc: 0.5650
[2026-05-15 01:23:13,613 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11463873), 'gmm_vol_cluster': np.float32(0.094036944), 'rsi_slope': np.float32(0.1209296), 'atr_normalized': np.float32(0.112149015), 'prev_log_return': np.float32(0.10200319), 'usdchf_log_return': np.float32(0.10742839), 'xagusd_log_return': np.float32(0.1134756), 'xtiusd_log_return': np.float32(0.118391216), 'synth_vix_zscore': np.float32(0.11694736)}
[2026-05-15 01:23:13,613 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:23:13,614 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.54544, 0.24324) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:13,740 INFO] src.backtester: Backtest [H1]: Sharpe=-2.120 | MaxDD=0.184 | WR=0.365 | Return=-10.7% | Trades=104
[2026-05-15 01:23:13,740 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:14,131 INFO] src.engine_xgb: XGB Train Acc: 0.5399 | Test Acc: 0.5399
[2026-05-15 01:23:14,131 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.13990758), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12539418), 'atr_normalized': np.float32(0.11741797), 'prev_log_return': np.float32(0.12552671), 'usdchf_log_return': np.float32(0.12335144), 'xagusd_log_return': np.float32(0.12680303), 'xtiusd_log_return': np.float32(0.12263869), 'synth_vix_zscore': np.float32(0.11896042)}
[2026-05-15 01:23:14,132 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:23:14,487 INFO] src.engine_xgb: XGB Train Acc: 0.5370 | Test Acc: 0.5370
[2026-05-15 01:23:14,488 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10660986), 'gmm_vol_cluster': np.float32(0.11060829), 'rsi_slope': np.float32(0.11520682), 'atr_normalized': np.float32(0.107868016), 'prev_log_return': np.float32(0.111531936), 'usdchf_log_return': np.float32(0.11127443), 'xagusd_log_return': np.float32(0.11683026), 'xtiusd_log_return': np.float32(0.10623918), 'synth_vix_zscore': np.float32(0.113831244)}
[2026-05-15 01:23:14,488 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:23:14,850 INFO] src.engine_xgb: XGB Train Acc: 0.5220 | Test Acc: 0.5220
[2026-05-15 01:23:14,850 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10415202), 'gmm_vol_cluster': np.float32(0.09472489), 'rsi_slope': np.float32(0.11555655), 'atr_normalized': np.float32(0.11842317), 'prev_log_return': np.float32(0.10060603), 'usdchf_log_return': np.float32(0.108861595), 'xagusd_log_return': np.float32(0.1184531), 'xtiusd_log_return': np.float32(0.11936461), 'synth_vix_zscore': np.float32(0.11985801)}
[2026-05-15 01:23:14,850 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:23:14,852 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.48586, 0.08539) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:14,979 INFO] src.backtester: Backtest [H1]: Sharpe=-2.608 | MaxDD=0.177 | WR=0.263 | Return=-12.3% | Trades=76
[2026-05-15 01:23:14,980 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:15,378 INFO] src.engine_xgb: XGB Train Acc: 0.5258 | Test Acc: 0.5258
[2026-05-15 01:23:15,379 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11434801), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13534059), 'atr_normalized': np.float32(0.12457774), 'prev_log_return': np.float32(0.12415989), 'usdchf_log_return': np.float32(0.12819682), 'xagusd_log_return': np.float32(0.13813017), 'xtiusd_log_return': np.float32(0.1197346), 'synth_vix_zscore': np.float32(0.11551221)}
[2026-05-15 01:23:15,379 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:23:15,774 INFO] src.engine_xgb: XGB Train Acc: 0.5260 | Test Acc: 0.5260
[2026-05-15 01:23:15,774 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1366634), 'gmm_vol_cluster': np.float32(0.09776415), 'rsi_slope': np.float32(0.118679605), 'atr_normalized': np.float32(0.10844177), 'prev_log_return': np.float32(0.10625915), 'usdchf_log_return': np.float32(0.107486665), 'xagusd_log_return': np.float32(0.11757858), 'xtiusd_log_return': np.float32(0.10194971), 'synth_vix_zscore': np.float32(0.10517691)}
[2026-05-15 01:23:15,776 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:23:16,161 INFO] src.engine_xgb: XGB Train Acc: 0.5111 | Test Acc: 0.5111
[2026-05-15 01:23:16,162 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09942175), 'gmm_vol_cluster': np.float32(0.098273285), 'rsi_slope': np.float32(0.11798422), 'atr_normalized': np.float32(0.12165599), 'prev_log_return': np.float32(0.10241499), 'usdchf_log_return': np.float32(0.10849566), 'xagusd_log_return': np.float32(0.12095772), 'xtiusd_log_return': np.float32(0.1154418), 'synth_vix_zscore': np.float32(0.11535452)}
[2026-05-15 01:23:16,162 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:23:16,164 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.51495, -0.03378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:16,261 INFO] src.backtester: Backtest [H1]: Sharpe=-5.438 | MaxDD=0.169 | WR=0.240 | Return=-14.4% | Trades=75
[2026-05-15 01:23:16,261 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:16,275 INFO] src.optimizer: WFO [H1] window start=21600: trades=75 sharpe=-5.438 cv_sharpe=-2.364 score=-0.500
[2026-05-15 01:23:17,198 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:23:17,198 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:23:17,198 INFO] src.engine_hmm: Bull 0.9724 0.0083 0.0193
[2026-05-15 01:23:17,198 INFO] src.engine_hmm: Bear 0.0026 0.9626 0.0348
[2026-05-15 01:23:17,199 INFO] src.engine_hmm: Chop 0.0296 0.0078 0.9626
[2026-05-15 01:23:17,199 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:23:17,199 INFO] src.engine_hmm: Bull: return=0.141705, vol=-0.686931, rsi_slope=-0.010676
[2026-05-15 01:23:17,199 INFO] src.engine_hmm: Bear: return=-0.653749, vol=1.476033, rsi_slope=0.019382
[2026-05-15 01:23:17,199 INFO] src.engine_hmm: Chop: return=0.138604, vol=0.096961, rsi_slope=0.003122
[2026-05-15 01:23:17,199 INFO] src.engine_hmm: Total regime transitions: 333
[2026-05-15 01:23:17,200 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-07 17:00:00: Chop -> Bull
[2026-05-15 01:23:17,200 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-08 12:00:00: Bull -> Chop
[2026-05-15 01:23:17,200 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-08 19:00:00: Chop -> Bear
[2026-05-15 01:23:17,200 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 02:00:00: Bear -> Chop
[2026-05-15 01:23:17,200 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 13:00:00: Chop -> Bull
[2026-05-15 01:23:17,201 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-10 15:00:00: Bull -> Chop
[2026-05-15 01:23:17,201 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-15 12:00:00: Chop -> Bull
[2026-05-15 01:23:17,201 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-15 16:00:00: Bull -> Chop
[2026-05-15 01:23:17,201 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-16 13:00:00: Chop -> Bull
[2026-05-15 01:23:17,201 INFO] src.engine_hmm: REGIME CHANGE at 2020-09-17 04:00:00: Bull -> Chop
[2026-05-15 01:23:17,217 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:23:17,225 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:23:17,487 INFO] src.engine_xgb: XGB Train Acc: 0.6098 | Test Acc: 0.6098
[2026-05-15 01:23:17,487 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.090723224), 'gmm_vol_cluster': np.float32(0.07389073), 'rsi_slope': np.float32(0.113267004), 'atr_normalized': np.float32(0.122507624), 'prev_log_return': np.float32(0.1251243), 'usdchf_log_return': np.float32(0.11332492), 'xagusd_log_return': np.float32(0.12084021), 'xtiusd_log_return': np.float32(0.12043555), 'synth_vix_zscore': np.float32(0.11988647)}
[2026-05-15 01:23:17,488 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:23:17,815 INFO] src.engine_xgb: XGB Train Acc: 0.5990 | Test Acc: 0.5990
[2026-05-15 01:23:17,816 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08772738), 'gmm_vol_cluster': np.float32(0.11300332), 'rsi_slope': np.float32(0.11754195), 'atr_normalized': np.float32(0.12692258), 'prev_log_return': np.float32(0.10135234), 'usdchf_log_return': np.float32(0.112183), 'xagusd_log_return': np.float32(0.11327175), 'xtiusd_log_return': np.float32(0.113630556), 'synth_vix_zscore': np.float32(0.11436704)}
[2026-05-15 01:23:17,816 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:23:18,134 INFO] src.engine_xgb: XGB Train Acc: 0.6047 | Test Acc: 0.6047
[2026-05-15 01:23:18,134 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09171557), 'gmm_vol_cluster': np.float32(0.093362086), 'rsi_slope': np.float32(0.11951083), 'atr_normalized': np.float32(0.122488245), 'prev_log_return': np.float32(0.10549686), 'usdchf_log_return': np.float32(0.11675511), 'xagusd_log_return': np.float32(0.11706358), 'xtiusd_log_return': np.float32(0.10974329), 'synth_vix_zscore': np.float32(0.12386439)}
[2026-05-15 01:23:18,135 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:23:18,136 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.16146, 0.63340) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:18,257 INFO] src.backtester: Backtest [H1]: Sharpe=-2.411 | MaxDD=0.169 | WR=0.301 | Return=-10.9% | Trades=113
[2026-05-15 01:23:18,257 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:18,644 INFO] src.engine_xgb: XGB Train Acc: 0.5227 | Test Acc: 0.5227
[2026-05-15 01:23:18,645 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10100902), 'gmm_vol_cluster': np.float32(0.086002745), 'rsi_slope': np.float32(0.12544772), 'atr_normalized': np.float32(0.12364596), 'prev_log_return': np.float32(0.1164987), 'usdchf_log_return': np.float32(0.106978446), 'xagusd_log_return': np.float32(0.11771445), 'xtiusd_log_return': np.float32(0.11303261), 'synth_vix_zscore': np.float32(0.10967037)}
[2026-05-15 01:23:18,645 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:23:18,988 INFO] src.engine_xgb: XGB Train Acc: 0.5219 | Test Acc: 0.5219
[2026-05-15 01:23:18,988 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10000778), 'gmm_vol_cluster': np.float32(0.08800781), 'rsi_slope': np.float32(0.12797031), 'atr_normalized': np.float32(0.11841107), 'prev_log_return': np.float32(0.12006842), 'usdchf_log_return': np.float32(0.113701224), 'xagusd_log_return': np.float32(0.112354904), 'xtiusd_log_return': np.float32(0.1105383), 'synth_vix_zscore': np.float32(0.10894018)}
[2026-05-15 01:23:18,989 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:23:19,322 INFO] src.engine_xgb: XGB Train Acc: 0.5286 | Test Acc: 0.5286
[2026-05-15 01:23:19,323 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08028579), 'gmm_vol_cluster': np.float32(0.09344147), 'rsi_slope': np.float32(0.11495072), 'atr_normalized': np.float32(0.12863114), 'prev_log_return': np.float32(0.11032819), 'usdchf_log_return': np.float32(0.12100236), 'xagusd_log_return': np.float32(0.11987938), 'xtiusd_log_return': np.float32(0.10636689), 'synth_vix_zscore': np.float32(0.12511398)}
[2026-05-15 01:23:19,323 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:23:19,325 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47142, 0.22575) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:19,446 INFO] src.backtester: Backtest [H1]: Sharpe=-2.078 | MaxDD=0.154 | WR=0.369 | Return=-8.8% | Trades=84
[2026-05-15 01:23:19,446 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:19,863 INFO] src.engine_xgb: XGB Train Acc: 0.5012 | Test Acc: 0.5012
[2026-05-15 01:23:19,864 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12024352), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13537647), 'atr_normalized': np.float32(0.12870805), 'prev_log_return': np.float32(0.11921402), 'usdchf_log_return': np.float32(0.11555891), 'xagusd_log_return': np.float32(0.1273623), 'xtiusd_log_return': np.float32(0.12237182), 'synth_vix_zscore': np.float32(0.13116486)}
[2026-05-15 01:23:19,864 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:23:20,235 INFO] src.engine_xgb: XGB Train Acc: 0.5107 | Test Acc: 0.5107
[2026-05-15 01:23:20,235 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.097574905), 'gmm_vol_cluster': np.float32(0.104734495), 'rsi_slope': np.float32(0.12582338), 'atr_normalized': np.float32(0.12178238), 'prev_log_return': np.float32(0.12166386), 'usdchf_log_return': np.float32(0.11019011), 'xagusd_log_return': np.float32(0.10595942), 'xtiusd_log_return': np.float32(0.108857244), 'synth_vix_zscore': np.float32(0.10341416)}
[2026-05-15 01:23:20,236 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:23:20,649 INFO] src.engine_xgb: XGB Train Acc: 0.5165 | Test Acc: 0.5165
[2026-05-15 01:23:20,649 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.07775634), 'gmm_vol_cluster': np.float32(0.09510638), 'rsi_slope': np.float32(0.12220618), 'atr_normalized': np.float32(0.1271701), 'prev_log_return': np.float32(0.10444733), 'usdchf_log_return': np.float32(0.11344543), 'xagusd_log_return': np.float32(0.12479444), 'xtiusd_log_return': np.float32(0.10820368), 'synth_vix_zscore': np.float32(0.12687017)}
[2026-05-15 01:23:20,650 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:23:20,651 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.62208, 0.06248) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:20,748 INFO] src.backtester: Backtest [H1]: Sharpe=-5.690 | MaxDD=0.197 | WR=0.255 | Return=-16.8% | Trades=47
[2026-05-15 01:23:20,749 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:20,763 INFO] src.optimizer: WFO [H1] window start=25920: trades=47 sharpe=-5.690 cv_sharpe=-2.244 score=-50.000
[2026-05-15 01:23:22,029 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:23:22,030 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:23:22,030 INFO] src.engine_hmm: Bull 0.9595 0.0338 0.0067
[2026-05-15 01:23:22,030 INFO] src.engine_hmm: Bear 0.0175 0.9724 0.0101
[2026-05-15 01:23:22,030 INFO] src.engine_hmm: Chop 0.0274 0.0065 0.9661
[2026-05-15 01:23:22,030 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:23:22,031 INFO] src.engine_hmm: Bull: return=0.405450, vol=-0.036916, rsi_slope=-0.023897
[2026-05-15 01:23:22,031 INFO] src.engine_hmm: Bear: return=-0.283771, vol=-0.558129, rsi_slope=-0.002263
[2026-05-15 01:23:22,031 INFO] src.engine_hmm: Chop: return=-0.029699, vol=1.313583, rsi_slope=0.044376
[2026-05-15 01:23:22,031 INFO] src.engine_hmm: Total regime transitions: 323
[2026-05-15 01:23:22,031 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-03 16:00:00: Bear -> Chop
[2026-05-15 01:23:22,032 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 01:00:00: Chop -> Bull
[2026-05-15 01:23:22,032 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-07 12:00:00: Bull -> Bear
[2026-05-15 01:23:22,033 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-08 15:00:00: Bear -> Bull
[2026-05-15 01:23:22,033 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-09 11:00:00: Bull -> Bear
[2026-05-15 01:23:22,033 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 15:00:00: Bear -> Chop
[2026-05-15 01:23:22,033 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-10 16:00:00: Chop -> Bull
[2026-05-15 01:23:22,035 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-11 12:00:00: Bull -> Bear
[2026-05-15 01:23:22,035 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-14 09:00:00: Bear -> Chop
[2026-05-15 01:23:22,035 INFO] src.engine_hmm: REGIME CHANGE at 2021-06-14 17:00:00: Chop -> Bull
[2026-05-15 01:23:22,051 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:23:22,059 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:23:22,323 INFO] src.engine_xgb: XGB Train Acc: 0.6475 | Test Acc: 0.6475
[2026-05-15 01:23:22,324 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.124987334), 'gmm_vol_cluster': np.float32(0.10207526), 'rsi_slope': np.float32(0.11180809), 'atr_normalized': np.float32(0.11649093), 'prev_log_return': np.float32(0.11359526), 'usdchf_log_return': np.float32(0.11389272), 'xagusd_log_return': np.float32(0.10869167), 'xtiusd_log_return': np.float32(0.10224021), 'synth_vix_zscore': np.float32(0.10621863)}
[2026-05-15 01:23:22,324 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:23:22,639 INFO] src.engine_xgb: XGB Train Acc: 0.6524 | Test Acc: 0.6524
[2026-05-15 01:23:22,639 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.0787105), 'gmm_vol_cluster': np.float32(0.122606516), 'rsi_slope': np.float32(0.12206703), 'atr_normalized': np.float32(0.10579206), 'prev_log_return': np.float32(0.10736989), 'usdchf_log_return': np.float32(0.11869768), 'xagusd_log_return': np.float32(0.10466587), 'xtiusd_log_return': np.float32(0.11777566), 'synth_vix_zscore': np.float32(0.122314855)}
[2026-05-15 01:23:22,640 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:23:22,956 INFO] src.engine_xgb: XGB Train Acc: 0.5589 | Test Acc: 0.5589
[2026-05-15 01:23:22,957 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09498155), 'gmm_vol_cluster': np.float32(0.105912074), 'rsi_slope': np.float32(0.11523659), 'atr_normalized': np.float32(0.11504907), 'prev_log_return': np.float32(0.10645854), 'usdchf_log_return': np.float32(0.11788054), 'xagusd_log_return': np.float32(0.11196254), 'xtiusd_log_return': np.float32(0.11749304), 'synth_vix_zscore': np.float32(0.11502611)}
[2026-05-15 01:23:22,957 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:23:22,959 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.56732, -0.02191) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:23,071 INFO] src.backtester: Backtest [H1]: Sharpe=-3.725 | MaxDD=0.166 | WR=0.253 | Return=-14.0% | Trades=91
[2026-05-15 01:23:23,072 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:23,486 INFO] src.engine_xgb: XGB Train Acc: 0.5268 | Test Acc: 0.5268
[2026-05-15 01:23:23,487 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12244146), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12673953), 'atr_normalized': np.float32(0.12157151), 'prev_log_return': np.float32(0.11895476), 'usdchf_log_return': np.float32(0.11523977), 'xagusd_log_return': np.float32(0.13039982), 'xtiusd_log_return': np.float32(0.11951538), 'synth_vix_zscore': np.float32(0.14513776)}
[2026-05-15 01:23:23,487 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:23:23,924 INFO] src.engine_xgb: XGB Train Acc: 0.5188 | Test Acc: 0.5188
[2026-05-15 01:23:23,925 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.087680236), 'gmm_vol_cluster': np.float32(0.08955153), 'rsi_slope': np.float32(0.11682874), 'atr_normalized': np.float32(0.11709579), 'prev_log_return': np.float32(0.11289099), 'usdchf_log_return': np.float32(0.114685535), 'xagusd_log_return': np.float32(0.12540534), 'xtiusd_log_return': np.float32(0.11585786), 'synth_vix_zscore': np.float32(0.12000402)}
[2026-05-15 01:23:23,925 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:23:24,289 INFO] src.engine_xgb: XGB Train Acc: 0.5139 | Test Acc: 0.5139
[2026-05-15 01:23:24,290 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09879034), 'gmm_vol_cluster': np.float32(0.11275994), 'rsi_slope': np.float32(0.11462959), 'atr_normalized': np.float32(0.1080711), 'prev_log_return': np.float32(0.11679856), 'usdchf_log_return': np.float32(0.11110963), 'xagusd_log_return': np.float32(0.121365756), 'xtiusd_log_return': np.float32(0.107359976), 'synth_vix_zscore': np.float32(0.109115124)}
[2026-05-15 01:23:24,290 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:23:24,292 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47816, 0.15210) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:24,411 INFO] src.backtester: Backtest [H1]: Sharpe=-2.916 | MaxDD=0.157 | WR=0.321 | Return=-11.1% | Trades=81
[2026-05-15 01:23:24,411 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:24,796 INFO] src.engine_xgb: XGB Train Acc: 0.5022 | Test Acc: 0.5022
[2026-05-15 01:23:24,796 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1253487), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12499371), 'atr_normalized': np.float32(0.12399807), 'prev_log_return': np.float32(0.11024929), 'usdchf_log_return': np.float32(0.11919804), 'xagusd_log_return': np.float32(0.13272674), 'xtiusd_log_return': np.float32(0.13217609), 'synth_vix_zscore': np.float32(0.13130939)}
[2026-05-15 01:23:24,797 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:23:25,157 INFO] src.engine_xgb: XGB Train Acc: 0.4938 | Test Acc: 0.4938
[2026-05-15 01:23:25,157 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.096548565), 'gmm_vol_cluster': np.float32(0.116602845), 'rsi_slope': np.float32(0.11487988), 'atr_normalized': np.float32(0.11223625), 'prev_log_return': np.float32(0.10952111), 'usdchf_log_return': np.float32(0.11878706), 'xagusd_log_return': np.float32(0.12704368), 'xtiusd_log_return': np.float32(0.10508203), 'synth_vix_zscore': np.float32(0.09929858)}
[2026-05-15 01:23:25,158 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:23:25,566 INFO] src.engine_xgb: XGB Train Acc: 0.5050 | Test Acc: 0.5050
[2026-05-15 01:23:25,566 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09235255), 'gmm_vol_cluster': np.float32(0.106598146), 'rsi_slope': np.float32(0.11932446), 'atr_normalized': np.float32(0.1159055), 'prev_log_return': np.float32(0.12172606), 'usdchf_log_return': np.float32(0.1087364), 'xagusd_log_return': np.float32(0.11491797), 'xtiusd_log_return': np.float32(0.11296307), 'synth_vix_zscore': np.float32(0.10747586)}
[2026-05-15 01:23:25,567 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:23:25,568 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.40708, 0.22442) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:25,663 INFO] src.backtester: Backtest [H1]: Sharpe=-3.517 | MaxDD=0.131 | WR=0.321 | Return=-9.6% | Trades=56
[2026-05-15 01:23:25,664 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:25,679 INFO] src.optimizer: WFO [H1] window start=30240: trades=56 sharpe=-3.517 cv_sharpe=-3.320 score=-0.500
[2026-05-15 01:23:26,932 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:23:26,932 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:23:26,932 INFO] src.engine_hmm: Bull 0.9719 0.0151 0.0130
[2026-05-15 01:23:26,932 INFO] src.engine_hmm: Bear 0.0108 0.9597 0.0295
[2026-05-15 01:23:26,933 INFO] src.engine_hmm: Chop 0.0092 0.0166 0.9742
[2026-05-15 01:23:26,933 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:23:26,933 INFO] src.engine_hmm: Bull: return=0.410373, vol=1.282124, rsi_slope=0.003439
[2026-05-15 01:23:26,933 INFO] src.engine_hmm: Bear: return=-0.715289, vol=-0.110724, rsi_slope=0.007171
[2026-05-15 01:23:26,934 INFO] src.engine_hmm: Chop: return=0.215886, vol=-0.659229, rsi_slope=-0.006457
[2026-05-15 01:23:26,934 INFO] src.engine_hmm: Total regime transitions: 295
[2026-05-15 01:23:26,934 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-23 08:00:00: Bear -> Chop
[2026-05-15 01:23:26,935 INFO] src.engine_hmm: REGIME CHANGE at 2022-02-24 05:00:00: Chop -> Bull
[2026-05-15 01:23:26,935 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-03 06:00:00: Bull -> Bear
[2026-05-15 01:23:26,935 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-03 10:00:00: Bear -> Chop
[2026-05-15 01:23:26,936 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-04 02:00:00: Chop -> Bull
[2026-05-15 01:23:26,936 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-11 09:00:00: Bull -> Bear
[2026-05-15 01:23:26,936 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-11 15:00:00: Bear -> Bull
[2026-05-15 01:23:26,936 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-14 12:00:00: Bull -> Bear
[2026-05-15 01:23:26,936 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-15 07:00:00: Bear -> Bull
[2026-05-15 01:23:26,938 INFO] src.engine_hmm: REGIME CHANGE at 2022-03-16 09:00:00: Bull -> Bear
[2026-05-15 01:23:26,952 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:23:26,959 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:23:27,211 INFO] src.engine_xgb: XGB Train Acc: 0.5910 | Test Acc: 0.5910
[2026-05-15 01:23:27,211 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10388179), 'gmm_vol_cluster': np.float32(0.08050768), 'rsi_slope': np.float32(0.1059678), 'atr_normalized': np.float32(0.12806891), 'prev_log_return': np.float32(0.10587721), 'usdchf_log_return': np.float32(0.13265294), 'xagusd_log_return': np.float32(0.11473642), 'xtiusd_log_return': np.float32(0.113930486), 'synth_vix_zscore': np.float32(0.11437683)}
[2026-05-15 01:23:27,211 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:23:27,503 INFO] src.engine_xgb: XGB Train Acc: 0.6806 | Test Acc: 0.6806
[2026-05-15 01:23:27,504 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.101440765), 'gmm_vol_cluster': np.float32(0.0982352), 'rsi_slope': np.float32(0.116177246), 'atr_normalized': np.float32(0.11526749), 'prev_log_return': np.float32(0.118790805), 'usdchf_log_return': np.float32(0.10388657), 'xagusd_log_return': np.float32(0.11389366), 'xtiusd_log_return': np.float32(0.116417766), 'synth_vix_zscore': np.float32(0.115890555)}
[2026-05-15 01:23:27,504 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:23:27,857 INFO] src.engine_xgb: XGB Train Acc: 0.6402 | Test Acc: 0.6402
[2026-05-15 01:23:27,857 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10810055), 'gmm_vol_cluster': np.float32(0.09112285), 'rsi_slope': np.float32(0.11456854), 'atr_normalized': np.float32(0.120319806), 'prev_log_return': np.float32(0.107062794), 'usdchf_log_return': np.float32(0.11398652), 'xagusd_log_return': np.float32(0.123077), 'xtiusd_log_return': np.float32(0.11178066), 'synth_vix_zscore': np.float32(0.109981276)}
[2026-05-15 01:23:27,858 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:23:27,859 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.42962, 0.34995) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:27,978 INFO] src.backtester: Backtest [H1]: Sharpe=-1.614 | MaxDD=0.095 | WR=0.258 | Return=-7.1% | Trades=93
[2026-05-15 01:23:27,979 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:28,322 INFO] src.engine_xgb: XGB Train Acc: 0.5221 | Test Acc: 0.5221
[2026-05-15 01:23:28,322 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09148964), 'gmm_vol_cluster': np.float32(0.09771291), 'rsi_slope': np.float32(0.11724012), 'atr_normalized': np.float32(0.11891214), 'prev_log_return': np.float32(0.107405685), 'usdchf_log_return': np.float32(0.12353096), 'xagusd_log_return': np.float32(0.109097145), 'xtiusd_log_return': np.float32(0.1116644), 'synth_vix_zscore': np.float32(0.12294707)}
[2026-05-15 01:23:28,323 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:23:28,747 INFO] src.engine_xgb: XGB Train Acc: 0.5328 | Test Acc: 0.5328
[2026-05-15 01:23:28,749 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09379842), 'gmm_vol_cluster': np.float32(0.13004375), 'rsi_slope': np.float32(0.12125274), 'atr_normalized': np.float32(0.10980662), 'prev_log_return': np.float32(0.100351766), 'usdchf_log_return': np.float32(0.10925072), 'xagusd_log_return': np.float32(0.11672903), 'xtiusd_log_return': np.float32(0.107322894), 'synth_vix_zscore': np.float32(0.111444116)}
[2026-05-15 01:23:28,749 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:23:29,132 INFO] src.engine_xgb: XGB Train Acc: 0.5180 | Test Acc: 0.5180
[2026-05-15 01:23:29,132 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11791295), 'gmm_vol_cluster': np.float32(0.082202844), 'rsi_slope': np.float32(0.109374985), 'atr_normalized': np.float32(0.114623785), 'prev_log_return': np.float32(0.11599842), 'usdchf_log_return': np.float32(0.113679804), 'xagusd_log_return': np.float32(0.115046196), 'xtiusd_log_return': np.float32(0.11308477), 'synth_vix_zscore': np.float32(0.11807624)}
[2026-05-15 01:23:29,133 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:23:29,134 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.47849, 0.22854) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:29,254 INFO] src.backtester: Backtest [H1]: Sharpe=-2.702 | MaxDD=0.153 | WR=0.267 | Return=-11.2% | Trades=90
[2026-05-15 01:23:29,254 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:29,630 INFO] src.engine_xgb: XGB Train Acc: 0.5002 | Test Acc: 0.5002
[2026-05-15 01:23:29,631 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10145651), 'gmm_vol_cluster': np.float32(0.115823396), 'rsi_slope': np.float32(0.10259891), 'atr_normalized': np.float32(0.10684122), 'prev_log_return': np.float32(0.105857335), 'usdchf_log_return': np.float32(0.119893506), 'xagusd_log_return': np.float32(0.11002508), 'xtiusd_log_return': np.float32(0.112560794), 'synth_vix_zscore': np.float32(0.124943234)}
[2026-05-15 01:23:29,631 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:23:30,071 INFO] src.engine_xgb: XGB Train Acc: 0.4965 | Test Acc: 0.4965
[2026-05-15 01:23:30,072 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09284898), 'gmm_vol_cluster': np.float32(0.11531099), 'rsi_slope': np.float32(0.12346129), 'atr_normalized': np.float32(0.123936124), 'prev_log_return': np.float32(0.10941086), 'usdchf_log_return': np.float32(0.108327426), 'xagusd_log_return': np.float32(0.115279935), 'xtiusd_log_return': np.float32(0.10467198), 'synth_vix_zscore': np.float32(0.10675249)}
[2026-05-15 01:23:30,072 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:23:30,524 INFO] src.engine_xgb: XGB Train Acc: 0.5047 | Test Acc: 0.5047
[2026-05-15 01:23:30,525 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10644479), 'gmm_vol_cluster': np.float32(0.0822759), 'rsi_slope': np.float32(0.11534594), 'atr_normalized': np.float32(0.114628784), 'prev_log_return': np.float32(0.12369893), 'usdchf_log_return': np.float32(0.11878235), 'xagusd_log_return': np.float32(0.11829602), 'xtiusd_log_return': np.float32(0.11088197), 'synth_vix_zscore': np.float32(0.10964536)}
[2026-05-15 01:23:30,525 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:23:30,527 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.64128, 0.06038) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:30,629 INFO] src.backtester: Backtest [H1]: Sharpe=-0.037 | MaxDD=0.047 | WR=0.364 | Return=-0.1% | Trades=55
[2026-05-15 01:23:30,630 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:30,644 INFO] src.optimizer: WFO [H1] window start=34560: trades=55 sharpe=-0.037 cv_sharpe=-2.158 score=-0.024
[2026-05-15 01:23:31,387 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:23:31,388 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:23:31,388 INFO] src.engine_hmm: Bull 0.9735 0.0086 0.0179
[2026-05-15 01:23:31,388 INFO] src.engine_hmm: Bear 0.0049 0.9689 0.0261
[2026-05-15 01:23:31,388 INFO] src.engine_hmm: Chop 0.0103 0.0174 0.9723
[2026-05-15 01:23:31,389 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:23:31,389 INFO] src.engine_hmm: Bull: return=0.643776, vol=1.317744, rsi_slope=-0.021632
[2026-05-15 01:23:31,389 INFO] src.engine_hmm: Bear: return=-0.788622, vol=-0.122809, rsi_slope=0.021756
[2026-05-15 01:23:31,389 INFO] src.engine_hmm: Chop: return=0.220981, vol=-0.597231, rsi_slope=-0.004087
[2026-05-15 01:23:31,389 INFO] src.engine_hmm: Total regime transitions: 271
[2026-05-15 01:23:31,390 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-16 06:00:00: Bull -> Chop
[2026-05-15 01:23:31,390 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-16 18:00:00: Chop -> Bear
[2026-05-15 01:23:31,390 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-23 20:00:00: Bear -> Chop
[2026-05-15 01:23:31,391 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-28 02:00:00: Chop -> Bear
[2026-05-15 01:23:31,391 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-28 09:00:00: Bear -> Chop
[2026-05-15 01:23:31,391 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-28 15:00:00: Chop -> Bear
[2026-05-15 01:23:31,391 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-29 07:00:00: Bear -> Chop
[2026-05-15 01:23:31,392 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-29 18:00:00: Chop -> Bear
[2026-05-15 01:23:31,392 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 02:00:00: Bear -> Chop
[2026-05-15 01:23:31,392 INFO] src.engine_hmm: REGIME CHANGE at 2022-11-30 21:00:00: Chop -> Bull
[2026-05-15 01:23:31,408 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:23:31,416 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:23:31,694 INFO] src.engine_xgb: XGB Train Acc: 0.5659 | Test Acc: 0.5659
[2026-05-15 01:23:31,695 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08561989), 'gmm_vol_cluster': np.float32(0.15587968), 'rsi_slope': np.float32(0.103637956), 'atr_normalized': np.float32(0.10769949), 'prev_log_return': np.float32(0.10328851), 'usdchf_log_return': np.float32(0.11323513), 'xagusd_log_return': np.float32(0.107439995), 'xtiusd_log_return': np.float32(0.11485537), 'synth_vix_zscore': np.float32(0.10834404)}
[2026-05-15 01:23:31,695 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:23:32,049 INFO] src.engine_xgb: XGB Train Acc: 0.6147 | Test Acc: 0.6147
[2026-05-15 01:23:32,050 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10461082), 'gmm_vol_cluster': np.float32(0.14252152), 'rsi_slope': np.float32(0.107676916), 'atr_normalized': np.float32(0.1174636), 'prev_log_return': np.float32(0.111071706), 'usdchf_log_return': np.float32(0.10483127), 'xagusd_log_return': np.float32(0.10403469), 'xtiusd_log_return': np.float32(0.10690718), 'synth_vix_zscore': np.float32(0.10088226)}
[2026-05-15 01:23:32,050 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:23:32,382 INFO] src.engine_xgb: XGB Train Acc: 0.5813 | Test Acc: 0.5813
[2026-05-15 01:23:32,383 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09900643), 'gmm_vol_cluster': np.float32(0.101440996), 'rsi_slope': np.float32(0.11840484), 'atr_normalized': np.float32(0.1115111), 'prev_log_return': np.float32(0.11779893), 'usdchf_log_return': np.float32(0.11444061), 'xagusd_log_return': np.float32(0.12230669), 'xtiusd_log_return': np.float32(0.10583536), 'synth_vix_zscore': np.float32(0.10925507)}
[2026-05-15 01:23:32,384 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:23:32,385 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.13686, 0.71017) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:32,505 INFO] src.backtester: Backtest [H1]: Sharpe=-1.021 | MaxDD=0.056 | WR=0.237 | Return=-2.7% | Trades=76
[2026-05-15 01:23:32,506 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:32,919 INFO] src.engine_xgb: XGB Train Acc: 0.5201 | Test Acc: 0.5201
[2026-05-15 01:23:32,920 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.114351235), 'gmm_vol_cluster': np.float32(0.10329643), 'rsi_slope': np.float32(0.11180613), 'atr_normalized': np.float32(0.11641762), 'prev_log_return': np.float32(0.10925838), 'usdchf_log_return': np.float32(0.109503396), 'xagusd_log_return': np.float32(0.11868604), 'xtiusd_log_return': np.float32(0.1141142), 'synth_vix_zscore': np.float32(0.102566555)}
[2026-05-15 01:23:32,920 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:23:33,316 INFO] src.engine_xgb: XGB Train Acc: 0.5224 | Test Acc: 0.5224
[2026-05-15 01:23:33,317 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09674441), 'gmm_vol_cluster': np.float32(0.11676804), 'rsi_slope': np.float32(0.10632972), 'atr_normalized': np.float32(0.11191178), 'prev_log_return': np.float32(0.11970703), 'usdchf_log_return': np.float32(0.1139485), 'xagusd_log_return': np.float32(0.10865917), 'xtiusd_log_return': np.float32(0.11682712), 'synth_vix_zscore': np.float32(0.10910415)}
[2026-05-15 01:23:33,317 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:23:33,666 INFO] src.engine_xgb: XGB Train Acc: 0.5271 | Test Acc: 0.5271
[2026-05-15 01:23:33,667 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11188915), 'gmm_vol_cluster': np.float32(0.091958076), 'rsi_slope': np.float32(0.115750805), 'atr_normalized': np.float32(0.11882468), 'prev_log_return': np.float32(0.11799603), 'usdchf_log_return': np.float32(0.111407265), 'xagusd_log_return': np.float32(0.10418465), 'xtiusd_log_return': np.float32(0.11690263), 'synth_vix_zscore': np.float32(0.111086756)}
[2026-05-15 01:23:33,667 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:23:33,669 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.51565, 0.29314) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:33,789 INFO] src.backtester: Backtest [H1]: Sharpe=0.342 | MaxDD=0.085 | WR=0.356 | Return=1.7% | Trades=73
[2026-05-15 01:23:33,790 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:34,153 INFO] src.engine_xgb: XGB Train Acc: 0.4988 | Test Acc: 0.4988
[2026-05-15 01:23:34,153 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.1332154), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12267894), 'atr_normalized': np.float32(0.12509194), 'prev_log_return': np.float32(0.113561004), 'usdchf_log_return': np.float32(0.12154878), 'xagusd_log_return': np.float32(0.12695432), 'xtiusd_log_return': np.float32(0.12950808), 'synth_vix_zscore': np.float32(0.12744156)}
[2026-05-15 01:23:34,154 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:23:34,556 INFO] src.engine_xgb: XGB Train Acc: 0.5093 | Test Acc: 0.5093
[2026-05-15 01:23:34,556 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08116238), 'gmm_vol_cluster': np.float32(0.17415653), 'rsi_slope': np.float32(0.09837292), 'atr_normalized': np.float32(0.10010697), 'prev_log_return': np.float32(0.111975186), 'usdchf_log_return': np.float32(0.11353972), 'xagusd_log_return': np.float32(0.10584854), 'xtiusd_log_return': np.float32(0.1119184), 'synth_vix_zscore': np.float32(0.10291936)}
[2026-05-15 01:23:34,558 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:23:34,983 INFO] src.engine_xgb: XGB Train Acc: 0.5138 | Test Acc: 0.5138
[2026-05-15 01:23:34,983 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09829374), 'gmm_vol_cluster': np.float32(0.09697903), 'rsi_slope': np.float32(0.1254718), 'atr_normalized': np.float32(0.13215941), 'prev_log_return': np.float32(0.10495793), 'usdchf_log_return': np.float32(0.107310794), 'xagusd_log_return': np.float32(0.10681098), 'xtiusd_log_return': np.float32(0.11336577), 'synth_vix_zscore': np.float32(0.11465056)}
[2026-05-15 01:23:34,984 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:23:34,986 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.46960, 0.34543) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:35,080 INFO] src.backtester: Backtest [H1]: Sharpe=-2.820 | MaxDD=0.142 | WR=0.297 | Return=-8.9% | Trades=37
[2026-05-15 01:23:35,080 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:35,096 INFO] src.optimizer: WFO [H1] window start=38880: trades=37 sharpe=-2.820 cv_sharpe=-0.340 score=-1.000
[2026-05-15 01:23:35,684 INFO] src.engine_hmm: Transition Matrix:
[2026-05-15 01:23:35,684 INFO] src.engine_hmm: Bull Bear Chop
[2026-05-15 01:23:35,684 INFO] src.engine_hmm: Bull 0.9722 0.0066 0.0211
[2026-05-15 01:23:35,684 INFO] src.engine_hmm: Bear 0.0104 0.9699 0.0196
[2026-05-15 01:23:35,685 INFO] src.engine_hmm: Chop 0.0151 0.0084 0.9765
[2026-05-15 01:23:35,685 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-15 01:23:35,685 INFO] src.engine_hmm: Bull: return=0.827241, vol=-0.034452, rsi_slope=-0.014886
[2026-05-15 01:23:35,685 INFO] src.engine_hmm: Bear: return=-0.702102, vol=1.302221, rsi_slope=-0.004644
[2026-05-15 01:23:35,685 INFO] src.engine_hmm: Chop: return=-0.276319, vol=-0.539536, rsi_slope=0.012451
[2026-05-15 01:23:35,687 INFO] src.engine_hmm: Total regime transitions: 252
[2026-05-15 01:23:35,687 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-23 16:00:00: Chop -> Bull
[2026-05-15 01:23:35,687 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-24 13:00:00: Bull -> Chop
[2026-05-15 01:23:35,687 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-29 17:00:00: Chop -> Bull
[2026-05-15 01:23:35,688 INFO] src.engine_hmm: REGIME CHANGE at 2023-08-30 22:00:00: Bull -> Chop
[2026-05-15 01:23:35,688 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-15 16:00:00: Chop -> Bull
[2026-05-15 01:23:35,688 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-18 12:00:00: Bull -> Chop
[2026-05-15 01:23:35,688 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-20 17:00:00: Chop -> Bull
[2026-05-15 01:23:35,688 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-20 23:00:00: Bull -> Chop
[2026-05-15 01:23:35,689 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-27 13:00:00: Chop -> Bear
[2026-05-15 01:23:35,689 INFO] src.engine_hmm: REGIME CHANGE at 2023-09-29 02:00:00: Bear -> Chop
[2026-05-15 01:23:35,705 INFO] src.engine_xgb: Features prepared: 8759 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-15 01:23:35,713 INFO] src.engine_xgb: Features prepared: 2159 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-15 01:23:35,976 INFO] src.engine_xgb: XGB Train Acc: 0.6506 | Test Acc: 0.6506
[2026-05-15 01:23:35,976 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.10170829), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.13678598), 'atr_normalized': np.float32(0.11984143), 'prev_log_return': np.float32(0.12948221), 'usdchf_log_return': np.float32(0.13551942), 'xagusd_log_return': np.float32(0.12782556), 'xtiusd_log_return': np.float32(0.12481296), 'synth_vix_zscore': np.float32(0.124024116)}
[2026-05-15 01:23:35,977 INFO] src.engine_xgb: Trained vol-bucket 'low': 956 samples.
[2026-05-15 01:23:36,264 INFO] src.engine_xgb: XGB Train Acc: 0.5958 | Test Acc: 0.5958
[2026-05-15 01:23:36,265 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11301366), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12491012), 'atr_normalized': np.float32(0.13044879), 'prev_log_return': np.float32(0.11532068), 'usdchf_log_return': np.float32(0.12719283), 'xagusd_log_return': np.float32(0.12326959), 'xtiusd_log_return': np.float32(0.12940027), 'synth_vix_zscore': np.float32(0.13644405)}
[2026-05-15 01:23:36,265 INFO] src.engine_xgb: Trained vol-bucket 'med': 955 samples.
[2026-05-15 01:23:36,569 INFO] src.engine_xgb: XGB Train Acc: 0.6209 | Test Acc: 0.6209
[2026-05-15 01:23:36,570 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.08412073), 'gmm_vol_cluster': np.float32(0.07837837), 'rsi_slope': np.float32(0.10937347), 'atr_normalized': np.float32(0.12316624), 'prev_log_return': np.float32(0.1196091), 'usdchf_log_return': np.float32(0.12718262), 'xagusd_log_return': np.float32(0.11362108), 'xtiusd_log_return': np.float32(0.12249612), 'synth_vix_zscore': np.float32(0.12205223)}
[2026-05-15 01:23:36,570 INFO] src.engine_xgb: Trained vol-bucket 'high': 984 samples.
[2026-05-15 01:23:36,572 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 956, 'med': 955, 'high': 984} thresholds=(-0.73608, -0.15122) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:36,689 INFO] src.backtester: Backtest [H1]: Sharpe=0.306 | MaxDD=0.071 | WR=0.329 | Return=1.4% | Trades=82
[2026-05-15 01:23:36,690 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:37,071 INFO] src.engine_xgb: XGB Train Acc: 0.5242 | Test Acc: 0.5242
[2026-05-15 01:23:37,072 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.11332579), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.12546426), 'atr_normalized': np.float32(0.12127437), 'prev_log_return': np.float32(0.12532198), 'usdchf_log_return': np.float32(0.1274791), 'xagusd_log_return': np.float32(0.1282387), 'xtiusd_log_return': np.float32(0.13486977), 'synth_vix_zscore': np.float32(0.12402609)}
[2026-05-15 01:23:37,072 INFO] src.engine_xgb: Trained vol-bucket 'low': 1919 samples.
[2026-05-15 01:23:37,409 INFO] src.engine_xgb: XGB Train Acc: 0.5094 | Test Acc: 0.5094
[2026-05-15 01:23:37,409 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.09614727), 'gmm_vol_cluster': np.float32(0.091115735), 'rsi_slope': np.float32(0.109712526), 'atr_normalized': np.float32(0.11631427), 'prev_log_return': np.float32(0.11289311), 'usdchf_log_return': np.float32(0.12101824), 'xagusd_log_return': np.float32(0.11669844), 'xtiusd_log_return': np.float32(0.11759486), 'synth_vix_zscore': np.float32(0.118505575)}
[2026-05-15 01:23:37,410 INFO] src.engine_xgb: Trained vol-bucket 'med': 1918 samples.
[2026-05-15 01:23:37,771 INFO] src.engine_xgb: XGB Train Acc: 0.5281 | Test Acc: 0.5281
[2026-05-15 01:23:37,772 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.119530864), 'gmm_vol_cluster': np.float32(0.099163875), 'rsi_slope': np.float32(0.1272163), 'atr_normalized': np.float32(0.12533092), 'prev_log_return': np.float32(0.10410827), 'usdchf_log_return': np.float32(0.107543096), 'xagusd_log_return': np.float32(0.112383105), 'xtiusd_log_return': np.float32(0.10437655), 'synth_vix_zscore': np.float32(0.100347035)}
[2026-05-15 01:23:37,772 INFO] src.engine_xgb: Trained vol-bucket 'high': 1977 samples.
[2026-05-15 01:23:37,774 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 1919, 'med': 1918, 'high': 1977} thresholds=(-0.53526, 0.16378) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:37,895 INFO] src.backtester: Backtest [H1]: Sharpe=0.861 | MaxDD=0.051 | WR=0.333 | Return=3.7% | Trades=78
[2026-05-15 01:23:37,896 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:38,273 INFO] src.engine_xgb: XGB Train Acc: 0.5202 | Test Acc: 0.5202
[2026-05-15 01:23:38,274 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.17574273), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.11526531), 'atr_normalized': np.float32(0.122664206), 'prev_log_return': np.float32(0.12658721), 'usdchf_log_return': np.float32(0.11749972), 'xagusd_log_return': np.float32(0.11383753), 'xtiusd_log_return': np.float32(0.119806044), 'synth_vix_zscore': np.float32(0.10859725)}
[2026-05-15 01:23:38,274 INFO] src.engine_xgb: Trained vol-bucket 'low': 2891 samples.
[2026-05-15 01:23:38,633 INFO] src.engine_xgb: XGB Train Acc: 0.5138 | Test Acc: 0.5138
[2026-05-15 01:23:38,633 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.12593257), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.122714534), 'atr_normalized': np.float32(0.120980695), 'prev_log_return': np.float32(0.12765904), 'usdchf_log_return': np.float32(0.12417489), 'xagusd_log_return': np.float32(0.123180605), 'xtiusd_log_return': np.float32(0.11901957), 'synth_vix_zscore': np.float32(0.1363381)}
[2026-05-15 01:23:38,634 INFO] src.engine_xgb: Trained vol-bucket 'med': 2890 samples.
[2026-05-15 01:23:39,006 INFO] src.engine_xgb: XGB Train Acc: 0.5242 | Test Acc: 0.5242
[2026-05-15 01:23:39,006 INFO] src.engine_xgb: Feature importance: {'hmm_state': np.float32(0.116531685), 'gmm_vol_cluster': np.float32(0.0995781), 'rsi_slope': np.float32(0.12237267), 'atr_normalized': np.float32(0.12460185), 'prev_log_return': np.float32(0.103164054), 'usdchf_log_return': np.float32(0.11063563), 'xagusd_log_return': np.float32(0.10789039), 'xtiusd_log_return': np.float32(0.108113796), 'synth_vix_zscore': np.float32(0.10711187)}
[2026-05-15 01:23:39,007 INFO] src.engine_xgb: Trained vol-bucket 'high': 2978 samples.
[2026-05-15 01:23:39,008 INFO] src.engine_xgb: Ensemble trained: buckets={'low': 2891, 'med': 2890, 'high': 2978} thresholds=(-0.43440, 0.22813) features=['hmm_state', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore']
[2026-05-15 01:23:39,101 INFO] src.backtester: Backtest [H1]: Sharpe=-1.454 | MaxDD=0.067 | WR=0.324 | Return=-4.2% | Trades=37
[2026-05-15 01:23:39,101 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-15 01:23:39,116 INFO] src.optimizer: WFO [H1] window start=43200: trades=37 sharpe=-1.454 cv_sharpe=0.584 score=-1.000
[2026-05-15 01:23:39,117 INFO] src.optimizer: WFO [H1]: 6/8 valid | median_trades=47 | score=-1.823 | std_sharpe=1.929 | WFE=1.77 | window_scores=[-50.0, -1.0, -0.5, -50.0, -0.5, -0.024, -1.0, -1.0]
[2026-05-15 01:23:39,164 INFO] src.optimizer: Trial 37 [H1/headway_cent $15 standard]: score=-2.288 | valid=6/8 | std_sharpe=1.929 | median_trades=47 | WFE=1.77 | scores=[-50.0, -1.0, -0.5, -50.0, -0.5, -0.024, -1.0, -1.0]
Best trial: 23. Best value: -0.320363: 19%|████████████▉ | 38/200 [21:38<1:29:54, 33.30s/it][