BigQuant使用文档

如何将模型持久化保存

由qxiao创建,最终由qxiao 被浏览 3 用户

一、背景说明

在量化研究和机器学习建模过程中,模型训练往往成本较高,如果每次使用都重新训练,不仅效率低,还会带来结果不一致的问题。

因此,模型持久化(Model Persistence) 是一个非常重要的工程实践,核心目标是:

  • 一次训练,多次复用
  • 回测、实盘、推理阶段加载同一个模型
  • 避免 Notebook / 容器 / 进程重启导致模型丢失

本文以 XGBoost(二分类)模型 为例,演示完整的:

训练 → 保存 → 加载 → 复用 流程

二、模型训练流程

1.数据准备

这里使用 sklearn 自带的乳腺癌数据集作为示例(实际可替换为自己的 CSV / 特征数据)。

from sklearn.datasets import load_breast_cancer

X, y = load_breast_cancer(return_X_y=True, as_frame=True)

2.划分训练集 / 验证集

from sklearn.model_selection import train_test_split

X_train, X_valid, y_train, y_valid = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42,
    stratify=y
)

3.构造 DMatrix(XGBoost 专用数据结构)

import xgboost as xgb

dtrain = xgb.DMatrix(X_train, label=y_train)
dvalid = xgb.DMatrix(X_valid, label=y_valid)

4.设置模型参数

params = {
    'objective': 'binary:logistic',
    'eval_metric': 'auc',
    'max_depth': 6,
    'eta': 0.1,
    'subsample': 0.8,
    'colsample_bytree': 0.8,
    'seed': 42
}

.模型训练(含 Early Stopping)

evals = [(dtrain, 'train'), (dvalid, 'valid')]

bst = xgb.train(
    params,
    dtrain,
    num_boost_round=200,
    evals=evals,
    early_stopping_rounds=20,
    verbose_eval=50
)

训练日志中可以看到 train-auc 和 valid-auc,用于判断模型是否过拟合。

这个时候我们的xgboost模型就已经训练好了,接下来我们把这个已经训练好的模型保存到我们的AIStudio的线上本地

此时 bst 就是一个已训练好的模型对象,可直接用于:

  • 回测预测
  • 实盘打分
  • 批量离线推理

三、模型持久化保存(核心部分)

1.封装一个安全的模型保存函数

def save_xgb_model(bst, save_path):
    """
    安全保存 XGBoost 模型(原生 json 格式)。
    若文件已存在则先删除,再写入新模型,并自动创建缺失目录。
    """

    # 1. 自动创建缺失的目录
    os.makedirs(os.path.dirname(save_path), exist_ok=True)

    # 2. 若文件已存在,则删除旧文件
    if os.path.isfile(save_path):
        os.remove(save_path)

    # 3. 保存新模型
    bst.save_model(save_path)
    print(f"[INFO] 模型已保存 -> {save_path}")

2.指定保存路径并执行保存

target_path = "/home/aiuser/work/第二周/xgb模型/models/xgb_model11.json" #把这里改成自己想要保存的路径
save_xgb_model(bst, target_path)

保存好后,就会发现本地出现了一个已经训练好的模型文件


如果我们想替换掉这个xgb_model11.json的模型数据,我们只需要重新训练这个模型,然后在save_xgb_model(bst, target_path)时,target_path保持和旧模型数据文件路径和文件名一致就可以啦,运行之后就会更新掉旧的文件模型。

四、模型加载与复用

当模型已经通过 bst.save_model() 持久化保存为文件之后,它就不再依赖当前 Notebook、内存或 Python 进程了,而是以一个独立的模型文件存在于你的账号目录中。

无论是新开一个 Notebook,关闭后重新启动 Notebook,提交模拟交易,实盘运行脚本还是定时任务 / 后台进程只要模型文件路径存在,就可以直接加载使用。

新的 Notebook / 脚本 / 实盘进程中,只需加载模型即可使用,无需重新训练。

import xgboost as xgb

bst = xgb.Booster()
bst.load_model('/home/aiuser/work/第二周/xgb模型/models/xgb_model11.json')  #把这里改成自己之前保存模型的路径

print('XGBoost 模型加载完成')

此时的 bst:

  • 状态与训练完成时完全一致
  • 包含全部树结构、参数、最佳迭代轮数
  • 可直接用于 predict
dtest = xgb.DMatrix(X_new)
y_pred = bst.predict(dtest)

此时加载模型 ≠ 重新训练,load_model 不会消耗训练时间,也不会引入随机性。

模型更新的正确方法如果后续:

  • 加了新特征
  • 调了参数
  • 用了更多数据
  • 重新训练了一个更优模型

完全不需要改加载逻辑。

save_xgb_model(bst, target_path)
#并且 target_path 与旧模型路径保持一致:/home/aiuser/work/第二周/xgb模型/models/xgb_model11.json
#你需要把这个target_ptah改成你自己的target_path

\

{link}