3. 回放验证的数据准备:历史数据要求、数据清洗、数据分区与质量检查
回放验证的核心在于使用真实的历史数据“重演”模型在过去的决策过程。数据准备的质量直接决定了验证结论的可靠性。本节将系统阐述历史数据的准入标准、清洗流程、分区策略以及质量检查方法。
3.1 历史数据的基本要求
并非所有历史数据都适合回放验证。数据必须满足以下四个核心条件:
| 维度 | 要求 | 说明 |
|---|---|---|
| 时间跨度 | 覆盖至少一个完整的经济/承保周期 | 通常要求 ≥ 3 年,包含费率调整、重大理赔事件等波动期 |
| 数据粒度 | 保单级或交易级明细 | 聚合数据会掩盖个体风险差异,导致回放结果失真 |
| 字段完整性 | 包含模型输入变量、决策标签、实际结果 | 缺失关键变量(如历史赔付、续保标志)的数据不可用 |
| 业务一致性 | 承保规则、产品定义未发生结构性变化 | 若期间发生过产品停售或监管变更,需分段处理 |
实践提示: 在精算实务中,建议优先选取最近 3-5 年的数据。过长的历史数据可能包含过时的风险因子或费率结构,反而引入噪声。
3.2 数据清洗流程
原始数据通常包含缺失值、异常值、重复记录和逻辑错误。清洗流程应遵循以下步骤:
- 缺失值处理:对关键输入变量(如年龄、保额、风险等级)的缺失记录,优先追溯源系统补全;无法补全的,按变量重要性决定剔除或插补。
- 异常值检测:使用箱线图或 Z-score 方法识别极端值(如保额为负、赔付金额超过保额 10 倍),结合业务规则判断是否保留。
- 重复记录去重:按保单号 + 生效日期 + 险种代码组合去重,保留最新一条有效记录。
- 逻辑一致性校验:例如生效日期必须早于终止日期,投保年龄必须符合产品条款。
- 格式标准化:统一日期格式(YYYY-MM-DD)、货币单位(元)、分类变量编码(如性别:M/F)。
# 数据清洗示例(Python 伪代码)
import pandas as pd
import numpy as np
df = pd.read_csv('historical_policies.csv')
# 1. 缺失值处理:剔除关键变量缺失的记录
df = df.dropna(subset=['age', 'sum_insured', 'risk_score'])
# 2. 异常值过滤:保额必须在 0 到 500 万之间
df = df[(df['sum_insured'] > 0) & (df['sum_insured'] <= 5_000_000)]
# 3. 去重
df = df.drop_duplicates(subset=['policy_id', 'effective_date'])
# 4. 逻辑校验
df = df[df['effective_date'] < df['expiry_date']]
# 5. 格式标准化
df['effective_date'] = pd.to_datetime(df['effective_date'], format='%Y-%m-%d')
3.3 数据分区策略:训练集与回放集
回放验证要求严格区分训练集和回放集,以避免信息泄露。推荐使用时间序列分割而非随机分割。
核心原则: 回放集必须位于训练集之后的时间窗口内,且回放集的数据在模型训练时不可见。
典型的分区方案如下:
| 数据集 | 时间范围 | 用途 | 占比(参考) |
|---|---|---|---|
| 训练集 | 2018-01 至 2021-12 | 模型参数估计、费率厘定 | 60% - 70% |
| 验证集 | 2022-01 至 2022-06 | 模型调参、超参数选择 | 10% - 15% |
| 回放集 | 2022-07 至 2023-06 | 回放验证、效果评估 | 20% - 25% |
常见错误: 使用随机抽样划分训练集和回放集。这会导致未来数据泄露到训练过程中,使回放验证结果过于乐观,失去实际参考价值。
3.4 数据质量检查清单
在数据进入回放流程前,必须执行系统性的质量检查。以下清单可作为标准操作程序:
- 完整性检查:每个字段的空值比例是否低于 5%?关键字段是否 100% 非空?
- 唯一性检查:保单号是否唯一?是否存在重复的生效记录?
- 范围检查:数值型变量是否在合理区间内(如年龄 0-120,保额 > 0)?
- 时间顺序检查:时间戳是否严格递增?是否存在未来日期?
- 分布一致性检查:训练集与回放集的关键变量分布是否相似(KS 检验 p > 0.05)?
- 业务规则检查:是否满足产品条款约束(如免赔额 < 保额)?
3.5 数据准备阶段的常见陷阱
陷阱一:幸存者偏差 — 只保留最终有效保单,忽略了中途退保或拒保的记录。这会导致回放集偏向低风险群体,高估模型效果。
陷阱二:特征泄露 — 在训练集中使用了回放期才能获取的信息(如未来的理赔记录)。必须确保所有特征在决策时点已知。
陷阱三:过度清洗 — 剔除了大量“异常”但真实的业务数据(如高额理赔案件),使回放环境脱离实际。
陷阱二:特征泄露 — 在训练集中使用了回放期才能获取的信息(如未来的理赔记录)。必须确保所有特征在决策时点已知。
陷阱三:过度清洗 — 剔除了大量“异常”但真实的业务数据(如高额理赔案件),使回放环境脱离实际。
完成上述步骤后,数据即可进入回放验证引擎。下一阶段将聚焦于回放执行策略与结果记录方法。