2. 样本切分基础:训练集/验证集/测试集划分原则

在交易风控模型开发中,样本切分是决定模型泛化能力与上线后真实效果的关键步骤。错误的切分方式会导致时序穿越或过拟合,使模型在回测中表现优异,实盘时却大幅失效。本节从基础划分原则出发,对比时间序列切分与随机切分的本质差异。

2.1 三集划分原则与比例

标准机器学习流程将数据集划分为三个互斥子集:

子集 用途 典型比例 风控场景特殊要求
训练集 模型参数学习、特征权重拟合 60% – 70% 必须包含完整市场周期(含极端行情)
验证集 超参数调优、模型选择、早停 15% – 20% 与训练集时间连续,不可跳跃
测试集 最终泛化能力评估、无偏性能报告 15% – 20% 必须严格在时间上晚于训练/验证集
风控铁律:测试集在模型开发过程中绝对不可见。任何基于测试集反馈的调参行为都会导致信息泄露,使评估结果虚高。

2.2 随机切分 vs 时间序列切分

交易数据具有天然的时间依赖性和序列自相关性。随机切分与时间序列切分在风控场景下的差异如下:

对比维度 随机切分 时间序列切分
切分方式 按样本索引随机打乱后分配 按时间戳顺序切分,保留时序
适用场景 独立同分布数据(如图像、文本) 时间序列数据(交易、股价、风控日志)
时序穿越风险 高——未来信息可能进入训练集 低——严格保证训练集早于测试集
模型泛化评估 可能高估(数据泄露) 更接近真实上线表现
交叉验证方式 K-Fold 随机折叠 Expanding Window / Sliding Window
常见陷阱:部分团队在风控建模时使用随机切分,导致模型"学习"到了未来的市场波动模式。实盘时由于未来不可知,模型性能断崖式下跌。务必使用时间序列切分。

2.3 时间序列切分实战策略

针对交易风控场景,推荐以下三种时间序列切分策略:

  1. 固定时间窗口切分:按日期硬切,如 2023-01-01 至 2023-09-30 为训练集,2023-10-01 至 2023-11-30 为验证集,2023-12-01 至 2023-12-31 为测试集。
  2. 滚动窗口切分(Sliding Window):固定窗口长度,逐步向后滑动,适用于在线学习与模型更新。
  3. 扩展窗口切分(Expanding Window):训练集不断累积历史数据,验证/测试集为最新时间片段,适合低频策略与长周期风控模型。

下图展示了时间序列切分与随机切分的核心差异:

时间序列切分 vs 随机切分(交易风控场景) 时间序列切分 训练集(2023-01~09) 验证集(10~11) 测试集(12月) 时间 → ✅ 训练集 < 验证集 < 测试集 ✅ 无未来信息泄露 随机切分(不推荐用于风控) 训练样本 验证样本 测试样本 原始时间顺序: 1月 2月 3月 … 12月 随机打乱后: 8月 2月 11月 5月 1月 ⚠️ 未来月份(如11月、8月) 可能被分入训练集,而过去月份 (如1月、2月)进入测试集 → 时序穿越

2.4 Flink 中的时间序列切分实现思路

在 Flink 实时风控流水线中,样本切分通常在批处理阶段(如使用 Flink Batch 或 Table API)完成历史数据的离线划分,然后加载到实时模型中进行推理。核心步骤:

  • 步骤1:使用 ROW_NUMBER() OVER (PARTITION BY ... ORDER BY event_time) 为每条交易记录分配全局时间序号。
  • 步骤2:根据预设的时间阈值(如日期边界)将数据路由到训练/验证/测试表。
  • 步骤3:将切分后的训练集写入特征存储(Feature Store),供后续模型训练使用。
-- Flink SQL 示例:按时间窗口切分样本
INSERT INTO train_set
SELECT * FROM raw_transactions
WHERE event_time < '2023-10-01 00:00:00';

INSERT INTO val_set
SELECT * FROM raw_transactions
WHERE event_time >= '2023-10-01 00:00:00'
  AND event_time < '2023-12-01 00:00:00';

INSERT INTO test_set
SELECT * FROM raw_transactions
WHERE event_time >= '2023-12-01 00:00:00';
生产建议:在 Flink 中做时间序列切分时,务必使用事件时间(Event Time)而非处理时间(Processing Time),并配置 Watermark 策略处理乱序数据,确保切分边界的准确性。

2.5 切分质量检查清单

每次完成样本切分后,建议逐项核对以下检查点:

检查项 检查方法 通过标准
时间顺序正确性 验证训练集最大时间戳 < 验证集最小时间戳 严格递增
类别分布一致性 计算各子集正负样本比例 相对差异 < 5%
无重叠样本 检查主键(交易ID)是否跨子集重复 零重复
极端行情覆盖 确认训练集包含历史波动率最高时段 必须包含