{"record":{"id":"c6fc206c464f015a","repo":"microsoft/qlib","slug":"model-hasn-t-been-trained-yet","errorCode":null,"errorMessage":"Model hasn't been trained yet","messagePattern":"Model hasn't been trained yet","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"qlib/contrib/model/highfreq_gdbt_model.py","lineNumber":62,"sourceCode":"\n            up_pre.append(up_precision)\n            down_pre.append(down_precision)\n            up_alpha_ll.append(up_alpha)\n            down_alpha_ll.append(down_alpha)\n\n        return (\n            np.array(up_pre).mean(),\n            np.array(down_pre).mean(),\n            np.array(up_alpha_ll).mean(),\n            np.array(down_alpha_ll).mean(),\n        )\n\n    def hf_signal_test(self, dataset: DatasetH, threhold=0.2):\n        \"\"\"\n        Test the signal in high frequency test set\n        \"\"\"\n        if self.model is None:\n            raise ValueError(\"Model hasn't been trained yet\")\n        df_test = dataset.prepare(\"test\", col_set=[\"feature\", \"label\"], data_key=DataHandlerLP.DK_I)\n        df_test.dropna(inplace=True)\n        x_test, y_test = df_test[\"feature\"], df_test[\"label\"]\n        # Convert label into alpha\n        y_test[y_test.columns[0]] = y_test[y_test.columns[0]] - y_test[y_test.columns[0]].mean(level=0)\n\n        res = pd.Series(self.model.predict(x_test.values), index=x_test.index)\n        y_test[\"pred\"] = res\n\n        up_p, down_p, up_a, down_a = self._cal_signal_metrics(y_test, threhold, 1 - threhold)\n        print(\"===============================\")\n        print(\"High frequency signal test\")\n        print(\"===============================\")\n        print(\"Test set precision: \")\n        print(\"Positive precision: {}, Negative precision: {}\".format(up_p, down_p))\n        print(\"Test Alpha Average in test set: \")\n        print(\"Positive average alpha: {}, Negative average alpha: {}\".format(up_a, down_a))\n","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/highfreq_gdbt_model.py#L44-L80","documentation":"Thrown by HFMLGBModel.hf_signal_test when self.model is None, meaning the high-frequency LightGBM booster was never trained. The signal test predicts on the 'test' segment and computes precision/alpha metrics, which requires a fitted model.","triggerScenarios":"Calling hf_signal_test(dataset) on a fresh HFMLGBModel or after fit failed; testing before training in a high-frequency experiment script.","commonSituations":"Experiment scripts that run signal evaluation unconditionally; fit failures (empty data / multi-label from _prepare_data) being caught and skipped before the test step.","solutions":["Call model.fit(dataset) successfully before hf_signal_test(dataset)","Fix the underlying fit failure (commonly empty data or label config issues in _prepare_data)"],"exampleFix":"# before\nmodel = HFMLGBModel()\nmodel.hf_signal_test(dataset)  # ValueError\n\n# after\nmodel.fit(dataset)\nmodel.hf_signal_test(dataset, threhold=0.2)","handlingStrategy":"validation","validationCode":"assert model.model is not None, \"HFMLGBModel must be fitted before hf_signal_test()\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Gate signal-test steps on a successful fit","In experiment scripts, wrap fit and skip dependent evaluation steps if it fails"],"tags":["high-frequency","lightgbm","lifecycle","qlib"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}