[
  {
    "model_name": "x5_lstm_v1",
    "model_type": "LSTMPredictor",
    "ticker": "X5",
    "timeframe": "D1",
    "params": {
      "input_size": 61,
      "hidden_size": 128,
      "num_layers": 2,
      "dropout": 0.3,
      "bidirectional": false
    },
    "metrics": {
      "val_loss": 1.382316768169403,
      "val_accuracy": 0.65625,
      "val_confusion_matrix": [
        [
          16,
          4,
          0
        ],
        [
          1,
          4,
          1
        ],
        [
          5,
          0,
          1
        ]
      ],
      "best_epoch": 12,
      "total_epochs": 27,
      "training_time_sec": 25.227519750595093,
      "test_loss": 1.4874845851551404,
      "test_accuracy": 0.36363636363636365,
      "test_confusion_matrix": [
        [
          8,
          6,
          5
        ],
        [
          2,
          1,
          1
        ],
        [
          6,
          1,
          3
        ]
      ]
    },
    "model_path": "src/ml/models/saved/x5_lstm_v1",
    "created_at": "2026-06-24T09:23:34.604729",
    "status": "archived"
  },
  {
    "model_name": "x5_lstm_v2",
    "model_type": "LSTMPredictor",
    "ticker": "X5",
    "timeframe": "D1",
    "params": {
      "input_size": 61,
      "hidden_size": 128,
      "num_layers": 2,
      "dropout": 0.3,
      "bidirectional": false,
      "pretrain_epochs": 50,
      "finetune_epochs": 30,
      "pretrain_lr": 0.001,
      "finetune_lr": 0.0001,
      "batch_size": 32,
      "weight_decay": 0.0001
    },
    "metrics": {
      "val_loss": 1.3082294464111328,
      "val_accuracy": 0.59375,
      "val_macro_f1": 0.3189666666666667,
      "val_confusion_matrix": [
        [
          18,
          2,
          0
        ],
        [
          5,
          1,
          0
        ],
        [
          6,
          0,
          0
        ]
      ],
      "best_epoch": 4,
      "total_epochs": 19,
      "pretrain_epochs_done": 12,
      "training_time_sec": 622.5728170871735,
      "test_loss": 1.3930946552392207,
      "test_accuracy": 0.5757575757575758,
      "test_macro_f1": 0.3611,
      "test_confusion_matrix": [
        [
          18,
          0,
          1
        ],
        [
          2,
          1,
          1
        ],
        [
          9,
          1,
          0
        ]
      ]
    },
    "model_path": "src/ml/models/saved/x5_lstm_v2",
    "created_at": "2026-06-24T10:23:17.807096",
    "status": "active"
  },
  {
    "model_name": "x5_h1_lstm_v1",
    "model_type": "LSTMPredictor",
    "ticker": "X5",
    "timeframe": "H1",
    "params": {
      "input_size": 63,
      "hidden_size": 128,
      "num_layers": 2,
      "dropout": 0.3,
      "bidirectional": false,
      "seq_len": 120,
      "batch_size": 64,
      "learning_rate": 0.001,
      "weight_decay": 0.0001
    },
    "metrics": {
      "val_loss": 1.2604323106409756,
      "val_accuracy": 0.6505032021957914,
      "val_macro_f1": 0.39220000000000005,
      "val_confusion_matrix": [
        [
          655,
          238,
          24
        ],
        [
          38,
          46,
          5
        ],
        [
          33,
          44,
          10
        ]
      ],
      "best_epoch": 2,
      "total_epochs": 17,
      "training_time_sec": 547.0290462970734,
      "test_loss": 1.2354871757730692,
      "test_accuracy": 0.585544373284538,
      "test_macro_f1": 0.32703333333333334,
      "test_confusion_matrix": [
        [
          597,
          324,
          31
        ],
        [
          20,
          39,
          5
        ],
        [
          30,
          43,
          4
        ]
      ]
    },
    "model_path": "src/ml/models/saved/x5_h1_lstm_v1",
    "created_at": "2026-06-24T10:32:37.919138",
    "status": "active"
  },
  {
    "model_name": "x5_gru_v3",
    "model_type": "GRUPredictor",
    "ticker": "X5",
    "timeframe": "D1",
    "params": {
      "input_size": 61,
      "hidden_size": 96,
      "num_layers": 2,
      "dropout": 0.4,
      "pretrain_epochs": 100,
      "finetune_epochs": 50,
      "pretrain_lr": 0.001,
      "finetune_lr": 5e-05,
      "batch_size": 32,
      "weight_decay": 0.001,
      "focal_gamma": 2.0,
      "loss_function": "WeightedFocalLoss"
    },
    "metrics": {
      "val_loss": 0.4692503809928894,
      "val_accuracy": 0.59375,
      "val_macro_f1": 0.31666666666666665,
      "val_confusion_matrix": [
        [
          18,
          0,
          2
        ],
        [
          5,
          0,
          1
        ],
        [
          5,
          0,
          1
        ]
      ],
      "best_epoch": 37,
      "total_epochs": 50,
      "pretrain_epochs_done": 19,
      "training_time_sec": 1170.7640211582184,
      "test_loss": 0.4298664999730659,
      "test_accuracy": 0.48484848484848486,
      "test_macro_f1": 0.34446666666666664,
      "test_confusion_matrix": [
        [
          11,
          2,
          6
        ],
        [
          3,
          0,
          1
        ],
        [
          5,
          0,
          5
        ]
      ],
      "calibrated_test_accuracy": 0.5454545454545454,
      "calibrated_test_macro_f1": 0.3703666666666667,
      "calibrated_test_confusion_matrix": [
        [
          14,
          2,
          3
        ],
        [
          3,
          0,
          1
        ],
        [
          6,
          0,
          4
        ]
      ]
    },
    "model_path": "src/ml/models/saved/x5_gru_v3",
    "created_at": "2026-06-25T08:25:56.458468",
    "status": "active"
  },
  {
    "model_name": "x5_lstm_v3_focal",
    "model_type": "LSTMPredictor",
    "ticker": "X5",
    "timeframe": "D1",
    "params": {
      "input_size": 61,
      "hidden_size": 128,
      "num_layers": 2,
      "dropout": 0.4,
      "bidirectional": false,
      "focal_gamma": 2.0,
      "weight_decay": 0.001,
      "pretrain_lr": 0.001,
      "finetune_lr": 5e-05,
      "pretrain_epochs": 100,
      "finetune_epochs": 50,
      "batch_size": 32,
      "seed": 42,
      "sell_multiplier": 2.0,
      "loss_function": "WeightedFocalLoss"
    },
    "metrics": {
      "val_loss": 0.327097624540329,
      "val_accuracy": 0.71875,
      "val_macro_f1": 0.5842999999999999,
      "val_confusion_matrix": [
        [
          19,
          0,
          1
        ],
        [
          4,
          2,
          0
        ],
        [
          4,
          0,
          2
        ]
      ],
      "best_epoch": 18,
      "total_epochs": 38,
      "pretrain_epochs_done": 17,
      "training_time_sec": 111.03006505966187,
      "test_loss": 0.6100471719647899,
      "test_accuracy": 0.5454545454545454,
      "test_macro_f1": 0.4434333333333333,
      "test_confusion_matrix": [
        [
          14,
          2,
          3
        ],
        [
          2,
          2,
          0
        ],
        [
          5,
          3,
          2
        ]
      ],
      "calibrated_test_accuracy": 0.5454545454545454,
      "calibrated_test_macro_f1": 0.4434333333333333,
      "calibrated_test_confusion_matrix": [
        [
          14,
          2,
          3
        ],
        [
          2,
          2,
          0
        ],
        [
          5,
          3,
          2
        ]
      ]
    },
    "model_path": "src/ml/models/saved/x5_lstm_v3_focal",
    "created_at": "2026-06-25T09:32:21.993471",
    "status": "active"
  },
  {
    "model_name": "x5_gru_v4",
    "model_type": "GRUPredictor",
    "ticker": "X5",
    "timeframe": "D1",
    "params": {
      "input_size": 61,
      "hidden_size": 128,
      "num_layers": 2,
      "dropout": 0.4,
      "bidirectional": false,
      "focal_gamma": 3.0,
      "weight_decay": 0.001,
      "pretrain_lr": 0.001,
      "finetune_lr": 5e-05,
      "pretrain_epochs": 100,
      "finetune_epochs": 50,
      "batch_size": 32,
      "seed": 123,
      "sell_multiplier": 2.5,
      "loss_function": "WeightedFocalLoss"
    },
    "metrics": {
      "val_loss": 0.2755211889743805,
      "val_accuracy": 0.5625,
      "val_macro_f1": 0.4166666666666667,
      "val_confusion_matrix": [
        [
          15,
          1,
          4
        ],
        [
          3,
          1,
          2
        ],
        [
          4,
          0,
          2
        ]
      ],
      "best_epoch": 32,
      "total_epochs": 50,
      "pretrain_epochs_done": 18,
      "training_time_sec": 197.43961310386658,
      "test_loss": 0.26017875653324707,
      "test_accuracy": 0.5757575757575758,
      "test_macro_f1": 0.5377333333333333,
      "test_confusion_matrix": [
        [
          11,
          2,
          6
        ],
        [
          1,
          2,
          1
        ],
        [
          3,
          1,
          6
        ]
      ],
      "calibrated_test_accuracy": 0.5454545454545454,
      "calibrated_test_macro_f1": 0.5091666666666667,
      "calibrated_test_confusion_matrix": [
        [
          11,
          2,
          6
        ],
        [
          1,
          2,
          1
        ],
        [
          4,
          1,
          5
        ]
      ]
    },
    "model_path": "src/ml/models/saved/x5_gru_v4",
    "created_at": "2026-06-25T09:56:18.588897",
    "status": "active"
  },
  {
    "model_name": "x5_mtf_v1",
    "model_type": "MTFBasic",
    "ticker": "X5",
    "timeframe": "H1+D1",
    "params": {
      "input_size": 61,
      "h1_hidden": 64,
      "d1_hidden": 64,
      "h1_num_layers": 2,
      "d1_num_layers": 1,
      "dropout": 0.4,
      "h1_seq_len": 40,
      "d1_seq_len": 30,
      "forecast_horizon": 1,
      "threshold_pct": 0.5,
      "focal_gamma": 2.0,
      "weight_decay": 0.001,
      "sell_multiplier": 2.0,
      "loss_function": "WeightedFocalLoss"
    },
    "metrics": {
      "test_accuracy": 0.5111111111111111,
      "test_macro_f1": 0.29986666666666667,
      "test_confusion_matrix": [
        [
          21,
          0,
          2
        ],
        [
          8,
          0,
          2
        ],
        [
          10,
          0,
          2
        ]
      ],
      "sell_recall": 16.666666666666664,
      "sell_precision": 33.33333333333333,
      "val_loss": 0.484633301364051,
      "val_accuracy": 0.5111111111111111,
      "training_time_sec": 0,
      "total_epochs": 56
    },
    "model_path": "src/ml/models/saved/x5_mtf_v1",
    "created_at": "2026-06-25T11:10:13.790461",
    "status": "active"
  },
  {
    "model_name": "x5_d1_transformer_v1",
    "model_type": "D1Transformer",
    "ticker": "X5",
    "timeframe": "D1",
    "params": {
      "model_name": "x5_d1_transformer_v1",
      "model_type": "D1Transformer",
      "ticker": "X5",
      "timeframe": "D1",
      "arch": {
        "input_size": 61,
        "d_model": 64,
        "nhead": 4,
        "num_layers": 2,
        "dim_feedforward": 128,
        "dropout": 0.4,
        "activation": "gelu",
        "total_params": 75395
      },
      "training": {
        "batch_size": 16,
        "optimizer": "AdamW",
        "lr": 5e-05,
        "weight_decay": 0.001,
        "loss": "WeightedFocalLoss(gamma=2.0)",
        "epochs_trained": 80,
        "patience": 25,
        "training_time_sec": 141.1283314228058,
        "data": "x5_d1_augmented.h5 (без pre-train)"
      },
      "metrics": {
        "test_accuracy": 0.5757575757575758,
        "test_macro_f1": 0.2436,
        "test_confusion_matrix": [
          [
            19,
            0,
            0
          ],
          [
            4,
            0,
            0
          ],
          [
            10,
            0,
            0
          ]
        ],
        "sell_recall": 0.0,
        "sell_precision": 0.0,
        "val_loss": 0.4832666516304016,
        "threshold": 0.55
      }
    },
    "metrics": {
      "test_accuracy": 0.5757575757575758,
      "test_macro_f1": 0.2436,
      "test_confusion_matrix": [
        [
          19,
          0,
          0
        ],
        [
          4,
          0,
          0
        ],
        [
          10,
          0,
          0
        ]
      ],
      "sell_recall": 0.0,
      "sell_precision": 0.0,
      "val_loss": 0.4832666516304016,
      "threshold": 0.55
    },
    "model_path": "src/ml/models/saved/x5_d1_transformer_v1",
    "created_at": "2026-06-25T11:48:23.494880",
    "status": "active"
  },
  {
    "model_name": "x5_bigru_attn_v1",
    "model_type": "BiGRUAttention",
    "ticker": "X5",
    "timeframe": "D1",
    "params": {
      "input_size": 61,
      "hidden_size": 64,
      "num_layers": 2,
      "dropout": 0.4,
      "focal_gamma": 2.0,
      "weight_decay": 0.001,
      "sell_multiplier": 2.0,
      "pretrain_lr": 0.001,
      "finetune_lr": 5e-05,
      "pretrain_epochs": 30,
      "finetune_epochs": 50,
      "pretrain_patience": 10,
      "finetune_patience": 20,
      "batch_size": 32,
      "seed": 42,
      "model_name": "x5_bigru_attn_v1",
      "model_type": "BiGRUAttention",
      "ticker": "X5",
      "timeframe": "D1",
      "total_params": 132099,
      "metrics": {
        "test_accuracy": 0.5151515151515151,
        "test_macro_f1": 0.3222333333333333,
        "test_confusion_matrix": [
          [
            14,
            0,
            5
          ],
          [
            2,
            0,
            2
          ],
          [
            7,
            0,
            3
          ]
        ],
        "sell_recall": 0.3,
        "sell_precision": 0.3,
        "val_loss": 0.35530170798301697
      },
      "calibrated_thresholds": {
        "1": 0.0,
        "2": 0.0
      }
    },
    "metrics": {
      "test_accuracy": 0.5151515151515151,
      "test_macro_f1": 0.3222333333333333,
      "test_confusion_matrix": [
        [
          14,
          0,
          5
        ],
        [
          2,
          0,
          2
        ],
        [
          7,
          0,
          3
        ]
      ],
      "sell_recall": 0.3,
      "sell_precision": 0.3,
      "val_loss": 0.35530170798301697
    },
    "model_path": "src/ml/models/saved/x5_bigru_attn_v1",
    "created_at": "2026-06-25T13:29:15.106359",
    "status": "active"
  },
  {
    "model_name": "x5_mtf_v2",
    "model_type": "MTFBasic",
    "ticker": "X5",
    "timeframe": "H1+D1",
    "params": {
      "input_size": 30,
      "h1_hidden": 64,
      "d1_hidden": 64,
      "h1_num_layers": 2,
      "d1_num_layers": 1,
      "dropout": 0.4,
      "h1_seq_len": 40,
      "d1_seq_len": 30,
      "forecast_horizon": 1,
      "threshold_pct": 0.5,
      "focal_gamma": 2.0,
      "weight_decay": 0.001,
      "sell_multiplier": 2.0,
      "loss_function": "WeightedFocalLoss",
      "pretrain_tickers": [
        "SBER",
        "LKOH",
        "NVTK",
        "MTSS",
        "PHOR",
        "VTBR",
        "MOEX",
        "GAZP",
        "PLZL"
      ],
      "pretrain_samples": 2708
    },
    "metrics": {
      "test_accuracy": 0.5555555555555556,
      "test_macro_f1": 0.2381,
      "test_confusion_matrix": [
        [
          25,
          0,
          0
        ],
        [
          8,
          0,
          0
        ],
        [
          12,
          0,
          0
        ]
      ],
      "sell_recall": 0.0,
      "sell_precision": 0.0,
      "val_loss": 0.5208303968111674
    },
    "model_path": "src/ml/models/saved/x5_mtf_v2",
    "created_at": "2026-06-25T14:11:48.954962",
    "status": "active"
  },
  {
    "model_name": "wyckoff_x5_d1_lstm_v1_simple",
    "model_type": "WyckoffLstm",
    "ticker": "X5",
    "timeframe": "D1",
    "params": {
      "num_classes": 5,
      "seq_len": 30,
      "arch": "lstm",
      "purpose": "wyckoff_phase_detection"
    },
    "metrics": {
      "val_accuracy": 1.0,
      "val_macro_f1": 0.2,
      "test_accuracy": 0.18181818181818182,
      "test_macro_f1": 0.08,
      "val_loss": 0.0010342696914449334,
      "best_epoch": 12
    },
    "model_path": "src/ml/models/saved/wyckoff_x5_d1_lstm_v1_simple",
    "created_at": "2026-06-25T15:04:33.193415",
    "status": "active"
  },
  {
    "model_name": "wyckoff_mt_d1_lstm_v1",
    "model_type": "WyckoffLstm",
    "ticker": "MULTI",
    "timeframe": "D1",
    "params": {
      "num_classes": 5,
      "seq_len": 30,
      "arch": "lstm",
      "purpose": "wyckoff_phase_detection"
    },
    "metrics": {
      "val_accuracy": 0.6875187069739599,
      "val_macro_f1": 0.6133599999999999,
      "test_accuracy": 0.412152050284346,
      "test_macro_f1": 0.37184,
      "val_loss": 0.42648671269673266,
      "best_epoch": 4
    },
    "model_path": "src/ml/models/saved/wyckoff_mt_d1_lstm_v1",
    "created_at": "2026-06-25T16:20:10.587701",
    "status": "active"
  },
  {
    "model_name": "wyckoff_mt_d1_transformer_v1",
    "model_type": "transformer",
    "ticker": "MULTI",
    "timeframe": "D1",
    "params": {
      "num_classes": 5,
      "seq_len": 30,
      "arch": "transformer",
      "purpose": "wyckoff_phase_detection",
      "input_size": 122,
      "d_model": 128,
      "nhead": 4,
      "num_layers": 3,
      "dim_feedforward": 256,
      "dropout": 0.3
    },
    "metrics": {
      "val_accuracy": 0.6576900059844405,
      "val_macro_f1": 0.60396,
      "val_loss": 0.4578699257948231,
      "best_epoch": 3,
      "train_loss_first": 0.6814212987900631,
      "train_loss_last": 0.26583504010455083
    },
    "model_path": "src/ml/models/saved/wyckoff_mt_d1_transformer_v1",
    "created_at": "2026-06-26T08:14:09.177379",
    "status": "active"
  },
  {
    "model_name": "wyckoff_mt_d1_lstm_v2",
    "model_type": "lstm",
    "ticker": "MULTI",
    "timeframe": "D1",
    "params": {
      "num_classes": 5,
      "seq_len": 30,
      "arch": "lstm",
      "purpose": "wyckoff_phase_detection",
      "input_size": 122,
      "hidden_size": 128,
      "num_layers": 2,
      "dropout": 0.5
    },
    "metrics": {
      "val_accuracy": 0.7154398563734291,
      "val_macro_f1": 0.6406799999999999,
      "val_loss": 0.4386648273332081,
      "best_epoch": 4
    },
    "model_path": "src/ml/models/saved/wyckoff_mt_d1_lstm_v2",
    "created_at": "2026-06-26T08:29:47.032553",
    "status": "active"
  },
  {
    "model_name": "wyckoff_mt_h1_lstm_v1",
    "model_type": "lstm",
    "ticker": "MULTI",
    "timeframe": "H1",
    "params": {
      "num_classes": 5,
      "seq_len": 60,
      "arch": "lstm",
      "purpose": "wyckoff_phase_detection",
      "input_size": 117,
      "hidden_size": 128,
      "num_layers": 2,
      "dropout": 0.4
    },
    "metrics": {
      "val_accuracy": 0.6644277270284793,
      "val_macro_f1": 0.52956,
      "val_loss": 0.7502424969613875,
      "best_epoch": 1
    },
    "model_path": "src/ml/models/saved/wyckoff_mt_h1_lstm_v1",
    "created_at": "2026-06-26T09:32:04.108976",
    "status": "active"
  },
  {
    "model_name": "wyckoff_mt_w1_lstm_v1",
    "model_type": "lstm",
    "ticker": "MULTI",
    "timeframe": "W1",
    "params": {
      "num_classes": 5,
      "seq_len": 20,
      "arch": "lstm",
      "purpose": "wyckoff_phase_detection",
      "input_size": 110,
      "hidden_size": 128,
      "num_layers": 2,
      "dropout": 0.4
    },
    "metrics": {
      "val_accuracy": 0.40602284527518173,
      "val_macro_f1": 0.30779999999999996,
      "val_loss": 1.7542674717563953,
      "best_epoch": 4
    },
    "model_path": "src/ml/models/saved/wyckoff_mt_w1_lstm_v1",
    "created_at": "2026-06-26T09:42:23.241933",
    "status": "active"
  }
]