XGBoost 在量化实盘中早已是“基本款”模型了,不少朋友在训练阶段都跑得风生水起,但到了实盘预测环节就容易踩坑:
✅ 我模型训练好了,用的是全历史数据,那我明天到底该怎么预测? ✅ 预测时我该用哪天的数据?最近20天?30天?还是全历史? ✅ 预测的是涨跌、收益,还是信号?预测逻辑要和训练怎么对齐?
今天我们就来彻底讲清楚:“训练完模型之后,如何用 XGBoost 正确预测明天”,不仅要跑得通,更要符合实盘逻辑,避免数据泄露。
一、训练模型 ≠ 实盘预测
先把最常见的一个误区拆掉:
训练是回测的世界,预测才是真正面对未来的世界。
你训练时可以随便用历史数据,从 2015 年开始,滚动、切片都行。但你预测时,只能用“今天能看到的”数据来预测“明天”的结果。
举个例子:
- 今天是:2025-06-30(周一)
- 你要预测的是:2025-07-01(周二)的股票涨跌
- 那你模型输入只能用到:2025-06-30 截止的全部特征
二、整体预测流程图解
我们来把预测流程串起来:
历史数据(2015~2025) → 训练XGBoost模型(训练集/标签)
↓
模型训练好 → 保存模型文件(.json/.pkl)
↓
预测日(2025-06-30) → 生成特征X_today(当天横截面)
↓
模型预测 X_today → 输出预测值(涨跌概率/收益/打分)
↓
信号生成/选股/调仓执行
三、预测阶段常见3大误区
❌ 误区1:拿未来数据预测未来
很多人会在预测 7月1日 时用到 2025-07-01
的数据来算特征,这直接泄露未来,实盘是拿不到的。
正确:只能用 2025-06-30
的数据构造特征。
❌ 误区2:输入最近20天的横截面预测
你不需要输入“最近N天”的数据,XGBoost 不需要序列特征,只预测一天就输入一天。
正确:只需要 1 行横截面特征(每只股票)当天的因子数据。
❌ 误区3:训练用全历史,预测也得输入全历史
训练用全历史没问题;预测时,只用当天数据(1 行 per 股票)即可。
四、实盘预测核心逻辑:今天数据预测明天
如果你训练模型时是:
特征 X_t :今天的特征(均线、市值、换手率等)
标签 y_t+1 :明天的涨跌 or 收益
那么你预测时应该这么做👇:
✅ 步骤1:加载训练好的模型
import joblib
model = joblib.load("xgb_model.pkl") # 或者用 xgb.Booster 接口
✅ 步骤2:构造今天的特征 X_today(横截面)
import pandas as pd
X_today = features_df[features_df['date'] == '2025-06-30']
⚠️注意:
- 你训练时用的是什么特征字段、顺序、预处理(标准化/缺失填充),预测时都必须一致;
- 特征不能包含未来信息(如明天的最高价、收盘价等)。
✅ 步骤3:模型预测每只股票的信号
# 二分类模型(比如涨/不涨)
y_pred = model.predict_proba(X_today)[:, 1] # 输出“上涨概率”
# 回归模型(比如预测未来1天收益)
y_pred = model.predict(X_today)
你可以根据输出的预测值设置阈值,生成信号,例如:
X_today['score'] = y_pred
X_today['signal'] = (X_today['score'] > 0.6).astype(int)
✅ 步骤4:输出选股池、调仓信号
long_list = X_today[X_today['signal'] == 1].sort_values(by='score', ascending=False).head(10)
你就可以将 long_list
中的股票作为次日开盘要买入的目标了。
五、实战建议 & 常见策略设置
📌 特征准备建议
-
因子应该来自当日能获取的数值,比如:
- 技术指标(MA、RSI、ATR)
- 市值、换手率、波动率
- 行业、概念归属
- 高频聚合特征(如 5 日收益均值、20 日波动率)
📌 模型训练周期建议
- 模型不建议每天训练,可按月、按季度重训练;
- 使用滚动窗口训练模型(如最近1年),能兼顾模型稳定性与适应性;
- 每次训练模型时注意避免数据泄露(如未来数据或 label 泄露入X)。
小结一句话
训练是历史问题,预测是实盘问题。真正的模型落地,是你如何用“今天可得的全部信息”,判断“明天的走势或信号”。
搞清楚这一点,才是真正从科研模型走向策略实盘。