Files
GoldRegime_X/logfiles_cmd.txt
Luke Mosoti 2dff0baa02 Add scripts for generating strategy reports and smoke testing Explorer integration
- Implemented `generate_bridge_csv.py` to generate reports for strategy winners from the Strategy Tester notebook.
- Added `smoke_test_explorer.py` to perform smoke tests on the Explorer notebook integration, validating core logic and data processing.
2026-06-19 11:07:05 +03:00

659 lines
110 KiB
Plaintext

PS C:\GoldRegime_X> python main.py --mode optimize --tf M15 --broker headway_cent --balance 15 --trials 300
[2026-05-31 14:16:36,101 INFO] src.mt5_sync: [SYNC] M15 data is stale by 128796 s — fetching from MT5.
[2026-05-31 14:16:36,118 INFO] src.mt5_sync: MT5 connected — login=4315072 server=Headway-Demo balance=998235.87 USD
[2026-05-31 14:16:36,121 INFO] src.mt5_sync: [SYNC] XAUUSD M15 is already up to date.
[2026-05-31 14:16:36,123 INFO] main: Optimizing [M15] broker=headway_cent balance=$15 trials=300 wfo_mode=standard stage=joint
C:\Users\LUKE\AppData\Roaming\Python\Python311\site-packages\optuna\_experimental.py:33: ExperimentalWarning: Argument ``multivariate`` is an experimental feature. The interface can change in the future.
optuna_warn(
[I 2026-05-31 14:16:36,873] A new study created in RDB with name: m15_headway_cent_single_pipeline
Starting WFO study 'm15_headway_cent_single_pipeline' — target 300 trials.
WFO [M15]: IS=35040 bars OOS=8640 bars embargo=96 bars step=8640 bars
Recommended trial counts — H1:250 M15:100 M5:120
Active Optuna search space:
- colsample_bytree
- gamma
- learning_rate
- max_depth
- min_child_weight
- n_estimators
- obs_cov
- persistence_threshold
- reg_alpha
- reg_lambda
- scale_pos_weight
- subsample
- trans_cov
[2026-05-31 14:16:36,910 INFO] src.optimizer: Optuna search space audited: ['colsample_bytree', 'gamma', 'learning_rate', 'max_depth', 'min_child_weight', 'n_estimators', 'obs_cov', 'persistence_threshold', 'reg_alpha', 'reg_lambda', 'scale_pos_weight', 'subsample', 'trans_cov']
0%| | 0/300 [00:00<?, ?it/s][2026-05-31 14:16:57,216 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:16:57,216 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:16:57,217 INFO] src.engine_hmm: TREND 0.9801 0.0011 0.0187
[2026-05-31 14:16:57,217 INFO] src.engine_hmm: MEAN_REVERSION 0.0001 0.9673 0.0327
[2026-05-31 14:16:57,217 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0217 0.0112 0.9671
[2026-05-31 14:16:57,218 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:16:57,218 INFO] src.engine_hmm: TREND: return=0.000970, vol=-0.571939, rsi_slope=-0.001855
[2026-05-31 14:16:57,219 INFO] src.engine_hmm: MEAN_REVERSION: return=-0.072795, vol=1.539641, rsi_slope=0.007246
[2026-05-31 14:16:57,219 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=0.026703, vol=0.036703, rsi_slope=-0.000740
[2026-05-31 14:16:57,221 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:16:57,223 INFO] src.engine_hmm: Total regime transitions: 4362
[2026-05-31 14:16:57,224 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 05:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:16:57,224 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 17:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:16:57,225 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 23:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:16:57,225 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 06:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:16:57,225 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 11:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:16:57,226 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 16:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:16:57,226 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 02:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:16:57,226 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:16:57,227 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 21:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:16:57,227 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-03 01:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:08,790 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:17:08,791 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:17:08,792 INFO] src.engine_hmm: TREND 0.9799 0.0191 0.0010
[2026-05-31 14:17:08,792 INFO] src.engine_hmm: MEAN_REVERSION 0.0223 0.9681 0.0096
[2026-05-31 14:17:08,792 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0000 0.0347 0.9653
[2026-05-31 14:17:08,793 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:17:08,793 INFO] src.engine_hmm: TREND: return=0.009950, vol=-0.529276, rsi_slope=-0.000297
[2026-05-31 14:17:08,793 INFO] src.engine_hmm: MEAN_REVERSION: return=0.017290, vol=0.085130, rsi_slope=-0.001134
[2026-05-31 14:17:08,794 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=-0.091850, vol=1.629191, rsi_slope=0.004741
[2026-05-31 14:17:08,796 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:17:08,798 INFO] src.engine_hmm: Total regime transitions: 2274
[2026-05-31 14:17:08,798 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-21 01:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:08,798 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-21 15:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:08,799 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-24 01:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:08,799 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-24 15:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:08,799 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-24 20:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:08,800 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-25 09:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:08,800 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-25 14:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:08,800 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-25 17:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:08,801 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-25 22:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:08,801 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-26 05:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:09,734 INFO] src.engine_xgb: Features prepared: 114664 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:17:11,177 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:17:12,802 INFO] src.engine_xgb: XGB Train Acc: 0.4745 | Test Acc: 0.4539
[2026-05-31 14:17:12,802 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.05983815), 'state_1': np.float32(0.04636059), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.048760287), 'atr_normalized': np.float32(0.055361144), 'prev_log_return': np.float32(0.049205568), 'usdchf_log_return': np.float32(0.04851826), 'xagusd_log_return': np.float32(0.047809422), 'xtiusd_log_return': np.float32(0.045258086), 'synth_vix_zscore': np.float32(0.05376292), 'atr_band_position': np.float32(0.07154162), 'hour_sin': np.float32(0.055989306), 'hour_cos': np.float32(0.052597232), 'minute_sin': np.float32(0.03885447), 'minute_cos': np.float32(0.048919126), 'atr_expansion_ratio': np.float32(0.05500269), 'realized_vol_ratio': np.float32(0.057732295), 'atr_slope': np.float32(0.05129226), 'minutes_from_london_open': np.float32(0.055655226), 'minutes_from_ny_open': np.float32(0.057541337)}
[2026-05-31 14:17:12,806 INFO] src.engine_xgb: [M15] TREND model: n=53622 train_acc=0.4745
[2026-05-31 14:17:13,455 INFO] src.engine_xgb: XGB Train Acc: 0.3961 | Test Acc: 0.3961
[2026-05-31 14:17:13,456 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.05976675), 'state_2': np.float32(0.034089357), 'gmm_vol_cluster': np.float32(0.06251577), 'rsi_slope': np.float32(0.05012164), 'atr_normalized': np.float32(0.052495178), 'prev_log_return': np.float32(0.045317695), 'usdchf_log_return': np.float32(0.048001654), 'xagusd_log_return': np.float32(0.04667047), 'xtiusd_log_return': np.float32(0.04479729), 'synth_vix_zscore': np.float32(0.049114373), 'atr_band_position': np.float32(0.05438175), 'hour_sin': np.float32(0.0496149), 'hour_cos': np.float32(0.0530945), 'minute_sin': np.float32(0.043510407), 'minute_cos': np.float32(0.039405707), 'atr_expansion_ratio': np.float32(0.052344464), 'realized_vol_ratio': np.float32(0.058810756), 'atr_slope': np.float32(0.04951871), 'minutes_from_london_open': np.float32(0.052661754), 'minutes_from_ny_open': np.float32(0.05376689)}
[2026-05-31 14:17:13,460 INFO] src.engine_xgb: [M15] SHOCK model: n=61043 train_acc=0.3961
[2026-05-31 14:17:15,679 INFO] src.backtester: Backtest [M15]: Sharpe=-4.034 | MaxDD=0.164 | WR=0.335 | Return=-14.9% | Trades=212
[2026-05-31 14:17:15,679 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:17:26,388 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:17:26,389 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:17:26,389 INFO] src.engine_hmm: TREND 0.9812 0.0179 0.0009
[2026-05-31 14:17:26,389 INFO] src.engine_hmm: MEAN_REVERSION 0.0206 0.9704 0.0090
[2026-05-31 14:17:26,389 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0000 0.0321 0.9679
[2026-05-31 14:17:26,389 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:17:26,389 INFO] src.engine_hmm: TREND: return=0.013837, vol=-0.549096, rsi_slope=0.000706
[2026-05-31 14:17:26,390 INFO] src.engine_hmm: MEAN_REVERSION: return=0.041889, vol=0.082159, rsi_slope=-0.001226
[2026-05-31 14:17:26,390 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=-0.184361, vol=1.681200, rsi_slope=0.001456
[2026-05-31 14:17:26,391 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:17:26,392 INFO] src.engine_hmm: Total regime transitions: 2077
[2026-05-31 14:17:26,393 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-21 17:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:26,393 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-21 22:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:26,393 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-27 17:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:26,393 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-27 22:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:26,394 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-28 19:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:26,394 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-29 01:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:26,394 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-29 18:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:26,395 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-29 23:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:26,395 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-30 16:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:26,395 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-30 19:45:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:27,028 INFO] src.engine_xgb: Features prepared: 114777 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:17:28,014 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:17:29,296 INFO] src.engine_xgb: XGB Train Acc: 0.4830 | Test Acc: 0.4447
[2026-05-31 14:17:29,296 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0414423), 'state_1': np.float32(0.032641403), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.05533984), 'atr_normalized': np.float32(0.0546786), 'prev_log_return': np.float32(0.052999377), 'usdchf_log_return': np.float32(0.049841687), 'xagusd_log_return': np.float32(0.051685564), 'xtiusd_log_return': np.float32(0.050114974), 'synth_vix_zscore': np.float32(0.052457612), 'atr_band_position': np.float32(0.070352025), 'hour_sin': np.float32(0.056683563), 'hour_cos': np.float32(0.05628195), 'minute_sin': np.float32(0.04309834), 'minute_cos': np.float32(0.0419951), 'atr_expansion_ratio': np.float32(0.058254145), 'realized_vol_ratio': np.float32(0.05825186), 'atr_slope': np.float32(0.052938692), 'minutes_from_london_open': np.float32(0.059349436), 'minutes_from_ny_open': np.float32(0.061593544)}
[2026-05-31 14:17:29,299 INFO] src.engine_xgb: [M15] TREND model: n=53096 train_acc=0.4830
[2026-05-31 14:17:30,409 INFO] src.engine_xgb: XGB Train Acc: 0.4693 | Test Acc: 0.4261
[2026-05-31 14:17:30,410 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.06432345), 'state_2': np.float32(0.05023736), 'gmm_vol_cluster': np.float32(0.05294831), 'rsi_slope': np.float32(0.049215246), 'atr_normalized': np.float32(0.05256252), 'prev_log_return': np.float32(0.03810913), 'usdchf_log_return': np.float32(0.044113025), 'xagusd_log_return': np.float32(0.042499725), 'xtiusd_log_return': np.float32(0.040721618), 'synth_vix_zscore': np.float32(0.048289794), 'atr_band_position': np.float32(0.05747826), 'hour_sin': np.float32(0.051304504), 'hour_cos': np.float32(0.057548385), 'minute_sin': np.float32(0.036617033), 'minute_cos': np.float32(0.037235923), 'atr_expansion_ratio': np.float32(0.053757004), 'realized_vol_ratio': np.float32(0.05649266), 'atr_slope': np.float32(0.050601553), 'minutes_from_london_open': np.float32(0.056859516), 'minutes_from_ny_open': np.float32(0.05908503)}
[2026-05-31 14:17:30,415 INFO] src.engine_xgb: [M15] SHOCK model: n=61689 train_acc=0.4693
[2026-05-31 14:17:32,098 INFO] src.backtester: Backtest [M15]: Sharpe=-5.847 | MaxDD=0.348 | WR=0.328 | Return=-29.2% | Trades=406
[2026-05-31 14:17:32,098 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:17:37,420 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:17:37,421 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:17:37,421 INFO] src.engine_hmm: TREND 0.9785 0.0202 0.0013
[2026-05-31 14:17:37,421 INFO] src.engine_hmm: MEAN_REVERSION 0.0230 0.9620 0.0150
[2026-05-31 14:17:37,421 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0002 0.0323 0.9676
[2026-05-31 14:17:37,421 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:17:37,421 INFO] src.engine_hmm: TREND: return=0.012385, vol=-0.694134, rsi_slope=0.000273
[2026-05-31 14:17:37,421 INFO] src.engine_hmm: MEAN_REVERSION: return=0.008127, vol=-0.014399, rsi_slope=-0.001938
[2026-05-31 14:17:37,421 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=-0.042285, vol=1.498602, rsi_slope=0.003250
[2026-05-31 14:17:37,424 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:17:37,424 INFO] src.engine_hmm: Total regime transitions: 2217
[2026-05-31 14:17:37,425 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-21 15:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:37,426 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-21 22:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:37,427 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-27 17:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:37,427 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-27 22:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:37,427 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-28 19:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:37,427 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-29 01:45:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:37,427 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-29 17:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:37,427 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-30 01:45:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:37,427 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-30 16:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:37,427 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-30 21:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:38,065 INFO] src.engine_xgb: Features prepared: 114462 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:17:39,000 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:17:39,565 INFO] src.engine_xgb: XGB Train Acc: 0.4501 | Test Acc: 0.4301
[2026-05-31 14:17:39,565 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.059501346), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.0626982), 'atr_normalized': np.float32(0.05421367), 'prev_log_return': np.float32(0.048928976), 'usdchf_log_return': np.float32(0.049678873), 'xagusd_log_return': np.float32(0.054264333), 'xtiusd_log_return': np.float32(0.051370665), 'synth_vix_zscore': np.float32(0.052388184), 'atr_band_position': np.float32(0.07068851), 'hour_sin': np.float32(0.06495029), 'hour_cos': np.float32(0.05425043), 'minute_sin': np.float32(0.04432663), 'minute_cos': np.float32(0.039731625), 'atr_expansion_ratio': np.float32(0.054376658), 'realized_vol_ratio': np.float32(0.059720498), 'atr_slope': np.float32(0.04987835), 'minutes_from_london_open': np.float32(0.063587144), 'minutes_from_ny_open': np.float32(0.0654456)}
[2026-05-31 14:17:39,568 INFO] src.engine_xgb: [M15] TREND model: n=48615 train_acc=0.4501
[2026-05-31 14:17:40,938 INFO] src.engine_xgb: XGB Train Acc: 0.5851 | Test Acc: 0.5260
[2026-05-31 14:17:40,939 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.044575334), 'state_2': np.float32(0.054168656), 'gmm_vol_cluster': np.float32(0.04898279), 'rsi_slope': np.float32(0.05410419), 'atr_normalized': np.float32(0.049424738), 'prev_log_return': np.float32(0.044438347), 'usdchf_log_return': np.float32(0.04770442), 'xagusd_log_return': np.float32(0.046027392), 'xtiusd_log_return': np.float32(0.044296455), 'synth_vix_zscore': np.float32(0.049689285), 'atr_band_position': np.float32(0.059236776), 'hour_sin': np.float32(0.05068985), 'hour_cos': np.float32(0.060413912), 'minute_sin': np.float32(0.04043085), 'minute_cos': np.float32(0.043582004), 'atr_expansion_ratio': np.float32(0.05148086), 'realized_vol_ratio': np.float32(0.05418701), 'atr_slope': np.float32(0.049427614), 'minutes_from_london_open': np.float32(0.052073296), 'minutes_from_ny_open': np.float32(0.055066153)}
[2026-05-31 14:17:40,942 INFO] src.engine_xgb: [M15] SHOCK model: n=65872 train_acc=0.5851
[2026-05-31 14:17:42,353 INFO] src.backtester: Backtest [M15]: Sharpe=-4.279 | MaxDD=0.384 | WR=0.438 | Return=-31.8% | Trades=626
[2026-05-31 14:17:42,354 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:17:50,265 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:17:50,265 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:17:50,265 INFO] src.engine_hmm: TREND 0.9815 0.0175 0.0010
[2026-05-31 14:17:50,266 INFO] src.engine_hmm: MEAN_REVERSION 0.0208 0.9697 0.0095
[2026-05-31 14:17:50,266 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0001 0.0310 0.9689
[2026-05-31 14:17:50,266 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:17:50,266 INFO] src.engine_hmm: TREND: return=-0.005811, vol=-0.509276, rsi_slope=-0.003085
[2026-05-31 14:17:50,266 INFO] src.engine_hmm: MEAN_REVERSION: return=0.036760, vol=0.044839, rsi_slope=-0.001226
[2026-05-31 14:17:50,266 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=-0.088637, vol=1.556298, rsi_slope=0.013823
[2026-05-31 14:17:50,268 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:17:50,268 INFO] src.engine_hmm: Total regime transitions: 1050
[2026-05-31 14:17:50,269 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-03 15:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:50,269 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-03 20:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:50,269 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-15 21:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:50,269 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-16 03:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:50,270 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-16 19:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:50,270 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-17 02:45:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:50,270 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-17 18:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:50,270 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-17 21:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:50,270 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-20 01:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:17:50,271 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-20 06:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:17:50,959 INFO] src.engine_xgb: Features prepared: 115102 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:17:51,975 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:17:53,274 INFO] src.engine_xgb: XGB Train Acc: 0.4500 | Test Acc: 0.4146
[2026-05-31 14:17:53,274 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.05353287), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.053494316), 'rsi_slope': np.float32(0.0647903), 'atr_normalized': np.float32(0.05276642), 'prev_log_return': np.float32(0.048185125), 'usdchf_log_return': np.float32(0.045255978), 'xagusd_log_return': np.float32(0.044892628), 'xtiusd_log_return': np.float32(0.044722587), 'synth_vix_zscore': np.float32(0.049051084), 'atr_band_position': np.float32(0.062327012), 'hour_sin': np.float32(0.05523574), 'hour_cos': np.float32(0.06513026), 'minute_sin': np.float32(0.03903623), 'minute_cos': np.float32(0.04137754), 'atr_expansion_ratio': np.float32(0.05070353), 'realized_vol_ratio': np.float32(0.054185756), 'atr_slope': np.float32(0.048366975), 'minutes_from_london_open': np.float32(0.06271707), 'minutes_from_ny_open': np.float32(0.06422856)}
[2026-05-31 14:17:53,282 INFO] src.engine_xgb: [M15] TREND model: n=99941 train_acc=0.4500
[2026-05-31 14:17:53,721 INFO] src.engine_xgb: XGB Train Acc: 0.4916 | Test Acc: 0.4374
[2026-05-31 14:17:53,721 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.05370212), 'rsi_slope': np.float32(0.048648857), 'atr_normalized': np.float32(0.061714508), 'prev_log_return': np.float32(0.049768437), 'usdchf_log_return': np.float32(0.05071361), 'xagusd_log_return': np.float32(0.05290117), 'xtiusd_log_return': np.float32(0.053816866), 'synth_vix_zscore': np.float32(0.05454988), 'atr_band_position': np.float32(0.059737734), 'hour_sin': np.float32(0.051753037), 'hour_cos': np.float32(0.06933511), 'minute_sin': np.float32(0.040273488), 'minute_cos': np.float32(0.045706164), 'atr_expansion_ratio': np.float32(0.058755476), 'realized_vol_ratio': np.float32(0.0657532), 'atr_slope': np.float32(0.05523888), 'minutes_from_london_open': np.float32(0.059543394), 'minutes_from_ny_open': np.float32(0.06808799)}
[2026-05-31 14:17:53,725 INFO] src.engine_xgb: [M15] SHOCK model: n=15175 train_acc=0.4916
[2026-05-31 14:17:54,974 INFO] src.backtester: Backtest [M15]: Sharpe=-1.821 | MaxDD=0.108 | WR=0.448 | Return=-9.9% | Trades=232
[2026-05-31 14:17:54,975 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:18:01,261 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:18:01,262 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:18:01,262 INFO] src.engine_hmm: TREND 0.9772 0.0204 0.0023
[2026-05-31 14:18:01,262 INFO] src.engine_hmm: MEAN_REVERSION 0.0261 0.9592 0.0147
[2026-05-31 14:18:01,262 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0005 0.0350 0.9645
[2026-05-31 14:18:01,262 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:18:01,262 INFO] src.engine_hmm: TREND: return=0.007174, vol=-0.681475, rsi_slope=-0.002120
[2026-05-31 14:18:01,262 INFO] src.engine_hmm: MEAN_REVERSION: return=-0.018933, vol=0.031579, rsi_slope=-0.001696
[2026-05-31 14:18:01,262 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=0.021634, vol=1.532826, rsi_slope=0.008412
[2026-05-31 14:18:01,265 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:18:01,266 INFO] src.engine_hmm: Total regime transitions: 2500
[2026-05-31 14:18:01,266 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 08:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:01,266 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:01,266 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 23:45:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:01,267 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 05:45:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:01,267 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 14:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:01,267 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:01,267 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 02:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:01,267 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 04:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:01,267 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 10:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:01,267 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:01,974 INFO] src.engine_xgb: Features prepared: 114593 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:18:03,002 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:18:03,807 INFO] src.engine_xgb: XGB Train Acc: 0.5584 | Test Acc: 0.5090
[2026-05-31 14:18:03,808 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.045921285), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.059826326), 'atr_normalized': np.float32(0.058458544), 'prev_log_return': np.float32(0.049910795), 'usdchf_log_return': np.float32(0.04739834), 'xagusd_log_return': np.float32(0.048353676), 'xtiusd_log_return': np.float32(0.047042545), 'synth_vix_zscore': np.float32(0.0517239), 'atr_band_position': np.float32(0.0692218), 'hour_sin': np.float32(0.07537616), 'hour_cos': np.float32(0.06267894), 'minute_sin': np.float32(0.041720346), 'minute_cos': np.float32(0.03822506), 'atr_expansion_ratio': np.float32(0.056025367), 'realized_vol_ratio': np.float32(0.060285635), 'atr_slope': np.float32(0.050839562), 'minutes_from_london_open': np.float32(0.068844564), 'minutes_from_ny_open': np.float32(0.06814716)}
[2026-05-31 14:18:03,812 INFO] src.engine_xgb: [M15] TREND model: n=50884 train_acc=0.5584
[2026-05-31 14:18:04,544 INFO] src.engine_xgb: XGB Train Acc: 0.5635 | Test Acc: 0.5150
[2026-05-31 14:18:04,544 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.04610692), 'state_2': np.float32(0.043742582), 'gmm_vol_cluster': np.float32(0.054995023), 'rsi_slope': np.float32(0.05248094), 'atr_normalized': np.float32(0.05285814), 'prev_log_return': np.float32(0.042732112), 'usdchf_log_return': np.float32(0.04339118), 'xagusd_log_return': np.float32(0.045758765), 'xtiusd_log_return': np.float32(0.047870554), 'synth_vix_zscore': np.float32(0.053358156), 'atr_band_position': np.float32(0.059475902), 'hour_sin': np.float32(0.050564855), 'hour_cos': np.float32(0.05346157), 'minute_sin': np.float32(0.038867217), 'minute_cos': np.float32(0.044810317), 'atr_expansion_ratio': np.float32(0.049788013), 'realized_vol_ratio': np.float32(0.057084195), 'atr_slope': np.float32(0.052373566), 'minutes_from_london_open': np.float32(0.05430781), 'minutes_from_ny_open': np.float32(0.055972204)}
[2026-05-31 14:18:04,549 INFO] src.engine_xgb: [M15] SHOCK model: n=63747 train_acc=0.5635
[2026-05-31 14:18:05,824 INFO] src.backtester: Backtest [M15]: Sharpe=-0.410 | MaxDD=0.001 | WR=0.500 | Return=-0.1% | Trades=2
[2026-05-31 14:18:05,824 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:18:11,429 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:18:11,429 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:18:11,429 INFO] src.engine_hmm: TREND 0.9795 0.0188 0.0017
[2026-05-31 14:18:11,429 INFO] src.engine_hmm: MEAN_REVERSION 0.0231 0.9644 0.0125
[2026-05-31 14:18:11,430 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0003 0.0297 0.9700
[2026-05-31 14:18:11,430 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:18:11,430 INFO] src.engine_hmm: TREND: return=-0.006847, vol=-0.651746, rsi_slope=-0.003190
[2026-05-31 14:18:11,430 INFO] src.engine_hmm: MEAN_REVERSION: return=0.032445, vol=-0.008291, rsi_slope=0.001331
[2026-05-31 14:18:11,430 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=-0.051339, vol=1.549645, rsi_slope=0.004734
[2026-05-31 14:18:11,432 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:18:11,433 INFO] src.engine_hmm: Total regime transitions: 2220
[2026-05-31 14:18:11,434 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 08:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:11,434 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:11,434 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 23:45:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:11,435 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 05:45:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:11,435 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 13:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:11,435 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:11,435 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 02:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:11,435 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 05:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:11,436 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 10:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:11,436 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:12,086 INFO] src.engine_xgb: Features prepared: 115110 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:18:13,064 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:18:14,375 INFO] src.engine_xgb: XGB Train Acc: 0.5797 | Test Acc: 0.5192
[2026-05-31 14:18:14,375 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.053822197), 'state_1': np.float32(0.04225239), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.05239943), 'atr_normalized': np.float32(0.05389649), 'prev_log_return': np.float32(0.049711782), 'usdchf_log_return': np.float32(0.04521233), 'xagusd_log_return': np.float32(0.04683042), 'xtiusd_log_return': np.float32(0.04745125), 'synth_vix_zscore': np.float32(0.050381593), 'atr_band_position': np.float32(0.06347559), 'hour_sin': np.float32(0.06178554), 'hour_cos': np.float32(0.06009674), 'minute_sin': np.float32(0.045072928), 'minute_cos': np.float32(0.04097263), 'atr_expansion_ratio': np.float32(0.051923387), 'realized_vol_ratio': np.float32(0.061772197), 'atr_slope': np.float32(0.051325988), 'minutes_from_london_open': np.float32(0.06061945), 'minutes_from_ny_open': np.float32(0.060997676)}
[2026-05-31 14:18:14,381 INFO] src.engine_xgb: [M15] TREND model: n=50588 train_acc=0.5797
[2026-05-31 14:18:16,428 INFO] src.engine_xgb: XGB Train Acc: 0.5812 | Test Acc: 0.5170
[2026-05-31 14:18:16,429 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.052818544), 'state_2': np.float32(0.056156613), 'gmm_vol_cluster': np.float32(0.047329094), 'rsi_slope': np.float32(0.05288641), 'atr_normalized': np.float32(0.051031277), 'prev_log_return': np.float32(0.047376096), 'usdchf_log_return': np.float32(0.04491308), 'xagusd_log_return': np.float32(0.04769427), 'xtiusd_log_return': np.float32(0.04726466), 'synth_vix_zscore': np.float32(0.049004342), 'atr_band_position': np.float32(0.05294886), 'hour_sin': np.float32(0.048686225), 'hour_cos': np.float32(0.051419925), 'minute_sin': np.float32(0.044499133), 'minute_cos': np.float32(0.042252827), 'atr_expansion_ratio': np.float32(0.051387258), 'realized_vol_ratio': np.float32(0.0554266), 'atr_slope': np.float32(0.04975004), 'minutes_from_london_open': np.float32(0.052532017), 'minutes_from_ny_open': np.float32(0.054622762)}
[2026-05-31 14:18:16,435 INFO] src.engine_xgb: [M15] SHOCK model: n=64539 train_acc=0.5812
[2026-05-31 14:18:17,969 INFO] src.backtester: Backtest [M15]: Sharpe=-3.693 | MaxDD=0.312 | WR=0.454 | Return=-26.7% | Trades=531
[2026-05-31 14:18:17,969 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:18:18,093 INFO] src.optimizer: CPCV [M15]: 2/6 valid paths | median_score=-2.378 std=0.847 | path_penalty=6.0 | final_score=-8.590
[2026-05-31 14:18:18,113 INFO] src.optimizer: trial=0 tf=M15 base=-1.3153 p_var=0.1764 p_inst=2.0000 p_dd=20.0000 p_mr=0.0000 p_floor=66.5231 p_turn=0.0000 p_occ=0.0000 p_m15=0.0000 final=-90.0148 reasons=floor_sharpe:-3.864<0.200|floor_pf:0.226<1.050
[2026-05-31 14:18:18,437 INFO] src.optimizer: tf=M15 | trial=0 | objective_score=-90.0148 | cpcv_mean_score=-8.5897 | cpcv_std_score=1.7635 | valid_paths=2 | total_paths=6 | sharpe_median=-3.8635 | pf_median=0.226 | calmar_median=-0.8223 | expectancy_median=-0.000597 | floating_dd_median=0.2476 | trades_median=319 | mr_leak_count=0 | regime_occupancy={'TREND': 52.64707180009331, 'MEAN_REVERSION': 0.0, 'VOLATILITY_SHOCK': 47.352928199906685} | trade_distribution={'TREND': 68, 'MEAN_REVERSION': 0, 'VOLATILITY_SHOCK': 91} | activation_events=0 | partial_close_events=0 | trail_updates=0 | regime_shift_forced_closes=72 | avg_activation_pnl_usd=0.0 | pruned=False | elapsed_sec=101.1
Best trial: 0. Best value: -90.0148: 0%|▏ | 1/300 [01:41<8:26:16, 101.59s/it][2026-05-31 14:18:34,385 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:18:34,386 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:18:34,386 INFO] src.engine_hmm: TREND 0.9809 0.0182 0.0009
[2026-05-31 14:18:34,386 INFO] src.engine_hmm: MEAN_REVERSION 0.0207 0.9687 0.0106
[2026-05-31 14:18:34,386 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0000 0.0294 0.9706
[2026-05-31 14:18:34,387 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:18:34,387 INFO] src.engine_hmm: TREND: return=0.002350, vol=-0.573471, rsi_slope=-0.002107
[2026-05-31 14:18:34,387 INFO] src.engine_hmm: MEAN_REVERSION: return=0.035514, vol=0.026997, rsi_slope=-0.001247
[2026-05-31 14:18:34,387 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=-0.096847, vol=1.511929, rsi_slope=0.008982
[2026-05-31 14:18:34,389 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:18:34,389 INFO] src.engine_hmm: Total regime transitions: 4190
[2026-05-31 14:18:34,391 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 06:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:34,391 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 17:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:34,391 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 23:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:34,392 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 09:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:34,392 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 11:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:34,392 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 16:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:34,393 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 02:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:34,393 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:34,393 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 21:45:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:34,394 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-03 01:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:41,049 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:18:41,049 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:18:41,050 INFO] src.engine_hmm: TREND 0.9810 0.0008 0.0182
[2026-05-31 14:18:41,050 INFO] src.engine_hmm: MEAN_REVERSION 0.0000 0.9696 0.0304
[2026-05-31 14:18:41,050 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0209 0.0086 0.9705
[2026-05-31 14:18:41,050 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:18:41,051 INFO] src.engine_hmm: TREND: return=0.018707, vol=-0.530375, rsi_slope=-0.000446
[2026-05-31 14:18:41,051 INFO] src.engine_hmm: MEAN_REVERSION: return=-0.111068, vol=1.611680, rsi_slope=0.006727
[2026-05-31 14:18:41,051 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=0.014191, vol=0.078276, rsi_slope=-0.001614
[2026-05-31 14:18:41,052 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:18:41,053 INFO] src.engine_hmm: Total regime transitions: 2168
[2026-05-31 14:18:41,053 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-21 01:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:41,053 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-21 15:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:41,053 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-24 01:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:41,054 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-24 15:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:41,054 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-24 20:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:41,054 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-25 09:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:41,054 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-25 14:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:41,054 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-25 17:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:41,054 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-25 22:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:41,054 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-26 04:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:41,676 INFO] src.engine_xgb: Features prepared: 114664 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:18:42,730 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:18:43,262 INFO] src.engine_xgb: XGB Train Acc: 0.4754 | Test Acc: 0.4524
[2026-05-31 14:18:43,262 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.09924446), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.04588077), 'atr_normalized': np.float32(0.057382327), 'prev_log_return': np.float32(0.048907924), 'usdchf_log_return': np.float32(0.0440717), 'xagusd_log_return': np.float32(0.048212472), 'xtiusd_log_return': np.float32(0.04841814), 'synth_vix_zscore': np.float32(0.05152543), 'atr_band_position': np.float32(0.07551128), 'hour_sin': np.float32(0.059858326), 'hour_cos': np.float32(0.05367501), 'minute_sin': np.float32(0.039781727), 'minute_cos': np.float32(0.035344962), 'atr_expansion_ratio': np.float32(0.057196528), 'realized_vol_ratio': np.float32(0.06355525), 'atr_slope': np.float32(0.051499028), 'minutes_from_london_open': np.float32(0.058930844), 'minutes_from_ny_open': np.float32(0.06100378)}
[2026-05-31 14:18:43,267 INFO] src.engine_xgb: [M15] TREND model: n=53092 train_acc=0.4754
[2026-05-31 14:18:43,716 INFO] src.engine_xgb: XGB Train Acc: 0.6053 | Test Acc: 0.5948
[2026-05-31 14:18:43,717 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.047962394), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.07143821), 'rsi_slope': np.float32(0.053683233), 'atr_normalized': np.float32(0.0617965), 'prev_log_return': np.float32(0.0417201), 'usdchf_log_return': np.float32(0.052694723), 'xagusd_log_return': np.float32(0.047399655), 'xtiusd_log_return': np.float32(0.046597555), 'synth_vix_zscore': np.float32(0.052385006), 'atr_band_position': np.float32(0.0689155), 'hour_sin': np.float32(0.05247748), 'hour_cos': np.float32(0.056240663), 'minute_sin': np.float32(0.037410386), 'minute_cos': np.float32(0.021167478), 'atr_expansion_ratio': np.float32(0.057565942), 'realized_vol_ratio': np.float32(0.06433145), 'atr_slope': np.float32(0.05381159), 'minutes_from_london_open': np.float32(0.062434826), 'minutes_from_ny_open': np.float32(0.049967274)}
[2026-05-31 14:18:43,721 INFO] src.engine_xgb: [M15] SHOCK model: n=61573 train_acc=0.6053
[2026-05-31 14:18:44,965 INFO] src.backtester: Backtest [M15]: Sharpe=-2.741 | MaxDD=0.078 | WR=0.350 | Return=-7.1% | Trades=100
[2026-05-31 14:18:44,965 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:18:52,706 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:18:52,706 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:18:52,707 INFO] src.engine_hmm: TREND 0.9828 0.0166 0.0006
[2026-05-31 14:18:52,707 INFO] src.engine_hmm: MEAN_REVERSION 0.0189 0.9729 0.0082
[2026-05-31 14:18:52,707 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0000 0.0278 0.9721
[2026-05-31 14:18:52,707 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:18:52,707 INFO] src.engine_hmm: TREND: return=0.014880, vol=-0.548177, rsi_slope=0.001510
[2026-05-31 14:18:52,707 INFO] src.engine_hmm: MEAN_REVERSION: return=0.052695, vol=0.076507, rsi_slope=-0.003237
[2026-05-31 14:18:52,707 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=-0.217711, vol=1.660736, rsi_slope=0.004964
[2026-05-31 14:18:52,709 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:18:52,710 INFO] src.engine_hmm: Total regime transitions: 1943
[2026-05-31 14:18:52,710 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-21 17:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:52,710 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-21 22:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:52,711 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-27 17:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:52,711 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-27 22:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:52,711 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-28 19:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:52,711 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-29 01:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:52,712 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-29 18:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:52,712 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-29 23:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:52,712 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-30 16:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:18:52,712 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-30 18:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:18:53,376 INFO] src.engine_xgb: Features prepared: 114777 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:18:54,367 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:18:54,883 INFO] src.engine_xgb: XGB Train Acc: 0.4893 | Test Acc: 0.4549
[2026-05-31 14:18:54,884 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.03878272), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.05239052), 'atr_normalized': np.float32(0.054765098), 'prev_log_return': np.float32(0.045935497), 'usdchf_log_return': np.float32(0.049025953), 'xagusd_log_return': np.float32(0.04451875), 'xtiusd_log_return': np.float32(0.04833673), 'synth_vix_zscore': np.float32(0.057521503), 'atr_band_position': np.float32(0.07813471), 'hour_sin': np.float32(0.07208353), 'hour_cos': np.float32(0.057333745), 'minute_sin': np.float32(0.036948018), 'minute_cos': np.float32(0.04077199), 'atr_expansion_ratio': np.float32(0.067970544), 'realized_vol_ratio': np.float32(0.068903506), 'atr_slope': np.float32(0.053237233), 'minutes_from_london_open': np.float32(0.06400329), 'minutes_from_ny_open': np.float32(0.0693368)}
[2026-05-31 14:18:54,889 INFO] src.engine_xgb: [M15] TREND model: n=52896 train_acc=0.4893
[2026-05-31 14:18:55,354 INFO] src.engine_xgb: XGB Train Acc: 0.5694 | Test Acc: 0.5548
[2026-05-31 14:18:55,355 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.05722446), 'state_2': np.float32(0.034059152), 'gmm_vol_cluster': np.float32(0.050673924), 'rsi_slope': np.float32(0.058725104), 'atr_normalized': np.float32(0.05987563), 'prev_log_return': np.float32(0.039794967), 'usdchf_log_return': np.float32(0.043576848), 'xagusd_log_return': np.float32(0.047087055), 'xtiusd_log_return': np.float32(0.037633367), 'synth_vix_zscore': np.float32(0.0580174), 'atr_band_position': np.float32(0.06577258), 'hour_sin': np.float32(0.053081498), 'hour_cos': np.float32(0.06525247), 'minute_sin': np.float32(0.028217698), 'minute_cos': np.float32(0.0), 'atr_expansion_ratio': np.float32(0.060850892), 'realized_vol_ratio': np.float32(0.056482986), 'atr_slope': np.float32(0.056523092), 'minutes_from_london_open': np.float32(0.06329175), 'minutes_from_ny_open': np.float32(0.06385917)}
[2026-05-31 14:18:55,361 INFO] src.engine_xgb: [M15] SHOCK model: n=61889 train_acc=0.5694
[2026-05-31 14:18:56,606 INFO] src.backtester: Backtest [M15]: Sharpe=-4.028 | MaxDD=0.165 | WR=0.283 | Return=-15.2% | Trades=180
[2026-05-31 14:18:56,607 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:19:05,144 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:19:05,144 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:19:05,144 INFO] src.engine_hmm: TREND 0.9791 0.0200 0.0009
[2026-05-31 14:19:05,145 INFO] src.engine_hmm: MEAN_REVERSION 0.0221 0.9633 0.0146
[2026-05-31 14:19:05,145 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0002 0.0298 0.9700
[2026-05-31 14:19:05,146 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:19:05,146 INFO] src.engine_hmm: TREND: return=0.018323, vol=-0.696535, rsi_slope=-0.000079
[2026-05-31 14:19:05,146 INFO] src.engine_hmm: MEAN_REVERSION: return=0.006747, vol=-0.024548, rsi_slope=-0.001411
[2026-05-31 14:19:05,147 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=-0.050535, vol=1.474160, rsi_slope=0.002880
[2026-05-31 14:19:05,148 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:19:05,150 INFO] src.engine_hmm: Total regime transitions: 2160
[2026-05-31 14:19:05,151 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-21 22:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:05,151 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-27 17:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:05,151 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-27 23:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:05,152 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-28 19:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:05,152 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-29 01:45:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:05,153 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-29 17:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:05,153 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-30 02:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:05,154 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-30 16:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:05,154 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-30 21:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:05,155 INFO] src.engine_hmm: REGIME CHANGE at 2018-12-03 09:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:05,906 INFO] src.engine_xgb: Features prepared: 114462 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:19:06,984 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:19:07,480 INFO] src.engine_xgb: XGB Train Acc: 0.5186 | Test Acc: 0.4985
[2026-05-31 14:19:07,480 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.039109103), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.065601625), 'atr_normalized': np.float32(0.050614037), 'prev_log_return': np.float32(0.051481362), 'usdchf_log_return': np.float32(0.049108315), 'xagusd_log_return': np.float32(0.060632408), 'xtiusd_log_return': np.float32(0.04384584), 'synth_vix_zscore': np.float32(0.047825117), 'atr_band_position': np.float32(0.07340312), 'hour_sin': np.float32(0.06713293), 'hour_cos': np.float32(0.055528224), 'minute_sin': np.float32(0.033532556), 'minute_cos': np.float32(0.035495017), 'atr_expansion_ratio': np.float32(0.05813816), 'realized_vol_ratio': np.float32(0.06727605), 'atr_slope': np.float32(0.052239537), 'minutes_from_london_open': np.float32(0.07711251), 'minutes_from_ny_open': np.float32(0.07192409)}
[2026-05-31 14:19:07,484 INFO] src.engine_xgb: [M15] TREND model: n=48110 train_acc=0.5186
[2026-05-31 14:19:08,262 INFO] src.engine_xgb: XGB Train Acc: 0.6051 | Test Acc: 0.5816
[2026-05-31 14:19:08,262 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.04922031), 'rsi_slope': np.float32(0.07298283), 'atr_normalized': np.float32(0.053964596), 'prev_log_return': np.float32(0.050578844), 'usdchf_log_return': np.float32(0.05165744), 'xagusd_log_return': np.float32(0.05001981), 'xtiusd_log_return': np.float32(0.045283772), 'synth_vix_zscore': np.float32(0.056817587), 'atr_band_position': np.float32(0.07893197), 'hour_sin': np.float32(0.061186895), 'hour_cos': np.float32(0.06564351), 'minute_sin': np.float32(0.034512706), 'minute_cos': np.float32(0.035237074), 'atr_expansion_ratio': np.float32(0.058341846), 'realized_vol_ratio': np.float32(0.0649026), 'atr_slope': np.float32(0.05928828), 'minutes_from_london_open': np.float32(0.053459533), 'minutes_from_ny_open': np.float32(0.057970427)}
[2026-05-31 14:19:08,268 INFO] src.engine_xgb: [M15] SHOCK model: n=66377 train_acc=0.6051
[2026-05-31 14:19:09,518 INFO] src.backtester: Backtest [M15]: Sharpe=-1.936 | MaxDD=0.110 | WR=0.424 | Return=-10.3% | Trades=184
[2026-05-31 14:19:09,518 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:19:17,478 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:19:17,478 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:19:17,478 INFO] src.engine_hmm: TREND 0.9824 0.0168 0.0008
[2026-05-31 14:19:17,478 INFO] src.engine_hmm: MEAN_REVERSION 0.0197 0.9717 0.0086
[2026-05-31 14:19:17,479 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0000 0.0277 0.9723
[2026-05-31 14:19:17,479 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:19:17,479 INFO] src.engine_hmm: TREND: return=-0.011181, vol=-0.509468, rsi_slope=-0.003077
[2026-05-31 14:19:17,479 INFO] src.engine_hmm: MEAN_REVERSION: return=0.044606, vol=0.041285, rsi_slope=-0.001461
[2026-05-31 14:19:17,479 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=-0.093663, vol=1.548502, rsi_slope=0.014345
[2026-05-31 14:19:17,481 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:19:17,481 INFO] src.engine_hmm: Total regime transitions: 2004
[2026-05-31 14:19:17,482 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 06:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:17,482 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 17:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:17,483 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 23:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:17,483 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 09:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:17,483 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 11:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:17,484 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 16:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:17,484 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 02:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:17,484 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:17,484 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 21:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:17,485 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-03 01:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:18,178 INFO] src.engine_xgb: Features prepared: 115102 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:19:19,159 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:19:19,755 INFO] src.engine_xgb: XGB Train Acc: 0.5966 | Test Acc: 0.5610
[2026-05-31 14:19:19,756 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.056045882), 'atr_normalized': np.float32(0.06383249), 'prev_log_return': np.float32(0.0495679), 'usdchf_log_return': np.float32(0.04824622), 'xagusd_log_return': np.float32(0.04829003), 'xtiusd_log_return': np.float32(0.042848032), 'synth_vix_zscore': np.float32(0.052434754), 'atr_band_position': np.float32(0.06604762), 'hour_sin': np.float32(0.07337481), 'hour_cos': np.float32(0.07589151), 'minute_sin': np.float32(0.04769276), 'minute_cos': np.float32(0.04895845), 'atr_expansion_ratio': np.float32(0.056669556), 'realized_vol_ratio': np.float32(0.066008694), 'atr_slope': np.float32(0.05225158), 'minutes_from_london_open': np.float32(0.07343819), 'minutes_from_ny_open': np.float32(0.07840157)}
[2026-05-31 14:19:19,760 INFO] src.engine_xgb: [M15] TREND model: n=53012 train_acc=0.5966
[2026-05-31 14:19:20,704 INFO] src.engine_xgb: XGB Train Acc: 0.5637 | Test Acc: 0.5162
[2026-05-31 14:19:20,704 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.0431224), 'state_2': np.float32(0.050399266), 'gmm_vol_cluster': np.float32(0.060558017), 'rsi_slope': np.float32(0.046598386), 'atr_normalized': np.float32(0.056047447), 'prev_log_return': np.float32(0.042802047), 'usdchf_log_return': np.float32(0.045947596), 'xagusd_log_return': np.float32(0.043778934), 'xtiusd_log_return': np.float32(0.042231556), 'synth_vix_zscore': np.float32(0.048584875), 'atr_band_position': np.float32(0.056806654), 'hour_sin': np.float32(0.050386548), 'hour_cos': np.float32(0.052244343), 'minute_sin': np.float32(0.041990384), 'minute_cos': np.float32(0.041090444), 'atr_expansion_ratio': np.float32(0.053570103), 'realized_vol_ratio': np.float32(0.05638072), 'atr_slope': np.float32(0.049675103), 'minutes_from_london_open': np.float32(0.057966035), 'minutes_from_ny_open': np.float32(0.05981909)}
[2026-05-31 14:19:20,710 INFO] src.engine_xgb: [M15] SHOCK model: n=62104 train_acc=0.5637
[2026-05-31 14:19:22,171 INFO] src.backtester: Backtest [M15]: Sharpe=-3.579 | MaxDD=0.209 | WR=0.405 | Return=-18.8% | Trades=375
[2026-05-31 14:19:22,171 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:19:32,561 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:19:32,562 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:19:32,562 INFO] src.engine_hmm: TREND 0.9776 0.0016 0.0208
[2026-05-31 14:19:32,562 INFO] src.engine_hmm: MEAN_REVERSION 0.0006 0.9677 0.0317
[2026-05-31 14:19:32,562 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0247 0.0145 0.9608
[2026-05-31 14:19:32,562 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:19:32,563 INFO] src.engine_hmm: TREND: return=-0.003079, vol=-0.687420, rsi_slope=-0.001986
[2026-05-31 14:19:32,563 INFO] src.engine_hmm: MEAN_REVERSION: return=0.032870, vol=1.499814, rsi_slope=0.006654
[2026-05-31 14:19:32,563 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=-0.013118, vol=0.012664, rsi_slope=-0.001132
[2026-05-31 14:19:32,565 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:19:32,565 INFO] src.engine_hmm: Total regime transitions: 2374
[2026-05-31 14:19:32,566 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 08:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:32,566 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:32,566 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 14:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:32,566 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:32,567 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 02:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:32,567 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 04:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:32,567 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 10:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:32,567 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:32,567 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 22:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:32,568 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-03 01:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:33,212 INFO] src.engine_xgb: Features prepared: 114593 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:19:34,221 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:19:34,694 INFO] src.engine_xgb: XGB Train Acc: 0.6077 | Test Acc: 0.5729
[2026-05-31 14:19:34,694 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.06413787), 'atr_normalized': np.float32(0.064936936), 'prev_log_return': np.float32(0.045303524), 'usdchf_log_return': np.float32(0.04474635), 'xagusd_log_return': np.float32(0.050383482), 'xtiusd_log_return': np.float32(0.052180845), 'synth_vix_zscore': np.float32(0.048142064), 'atr_band_position': np.float32(0.069744654), 'hour_sin': np.float32(0.08822249), 'hour_cos': np.float32(0.062268447), 'minute_sin': np.float32(0.03497928), 'minute_cos': np.float32(0.051707122), 'atr_expansion_ratio': np.float32(0.054995827), 'realized_vol_ratio': np.float32(0.066892385), 'atr_slope': np.float32(0.054010686), 'minutes_from_london_open': np.float32(0.06780134), 'minutes_from_ny_open': np.float32(0.07954667)}
[2026-05-31 14:19:34,699 INFO] src.engine_xgb: [M15] TREND model: n=49663 train_acc=0.6077
[2026-05-31 14:19:35,281 INFO] src.engine_xgb: XGB Train Acc: 0.6112 | Test Acc: 0.5923
[2026-05-31 14:19:35,281 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.04349586), 'state_2': np.float32(0.033570886), 'gmm_vol_cluster': np.float32(0.059280574), 'rsi_slope': np.float32(0.051480077), 'atr_normalized': np.float32(0.05377607), 'prev_log_return': np.float32(0.04509314), 'usdchf_log_return': np.float32(0.046198595), 'xagusd_log_return': np.float32(0.04163822), 'xtiusd_log_return': np.float32(0.043332938), 'synth_vix_zscore': np.float32(0.05024658), 'atr_band_position': np.float32(0.05784221), 'hour_sin': np.float32(0.054228734), 'hour_cos': np.float32(0.0653816), 'minute_sin': np.float32(0.031109942), 'minute_cos': np.float32(0.031960074), 'atr_expansion_ratio': np.float32(0.053959005), 'realized_vol_ratio': np.float32(0.05511491), 'atr_slope': np.float32(0.05574075), 'minutes_from_london_open': np.float32(0.062706895), 'minutes_from_ny_open': np.float32(0.06384299)}
[2026-05-31 14:19:35,287 INFO] src.engine_xgb: [M15] SHOCK model: n=64968 train_acc=0.6112
[2026-05-31 14:19:36,511 INFO] src.backtester: Backtest [M15]: Sharpe=-0.668 | MaxDD=0.022 | WR=0.429 | Return=-1.5% | Trades=63
[2026-05-31 14:19:36,512 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:19:44,171 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:19:44,171 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:19:44,172 INFO] src.engine_hmm: TREND 0.9805 0.0010 0.0185
[2026-05-31 14:19:44,172 INFO] src.engine_hmm: MEAN_REVERSION 0.0003 0.9724 0.0273
[2026-05-31 14:19:44,172 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0221 0.0122 0.9657
[2026-05-31 14:19:44,172 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:19:44,172 INFO] src.engine_hmm: TREND: return=-0.020580, vol=-0.649099, rsi_slope=-0.002780
[2026-05-31 14:19:44,172 INFO] src.engine_hmm: MEAN_REVERSION: return=-0.072931, vol=1.555773, rsi_slope=0.006424
[2026-05-31 14:19:44,173 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=0.058720, vol=-0.007109, rsi_slope=0.000085
[2026-05-31 14:19:44,174 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:19:44,175 INFO] src.engine_hmm: Total regime transitions: 2118
[2026-05-31 14:19:44,175 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 08:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:44,175 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:44,175 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 23:45:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:44,176 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 05:45:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:44,176 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 13:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:44,176 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:44,176 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 02:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:44,177 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 05:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:44,177 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 09:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:19:44,177 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:19:44,854 INFO] src.engine_xgb: Features prepared: 115110 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:19:45,832 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:19:46,455 INFO] src.engine_xgb: XGB Train Acc: 0.6006 | Test Acc: 0.5515
[2026-05-31 14:19:46,456 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.045002095), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.055584844), 'atr_normalized': np.float32(0.056371473), 'prev_log_return': np.float32(0.042951886), 'usdchf_log_return': np.float32(0.048667368), 'xagusd_log_return': np.float32(0.04567278), 'xtiusd_log_return': np.float32(0.045565948), 'synth_vix_zscore': np.float32(0.05319591), 'atr_band_position': np.float32(0.068541385), 'hour_sin': np.float32(0.067597546), 'hour_cos': np.float32(0.067387894), 'minute_sin': np.float32(0.05307642), 'minute_cos': np.float32(0.040697828), 'atr_expansion_ratio': np.float32(0.057731472), 'realized_vol_ratio': np.float32(0.06767854), 'atr_slope': np.float32(0.04889508), 'minutes_from_london_open': np.float32(0.06114819), 'minutes_from_ny_open': np.float32(0.07423321)}
[2026-05-31 14:19:46,462 INFO] src.engine_xgb: [M15] TREND model: n=50863 train_acc=0.6006
[2026-05-31 14:19:47,767 INFO] src.engine_xgb: XGB Train Acc: 0.5986 | Test Acc: 0.5596
[2026-05-31 14:19:47,767 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.041569702), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.051417343), 'rsi_slope': np.float32(0.057916123), 'atr_normalized': np.float32(0.055396404), 'prev_log_return': np.float32(0.050578333), 'usdchf_log_return': np.float32(0.044301722), 'xagusd_log_return': np.float32(0.046643306), 'xtiusd_log_return': np.float32(0.049502086), 'synth_vix_zscore': np.float32(0.057701197), 'atr_band_position': np.float32(0.057754777), 'hour_sin': np.float32(0.059958987), 'hour_cos': np.float32(0.056692794), 'minute_sin': np.float32(0.04190625), 'minute_cos': np.float32(0.040942512), 'atr_expansion_ratio': np.float32(0.055805013), 'realized_vol_ratio': np.float32(0.062427633), 'atr_slope': np.float32(0.05484674), 'minutes_from_london_open': np.float32(0.054244995), 'minutes_from_ny_open': np.float32(0.060394157)}
[2026-05-31 14:19:47,773 INFO] src.engine_xgb: [M15] SHOCK model: n=64264 train_acc=0.5986
[2026-05-31 14:19:49,144 INFO] src.backtester: Backtest [M15]: Sharpe=-3.245 | MaxDD=0.232 | WR=0.453 | Return=-20.5% | Trades=466
[2026-05-31 14:19:49,144 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:19:49,266 INFO] src.optimizer: CPCV [M15]: 4/6 valid paths | median_score=-1.329 std=0.491 | path_penalty=3.0 | final_score=-4.452
[2026-05-31 14:19:49,290 INFO] src.optimizer: trial=1 tf=M15 base=-1.0431 p_var=0.1122 p_inst=1.0000 p_dd=0.0000 p_mr=0.0000 p_floor=56.8447 p_turn=0.0000 p_occ=0.0000 p_m15=0.0000 final=-59.0000 reasons=floor_sharpe:-2.993<0.200|floor_pf:0.307<1.050
[2026-05-31 14:19:49,594 INFO] src.optimizer: tf=M15 | trial=1 | objective_score=-59.0 | cpcv_mean_score=-4.4518 | cpcv_std_score=1.1216 | valid_paths=4 | total_paths=6 | sharpe_median=-2.9934 | pf_median=0.3074 | calmar_median=-0.8936 | expectancy_median=-0.000573 | floating_dd_median=0.1403 | trades_median=182 | mr_leak_count=0 | regime_occupancy={'TREND': 44.17071952381272, 'MEAN_REVERSION': 0.0, 'VOLATILITY_SHOCK': 55.829280476187286} | trade_distribution={'TREND': 18, 'MEAN_REVERSION': 0, 'VOLATILITY_SHOCK': 114} | activation_events=0 | partial_close_events=0 | trail_updates=0 | regime_shift_forced_closes=29 | avg_activation_pnl_usd=0.0 | pruned=False | elapsed_sec=90.7
Best trial: 1. Best value: -59: 1%|▌ | 2/300 [03:12<7:54:03, 95.45s/it][2026-05-31 14:20:01,773 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:20:01,773 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:20:01,773 INFO] src.engine_hmm: TREND 0.9804 0.0186 0.0010
[2026-05-31 14:20:01,773 INFO] src.engine_hmm: MEAN_REVERSION 0.0212 0.9679 0.0109
[2026-05-31 14:20:01,774 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0000 0.0310 0.9689
[2026-05-31 14:20:01,774 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:20:01,774 INFO] src.engine_hmm: TREND: return=0.001939, vol=-0.572783, rsi_slope=-0.001996
[2026-05-31 14:20:01,774 INFO] src.engine_hmm: MEAN_REVERSION: return=0.032781, vol=0.031279, rsi_slope=-0.000749
[2026-05-31 14:20:01,774 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=-0.090498, vol=1.530324, rsi_slope=0.007559
[2026-05-31 14:20:01,776 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:20:01,777 INFO] src.engine_hmm: Total regime transitions: 4304
[2026-05-31 14:20:01,777 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 05:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:01,777 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 17:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:01,777 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 23:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:01,778 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 06:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:01,778 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 11:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:01,778 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 16:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:01,778 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 02:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:01,778 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:01,779 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 21:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:01,779 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-03 01:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:09,206 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:20:09,206 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:20:09,207 INFO] src.engine_hmm: TREND 0.9803 0.0008 0.0188
[2026-05-31 14:20:09,207 INFO] src.engine_hmm: MEAN_REVERSION 0.0000 0.9676 0.0324
[2026-05-31 14:20:09,207 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0217 0.0093 0.9690
[2026-05-31 14:20:09,208 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:20:09,208 INFO] src.engine_hmm: TREND: return=0.015188, vol=-0.530935, rsi_slope=-0.000084
[2026-05-31 14:20:09,208 INFO] src.engine_hmm: MEAN_REVERSION: return=-0.113245, vol=1.605524, rsi_slope=0.006215
[2026-05-31 14:20:09,208 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=0.019075, vol=0.076869, rsi_slope=-0.001871
[2026-05-31 14:20:09,211 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:20:09,212 INFO] src.engine_hmm: Total regime transitions: 2230
[2026-05-31 14:20:09,212 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-21 01:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:09,213 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-21 15:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:09,213 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-24 01:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:09,213 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-24 15:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:09,214 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-24 20:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:09,214 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-25 09:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:09,214 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-25 14:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:09,214 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-25 17:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:09,215 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-25 22:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:09,215 INFO] src.engine_hmm: REGIME CHANGE at 2021-05-26 05:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:09,987 INFO] src.engine_xgb: Features prepared: 114664 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:20:11,062 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:20:11,707 INFO] src.engine_xgb: XGB Train Acc: 0.5895 | Test Acc: 0.5823
[2026-05-31 14:20:11,708 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.066483065), 'atr_normalized': np.float32(0.0705132), 'prev_log_return': np.float32(0.056951556), 'usdchf_log_return': np.float32(0.05785124), 'xagusd_log_return': np.float32(0.060617395), 'xtiusd_log_return': np.float32(0.0773367), 'synth_vix_zscore': np.float32(0.061789334), 'atr_band_position': np.float32(0.08892724), 'hour_sin': np.float32(0.06989577), 'hour_cos': np.float32(0.074237436), 'minute_sin': np.float32(0.0), 'minute_cos': np.float32(0.0), 'atr_expansion_ratio': np.float32(0.06407814), 'realized_vol_ratio': np.float32(0.064420216), 'atr_slope': np.float32(0.058815263), 'minutes_from_london_open': np.float32(0.067619815), 'minutes_from_ny_open': np.float32(0.060463663)}
[2026-05-31 14:20:11,715 INFO] src.engine_xgb: [M15] TREND model: n=53202 train_acc=0.5895
[2026-05-31 14:20:12,190 INFO] src.engine_xgb: XGB Train Acc: 0.6039 | Test Acc: 0.6043
[2026-05-31 14:20:12,191 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0785204), 'rsi_slope': np.float32(0.067405425), 'atr_normalized': np.float32(0.05730267), 'prev_log_return': np.float32(0.056487948), 'usdchf_log_return': np.float32(0.066237934), 'xagusd_log_return': np.float32(0.065544955), 'xtiusd_log_return': np.float32(0.054080393), 'synth_vix_zscore': np.float32(0.059108064), 'atr_band_position': np.float32(0.073082194), 'hour_sin': np.float32(0.04884035), 'hour_cos': np.float32(0.056097142), 'minute_sin': np.float32(0.0), 'minute_cos': np.float32(0.0), 'atr_expansion_ratio': np.float32(0.065741256), 'realized_vol_ratio': np.float32(0.06658904), 'atr_slope': np.float32(0.061977707), 'minutes_from_london_open': np.float32(0.05651554), 'minutes_from_ny_open': np.float32(0.066469036)}
[2026-05-31 14:20:12,198 INFO] src.engine_xgb: [M15] SHOCK model: n=61463 train_acc=0.6039
[2026-05-31 14:20:13,702 INFO] src.backtester: Backtest [M15]: Sharpe=-3.947 | MaxDD=0.144 | WR=0.306 | Return=-13.4% | Trades=173
[2026-05-31 14:20:13,703 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:20:21,322 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:20:21,322 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:20:21,322 INFO] src.engine_hmm: TREND 0.9820 0.0173 0.0008
[2026-05-31 14:20:21,322 INFO] src.engine_hmm: MEAN_REVERSION 0.0198 0.9717 0.0085
[2026-05-31 14:20:21,322 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0000 0.0297 0.9703
[2026-05-31 14:20:21,323 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:20:21,323 INFO] src.engine_hmm: TREND: return=0.014839, vol=-0.548497, rsi_slope=0.000835
[2026-05-31 14:20:21,323 INFO] src.engine_hmm: MEAN_REVERSION: return=0.049663, vol=0.079313, rsi_slope=-0.002027
[2026-05-31 14:20:21,323 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=-0.209923, vol=1.668938, rsi_slope=0.003522
[2026-05-31 14:20:21,325 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:20:21,325 INFO] src.engine_hmm: Total regime transitions: 2019
[2026-05-31 14:20:21,325 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-21 17:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:21,326 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-21 22:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:21,326 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-27 17:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:21,326 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-27 22:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:21,327 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-28 19:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:21,327 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-29 01:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:21,327 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-29 18:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:21,327 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-29 23:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:21,327 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-30 16:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:21,327 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-30 18:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:21,985 INFO] src.engine_xgb: Features prepared: 114777 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:20:23,029 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:20:23,816 INFO] src.engine_xgb: XGB Train Acc: 0.5858 | Test Acc: 0.5819
[2026-05-31 14:20:23,817 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.06864804), 'atr_normalized': np.float32(0.063087344), 'prev_log_return': np.float32(0.061921395), 'usdchf_log_return': np.float32(0.056549247), 'xagusd_log_return': np.float32(0.06418795), 'xtiusd_log_return': np.float32(0.059022892), 'synth_vix_zscore': np.float32(0.061216332), 'atr_band_position': np.float32(0.08632375), 'hour_sin': np.float32(0.066852406), 'hour_cos': np.float32(0.06639091), 'minute_sin': np.float32(0.0), 'minute_cos': np.float32(0.0), 'atr_expansion_ratio': np.float32(0.06905182), 'realized_vol_ratio': np.float32(0.06275543), 'atr_slope': np.float32(0.061236195), 'minutes_from_london_open': np.float32(0.07391932), 'minutes_from_ny_open': np.float32(0.07883701)}
[2026-05-31 14:20:23,822 INFO] src.engine_xgb: [M15] TREND model: n=53089 train_acc=0.5858
[2026-05-31 14:20:24,361 INFO] src.engine_xgb: XGB Train Acc: 0.6000 | Test Acc: 0.6015
[2026-05-31 14:20:24,361 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.06826617), 'state_2': np.float32(0.05597011), 'gmm_vol_cluster': np.float32(0.057576917), 'rsi_slope': np.float32(0.062739685), 'atr_normalized': np.float32(0.054725416), 'prev_log_return': np.float32(0.03916601), 'usdchf_log_return': np.float32(0.051434886), 'xagusd_log_return': np.float32(0.04411479), 'xtiusd_log_return': np.float32(0.050367434), 'synth_vix_zscore': np.float32(0.06726144), 'atr_band_position': np.float32(0.06118668), 'hour_sin': np.float32(0.05081814), 'hour_cos': np.float32(0.058317628), 'minute_sin': np.float32(0.0), 'minute_cos': np.float32(0.0), 'atr_expansion_ratio': np.float32(0.05652301), 'realized_vol_ratio': np.float32(0.056437265), 'atr_slope': np.float32(0.050614458), 'minutes_from_london_open': np.float32(0.055672575), 'minutes_from_ny_open': np.float32(0.058807388)}
[2026-05-31 14:20:24,366 INFO] src.engine_xgb: [M15] SHOCK model: n=61696 train_acc=0.6000
[2026-05-31 14:20:25,718 INFO] src.backtester: Backtest [M15]: Sharpe=-3.391 | MaxDD=0.107 | WR=0.282 | Return=-10.1% | Trades=117
[2026-05-31 14:20:25,718 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:20:32,210 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:20:32,210 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:20:32,210 INFO] src.engine_hmm: TREND 0.9787 0.0202 0.0011
[2026-05-31 14:20:32,211 INFO] src.engine_hmm: MEAN_REVERSION 0.0227 0.9625 0.0148
[2026-05-31 14:20:32,211 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0001 0.0310 0.9689
[2026-05-31 14:20:32,211 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:20:32,211 INFO] src.engine_hmm: TREND: return=0.015446, vol=-0.694627, rsi_slope=-0.000185
[2026-05-31 14:20:32,211 INFO] src.engine_hmm: MEAN_REVERSION: return=0.006224, vol=-0.018603, rsi_slope=-0.001586
[2026-05-31 14:20:32,211 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=-0.044499, vol=1.490173, rsi_slope=0.003489
[2026-05-31 14:20:32,213 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:20:32,213 INFO] src.engine_hmm: Total regime transitions: 2205
[2026-05-31 14:20:32,214 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-21 15:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:32,214 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-21 22:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:32,214 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-27 17:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:32,214 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-27 22:45:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:32,214 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-28 19:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:32,215 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-29 01:45:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:32,215 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-29 17:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:32,215 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-30 01:45:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:32,215 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-30 16:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:32,215 INFO] src.engine_hmm: REGIME CHANGE at 2018-11-30 21:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:32,862 INFO] src.engine_xgb: Features prepared: 114462 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:20:33,851 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:20:34,230 INFO] src.engine_xgb: XGB Train Acc: 0.5968 | Test Acc: 0.5909
[2026-05-31 14:20:34,230 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.07144785), 'atr_normalized': np.float32(0.071801186), 'prev_log_return': np.float32(0.058566354), 'usdchf_log_return': np.float32(0.057381045), 'xagusd_log_return': np.float32(0.052882906), 'xtiusd_log_return': np.float32(0.05582125), 'synth_vix_zscore': np.float32(0.055723857), 'atr_band_position': np.float32(0.08762089), 'hour_sin': np.float32(0.065011024), 'hour_cos': np.float32(0.061005406), 'minute_sin': np.float32(0.0), 'minute_cos': np.float32(0.0), 'atr_expansion_ratio': np.float32(0.06341339), 'realized_vol_ratio': np.float32(0.06283519), 'atr_slope': np.float32(0.0488392), 'minutes_from_london_open': np.float32(0.082093924), 'minutes_from_ny_open': np.float32(0.10555655)}
[2026-05-31 14:20:34,231 INFO] src.engine_xgb: [M15] TREND model: n=48415 train_acc=0.5968
[2026-05-31 14:20:34,897 INFO] src.engine_xgb: XGB Train Acc: 0.6154 | Test Acc: 0.6157
[2026-05-31 14:20:34,897 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.049921893), 'rsi_slope': np.float32(0.06804432), 'atr_normalized': np.float32(0.058092237), 'prev_log_return': np.float32(0.046415605), 'usdchf_log_return': np.float32(0.057288002), 'xagusd_log_return': np.float32(0.0644784), 'xtiusd_log_return': np.float32(0.047503732), 'synth_vix_zscore': np.float32(0.061068628), 'atr_band_position': np.float32(0.0809428), 'hour_sin': np.float32(0.058959857), 'hour_cos': np.float32(0.06461373), 'minute_sin': np.float32(0.045425095), 'minute_cos': np.float32(0.0), 'atr_expansion_ratio': np.float32(0.057685282), 'realized_vol_ratio': np.float32(0.05841162), 'atr_slope': np.float32(0.059734207), 'minutes_from_london_open': np.float32(0.05137043), 'minutes_from_ny_open': np.float32(0.070044175)}
[2026-05-31 14:20:34,906 INFO] src.engine_xgb: [M15] SHOCK model: n=66072 train_acc=0.6154
[2026-05-31 14:20:36,286 INFO] src.backtester: Backtest [M15]: Sharpe=-5.480 | MaxDD=0.453 | WR=0.353 | Return=-36.4% | Trades=688
[2026-05-31 14:20:36,286 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:20:43,156 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:20:43,156 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:20:43,156 INFO] src.engine_hmm: TREND 0.9819 0.0172 0.0009
[2026-05-31 14:20:43,157 INFO] src.engine_hmm: MEAN_REVERSION 0.0204 0.9705 0.0091
[2026-05-31 14:20:43,157 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0000 0.0293 0.9706
[2026-05-31 14:20:43,157 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:20:43,157 INFO] src.engine_hmm: TREND: return=-0.007376, vol=-0.509791, rsi_slope=-0.002962
[2026-05-31 14:20:43,157 INFO] src.engine_hmm: MEAN_REVERSION: return=0.045785, vol=0.040465, rsi_slope=-0.001401
[2026-05-31 14:20:43,157 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=-0.108910, vol=1.547034, rsi_slope=0.013741
[2026-05-31 14:20:43,159 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:20:43,159 INFO] src.engine_hmm: Total regime transitions: 1020
[2026-05-31 14:20:43,160 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-03 15:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:43,160 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-03 20:30:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:43,160 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-15 21:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:43,160 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-16 03:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:43,161 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-16 19:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:43,161 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-17 02:45:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:43,161 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-20 01:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:43,161 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-20 06:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:43,161 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-21 14:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:43,161 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-21 20:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:43,820 INFO] src.engine_xgb: Features prepared: 115102 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:20:44,808 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:20:45,428 INFO] src.engine_xgb: XGB Train Acc: 0.6033 | Test Acc: 0.6069
[2026-05-31 14:20:45,428 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.03571029), 'state_1': np.float32(0.051009815), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.052845955), 'rsi_slope': np.float32(0.06515309), 'atr_normalized': np.float32(0.060289074), 'prev_log_return': np.float32(0.0523308), 'usdchf_log_return': np.float32(0.042298947), 'xagusd_log_return': np.float32(0.043103456), 'xtiusd_log_return': np.float32(0.046601962), 'synth_vix_zscore': np.float32(0.047891155), 'atr_band_position': np.float32(0.06111056), 'hour_sin': np.float32(0.050703), 'hour_cos': np.float32(0.06940792), 'minute_sin': np.float32(0.034119423), 'minute_cos': np.float32(0.0), 'atr_expansion_ratio': np.float32(0.050240975), 'realized_vol_ratio': np.float32(0.048358597), 'atr_slope': np.float32(0.0457661), 'minutes_from_london_open': np.float32(0.06364664), 'minutes_from_ny_open': np.float32(0.07941229)}
[2026-05-31 14:20:45,439 INFO] src.engine_xgb: [M15] TREND model: n=99687 train_acc=0.6033
[2026-05-31 14:20:45,700 INFO] src.engine_xgb: XGB Train Acc: 0.5884 | Test Acc: 0.5702
[2026-05-31 14:20:45,700 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.06323509), 'atr_normalized': np.float32(0.07716855), 'prev_log_return': np.float32(0.0570242), 'usdchf_log_return': np.float32(0.066175714), 'xagusd_log_return': np.float32(0.06324922), 'xtiusd_log_return': np.float32(0.06280271), 'synth_vix_zscore': np.float32(0.07578861), 'atr_band_position': np.float32(0.07460504), 'hour_sin': np.float32(0.0), 'hour_cos': np.float32(0.09683844), 'minute_sin': np.float32(0.0), 'minute_cos': np.float32(0.0), 'atr_expansion_ratio': np.float32(0.06995986), 'realized_vol_ratio': np.float32(0.068757996), 'atr_slope': np.float32(0.070044145), 'minutes_from_london_open': np.float32(0.08740011), 'minutes_from_ny_open': np.float32(0.06695033)}
[2026-05-31 14:20:45,701 INFO] src.engine_xgb: [M15] SHOCK model: n=15429 train_acc=0.5884
[2026-05-31 14:20:47,044 INFO] src.backtester: Backtest [M15]: Sharpe=-0.984 | MaxDD=0.033 | WR=0.333 | Return=-2.7% | Trades=24
[2026-05-31 14:20:47,044 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:20:53,663 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:20:53,663 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:20:53,663 INFO] src.engine_hmm: TREND 0.9774 0.0207 0.0019
[2026-05-31 14:20:53,663 INFO] src.engine_hmm: MEAN_REVERSION 0.0256 0.9598 0.0146
[2026-05-31 14:20:53,663 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0005 0.0333 0.9662
[2026-05-31 14:20:53,663 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:20:53,663 INFO] src.engine_hmm: TREND: return=0.005804, vol=-0.683066, rsi_slope=-0.002544
[2026-05-31 14:20:53,665 INFO] src.engine_hmm: MEAN_REVERSION: return=-0.020118, vol=0.024690, rsi_slope=-0.001003
[2026-05-31 14:20:53,665 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=0.027068, vol=1.521528, rsi_slope=0.007866
[2026-05-31 14:20:53,666 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:20:53,667 INFO] src.engine_hmm: Total regime transitions: 2456
[2026-05-31 14:20:53,667 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 08:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:53,667 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:53,667 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 23:45:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:53,668 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 05:45:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:53,668 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 14:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:53,668 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:53,668 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 02:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:53,669 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 04:30:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:53,669 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 10:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:20:53,669 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:20:54,325 INFO] src.engine_xgb: Features prepared: 114593 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:20:55,502 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:20:56,309 INFO] src.engine_xgb: XGB Train Acc: 0.6137 | Test Acc: 0.5995
[2026-05-31 14:20:56,310 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.065941796), 'atr_normalized': np.float32(0.06103087), 'prev_log_return': np.float32(0.05084413), 'usdchf_log_return': np.float32(0.044450212), 'xagusd_log_return': np.float32(0.055766802), 'xtiusd_log_return': np.float32(0.05417499), 'synth_vix_zscore': np.float32(0.06510732), 'atr_band_position': np.float32(0.06628435), 'hour_sin': np.float32(0.0849722), 'hour_cos': np.float32(0.067763776), 'minute_sin': np.float32(0.0), 'minute_cos': np.float32(0.06541588), 'atr_expansion_ratio': np.float32(0.056964878), 'realized_vol_ratio': np.float32(0.060526013), 'atr_slope': np.float32(0.049611542), 'minutes_from_london_open': np.float32(0.0627996), 'minutes_from_ny_open': np.float32(0.08834555)}
[2026-05-31 14:20:56,311 INFO] src.engine_xgb: [M15] TREND model: n=50535 train_acc=0.6137
[2026-05-31 14:20:56,861 INFO] src.engine_xgb: XGB Train Acc: 0.6128 | Test Acc: 0.6146
[2026-05-31 14:20:56,861 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.07290125), 'rsi_slope': np.float32(0.061617732), 'atr_normalized': np.float32(0.057012472), 'prev_log_return': np.float32(0.055262607), 'usdchf_log_return': np.float32(0.054537777), 'xagusd_log_return': np.float32(0.050594065), 'xtiusd_log_return': np.float32(0.04964695), 'synth_vix_zscore': np.float32(0.06684804), 'atr_band_position': np.float32(0.06692145), 'hour_sin': np.float32(0.06429222), 'hour_cos': np.float32(0.06564411), 'minute_sin': np.float32(0.0), 'minute_cos': np.float32(0.0), 'atr_expansion_ratio': np.float32(0.06972262), 'realized_vol_ratio': np.float32(0.06455317), 'atr_slope': np.float32(0.06250669), 'minutes_from_london_open': np.float32(0.07253263), 'minutes_from_ny_open': np.float32(0.06540626)}
[2026-05-31 14:20:56,870 INFO] src.engine_xgb: [M15] SHOCK model: n=64096 train_acc=0.6128
[2026-05-31 14:20:58,286 INFO] src.backtester: Backtest [M15]: Sharpe=-5.772 | MaxDD=0.487 | WR=0.381 | Return=-38.4% | Trades=808
[2026-05-31 14:20:58,286 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:21:04,355 INFO] src.engine_hmm: Transition Matrix:
[2026-05-31 14:21:04,355 INFO] src.engine_hmm: TREND MEAN_REVERSION VOLATILITY_SHOCK
[2026-05-31 14:21:04,356 INFO] src.engine_hmm: TREND 0.9799 0.0189 0.0012
[2026-05-31 14:21:04,356 INFO] src.engine_hmm: MEAN_REVERSION 0.0227 0.9651 0.0122
[2026-05-31 14:21:04,356 INFO] src.engine_hmm: VOLATILITY_SHOCK 0.0003 0.0281 0.9716
[2026-05-31 14:21:04,356 INFO] src.engine_hmm: State means (scaled: kalman_return, volatility, rsi_slope):
[2026-05-31 14:21:04,356 INFO] src.engine_hmm: TREND: return=-0.012072, vol=-0.650273, rsi_slope=-0.003168
[2026-05-31 14:21:04,357 INFO] src.engine_hmm: MEAN_REVERSION: return=0.042883, vol=-0.006789, rsi_slope=0.000958
[2026-05-31 14:21:04,357 INFO] src.engine_hmm: VOLATILITY_SHOCK: return=-0.061173, vol=1.561205, rsi_slope=0.005529
[2026-05-31 14:21:04,358 INFO] src.engine_hmm: Regime diagnostics written → models\regime_diagnostics_M15.json
[2026-05-31 14:21:04,359 INFO] src.engine_hmm: Total regime transitions: 2180
[2026-05-31 14:21:04,360 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 08:00:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:21:04,360 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:21:04,360 INFO] src.engine_hmm: REGIME CHANGE at 2016-05-31 23:45:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:21:04,361 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 05:45:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:21:04,361 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 13:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:21:04,361 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-01 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:21:04,361 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 02:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:21:04,361 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 05:15:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:21:04,362 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 10:15:00: VOLATILITY_SHOCK -> TREND
[2026-05-31 14:21:04,362 INFO] src.engine_hmm: REGIME CHANGE at 2016-06-02 16:00:00: TREND -> VOLATILITY_SHOCK
[2026-05-31 14:21:05,039 INFO] src.engine_xgb: Features prepared: 115110 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:21:06,034 INFO] src.engine_xgb: Features prepared: 229979 samples, 21 features: ['state_0', 'state_1', 'state_2', 'gmm_vol_cluster', 'rsi_slope', 'atr_normalized', 'prev_log_return', 'usdchf_log_return', 'xagusd_log_return', 'xtiusd_log_return', 'synth_vix_zscore', 'atr_band_position', 'hour_sin', 'hour_cos', 'minute_sin', 'minute_cos', 'atr_expansion_ratio', 'realized_vol_ratio', 'atr_slope', 'minutes_from_london_open', 'minutes_from_ny_open']
[2026-05-31 14:21:06,580 INFO] src.engine_xgb: XGB Train Acc: 0.6113 | Test Acc: 0.5827
[2026-05-31 14:21:06,581 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.0), 'state_2': np.float32(0.0), 'gmm_vol_cluster': np.float32(0.0), 'rsi_slope': np.float32(0.06453913), 'atr_normalized': np.float32(0.06378366), 'prev_log_return': np.float32(0.05420387), 'usdchf_log_return': np.float32(0.055949107), 'xagusd_log_return': np.float32(0.06508519), 'xtiusd_log_return': np.float32(0.06456509), 'synth_vix_zscore': np.float32(0.052456904), 'atr_band_position': np.float32(0.0767283), 'hour_sin': np.float32(0.08255253), 'hour_cos': np.float32(0.086700805), 'minute_sin': np.float32(0.0), 'minute_cos': np.float32(0.0), 'atr_expansion_ratio': np.float32(0.061290987), 'realized_vol_ratio': np.float32(0.07435408), 'atr_slope': np.float32(0.063367), 'minutes_from_london_open': np.float32(0.06411517), 'minutes_from_ny_open': np.float32(0.070308305)}
[2026-05-31 14:21:06,582 INFO] src.engine_xgb: [M15] TREND model: n=50732 train_acc=0.6113
[2026-05-31 14:21:07,279 INFO] src.engine_xgb: XGB Train Acc: 0.6087 | Test Acc: 0.6109
[2026-05-31 14:21:07,280 INFO] src.engine_xgb: Feature importance: {'state_0': np.float32(0.0), 'state_1': np.float32(0.04693761), 'state_2': np.float32(0.03827292), 'gmm_vol_cluster': np.float32(0.04937261), 'rsi_slope': np.float32(0.07226414), 'atr_normalized': np.float32(0.04933138), 'prev_log_return': np.float32(0.053273845), 'usdchf_log_return': np.float32(0.04158987), 'xagusd_log_return': np.float32(0.05662241), 'xtiusd_log_return': np.float32(0.04767787), 'synth_vix_zscore': np.float32(0.062214524), 'atr_band_position': np.float32(0.058959484), 'hour_sin': np.float32(0.04502765), 'hour_cos': np.float32(0.05265267), 'minute_sin': np.float32(0.052983273), 'minute_cos': np.float32(0.0), 'atr_expansion_ratio': np.float32(0.057962015), 'realized_vol_ratio': np.float32(0.058189116), 'atr_slope': np.float32(0.05150884), 'minutes_from_london_open': np.float32(0.04685928), 'minutes_from_ny_open': np.float32(0.058300488)}
[2026-05-31 14:21:07,281 INFO] src.engine_xgb: [M15] SHOCK model: n=64395 train_acc=0.6087
[2026-05-31 14:21:08,926 INFO] src.backtester: Backtest [M15]: Sharpe=-4.641 | MaxDD=0.349 | WR=0.402 | Return=-29.2% | Trades=605
[2026-05-31 14:21:08,927 INFO] src.backtester: headway_cent: account=$15.00 | costs=0.0004/trade
[2026-05-31 14:21:09,099 INFO] src.optimizer: CPCV [M15]: 2/6 valid paths | median_score=-2.341 std=1.140 | path_penalty=6.0 | final_score=-8.626
[2026-05-31 14:21:09,127 INFO] src.optimizer: trial=2 tf=M15 base=-1.4414 p_var=0.1592 p_inst=2.0000 p_dd=20.0000 p_mr=0.0000 p_floor=70.7940 p_turn=0.0000 p_occ=0.0000 p_m15=0.0000 final=-94.3946 reasons=floor_sharpe:-4.294<0.200|floor_pf:0.229<1.050
[2026-05-31 14:21:09,491 INFO] src.optimizer: tf=M15 | trial=2 | objective_score=-94.3946 | cpcv_mean_score=-8.6263 | cpcv_std_score=1.5918 | valid_paths=2 | total_paths=6 | sharpe_median=-4.294 | pf_median=0.2288 | calmar_median=-0.8159 | expectancy_median=-0.000744 | floating_dd_median=0.2496 | trades_median=389 | mr_leak_count=0 | regime_occupancy={'TREND': 52.37938440937052, 'MEAN_REVERSION': 0.0, 'VOLATILITY_SHOCK': 47.620615590629484} | trade_distribution={'TREND': 51, 'MEAN_REVERSION': 0, 'VOLATILITY_SHOCK': 299} | activation_events=0 | partial_close_events=0 | trail_updates=0 | regime_shift_forced_closes=61 | avg_activation_pnl_usd=0.0 | pruned=False | elapsed_sec=79.4
Best trial: 1. Best value: -59: 1%|▊ | 3/300 [04:32<7:17:19, 88.35s/it]