{
  "strategy_id": "psx_xgb_5d_topn_v1",
  "spec_version": 1,
  "frozen_at": "2026-08-19",
  "research_only": true,
  "model": {
    "family": "XGBoost",
    "implementation": "psx_signal.models.xgboost_model.XGBoostModel",
    "hyperparameters": {
      "n_estimators": 250,
      "max_depth": 4,
      "learning_rate": 0.05,
      "subsample": 0.8,
      "colsample_bytree": 0.8,
      "objective": "multi:softprob",
      "num_class": 3,
      "random_seed": 42
    }
  },
  "label": {
    "horizon_sessions": 5,
    "buy_threshold": 0.005,
    "sell_threshold": -0.005,
    "entry": "T+1_OPEN",
    "exit_reference": "T+5_CLOSE"
  },
  "portfolio_direction": "LONG_ONLY",
  "ranking": {
    "score": "BUY_SCORE",
    "source": "predict_proba BUY-class output",
    "eligibility_minimum": 0.55,
    "selections": ["TOP_1", "TOP_3"],
    "tie_breaker": "symbol ascending"
  },
  "features": {
    "version": "m1-v1",
    "count": 93,
    "ordered_columns_sha256": "1acd860fe651c2916f4e91003a770a9a4aa55062fb5dcad71409c14e950ccfa6"
  },
  "walk_forward": {
    "minimum_train_sessions": 504,
    "validation_sessions": 252,
    "test_sessions": 252,
    "step_sessions": 252,
    "training_scope": "expanding train plus validation before each test fold"
  },
  "dataset": {
    "task5_base_sha256": "20aa1232a506211aba82a9ab0e4e4ecf3c875cbf37ed69f1c5df8fc35799a3f2",
    "experiment_end": "2026-08-13"
  },
  "prohibitions": [
    "feature changes",
    "label changes",
    "model-family changes",
    "threshold changes",
    "horizon changes",
    "ranking-method changes",
    "result-driven tuning"
  ],
  "fingerprint": "a8cf67171c3e6d2e478b923d071bc5c281ccbf7afe7cd4f7129ff7029378d733"
}
