2. 样本切分基础:训练集/验证集/测试集划分原则
在交易风控模型开发中,样本切分是决定模型泛化能力与上线后真实效果的关键步骤。错误的切分方式会导致时序穿越或过拟合,使模型在回测中表现优异,实盘时却大幅失效。本节从基础划分原则出发,对比时间序列切分与随机切分的本质差异。
2.1 三集划分原则与比例
标准机器学习流程将数据集划分为三个互斥子集:
| 子集 | 用途 | 典型比例 | 风控场景特殊要求 |
|---|---|---|---|
| 训练集 | 模型参数学习、特征权重拟合 | 60% – 70% | 必须包含完整市场周期(含极端行情) |
| 验证集 | 超参数调优、模型选择、早停 | 15% – 20% | 与训练集时间连续,不可跳跃 |
| 测试集 | 最终泛化能力评估、无偏性能报告 | 15% – 20% | 必须严格在时间上晚于训练/验证集 |
风控铁律:测试集在模型开发过程中绝对不可见。任何基于测试集反馈的调参行为都会导致信息泄露,使评估结果虚高。
2.2 随机切分 vs 时间序列切分
交易数据具有天然的时间依赖性和序列自相关性。随机切分与时间序列切分在风控场景下的差异如下:
| 对比维度 | 随机切分 | 时间序列切分 |
|---|---|---|
| 切分方式 | 按样本索引随机打乱后分配 | 按时间戳顺序切分,保留时序 |
| 适用场景 | 独立同分布数据(如图像、文本) | 时间序列数据(交易、股价、风控日志) |
| 时序穿越风险 | 高——未来信息可能进入训练集 | 低——严格保证训练集早于测试集 |
| 模型泛化评估 | 可能高估(数据泄露) | 更接近真实上线表现 |
| 交叉验证方式 | K-Fold 随机折叠 | Expanding Window / Sliding Window |
常见陷阱:部分团队在风控建模时使用随机切分,导致模型"学习"到了未来的市场波动模式。实盘时由于未来不可知,模型性能断崖式下跌。务必使用时间序列切分。
2.3 时间序列切分实战策略
针对交易风控场景,推荐以下三种时间序列切分策略:
- 固定时间窗口切分:按日期硬切,如 2023-01-01 至 2023-09-30 为训练集,2023-10-01 至 2023-11-30 为验证集,2023-12-01 至 2023-12-31 为测试集。
- 滚动窗口切分(Sliding Window):固定窗口长度,逐步向后滑动,适用于在线学习与模型更新。
- 扩展窗口切分(Expanding Window):训练集不断累积历史数据,验证/测试集为最新时间片段,适合低频策略与长周期风控模型。
下图展示了时间序列切分与随机切分的核心差异:
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)是否跨子集重复 | 零重复 |
| 极端行情覆盖 | 确认训练集包含历史波动率最高时段 | 必须包含 |