做量化模型验证时,我习惯先把每一折数据画成时间轴,而不是先看准确率。原因很简单:表格里的训练集和验证集即使没有日期重叠,也不代表信息完全隔离。只要特征使用了滚动窗口、标签看向未来,边界附近的样本就可能共享同一段行情。
例如,用过去20日数据构造波动率,并预测未来5日收益。训练集最后一天虽然早于验证集第一天,但最后几条训练标签已经用到了后面5天的价格;验证集开头的滚动特征也会回看前20天。如果直接首尾相接,模型评估会比真实上线更乐观。
我会把切分写成下面这种时间线:
训练区间 ────── | 空档区 | ────── 验证区间
gap=5
scikit-learn 的 TimeSeriesSplit 可以直接表达这个约束:
from sklearn.model_selection import TimeSeriesSplit
cv = TimeSeriesSplit(
n_splits=5,
test_size=60,
gap=5,
max_train_size=500
)
这里的 gap 不是随手填的安全垫,而应由策略的信息跨度决定。若标签是未来5日收益,至少要先检查5个交易日是否足够;如果特征还包含发布滞后、成交延迟或更长的持有期,就要按实际可用时间重新画边界。max_train_size 则能避免训练集无限扩张,让各折更接近固定长度的滚动训练。
最后不要只打印交叉验证分数。把每折训练结束日、验证开始日、gap 长度和样本数输出成一张小表,肉眼检查一次。时间序列验证最重要的不是“切了几折”,而是每一折是否真的模拟了当时能够看到的数据。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。