4. 回放验证的执行流程:模型参数固定、逐期滚动预测、结果记录
回放验证(Backtesting)是精算模型上线前最关键的“压力测试”环节。其核心思想是:用历史数据模拟模型在真实时间线上的表现,从而评估模型对未来未知数据的泛化能力。执行流程可归纳为三个核心步骤:模型参数固定 → 逐期滚动预测 → 结果记录与评估。
4.1 执行流程总览
回放验证不是简单的“训练-测试”一次切分,而是沿着时间轴进行多次滚动预测。每次预测时,模型参数保持与生产环境一致(即固定),仅更新输入数据窗口。下图展示了这一动态过程:
4.2 步骤一:模型参数固定
这是回放验证与模型训练最本质的区别。在回放验证开始前,模型的所有参数(包括回归系数、树结构、神经网络权重等)必须锁定,不得在滚动过程中重新拟合或微调。
| 参数类型 | 固定内容 | 常见错误 |
|---|---|---|
| GLM 系数 | β₀, β₁, …, βₖ | 滚动时重新估计系数 |
| GBDT 结构 | 树的数量、分裂点、叶子权重 | 用新数据增量训练 |
| 神经网络 | 权重矩阵、偏置项 | 继续反向传播更新 |
| 超参数 | 学习率、正则化强度、最大深度 | 根据新数据调优 |
⚠️ 常见陷阱:有些团队在回放验证时,每滚动一期就用新数据重新训练模型。这实际上是在做“滚动再训练评估”,而非回放验证。回放验证的目的是检验固定参数模型在时间序列上的稳定性,两者不可混淆。
4.3 步骤二:逐期滚动预测
在参数固定的前提下,按照时间顺序逐期向前滚动。每一期只使用截止到该期的历史数据作为输入,生成下一期的预测值。滚动方式通常有两种:
- 固定窗口滚动:训练窗口长度固定(如最近 12 个月),每期窗口整体前移。
- 扩展窗口滚动:训练窗口起点固定,终点随预测期不断扩展(如从第 1 个月到第 t 个月)。
以下伪代码展示了扩展窗口滚动的核心逻辑:
# 回放验证:固定参数 + 扩展窗口滚动预测
model = load_trained_model("model_v3.pkl") # 参数已固定
start_date = "2020-01-01"
end_date = "2023-12-01"
prediction_results = []
current_date = start_date
while current_date < end_date:
# 1. 获取截止到当前日期的历史数据
X_hist = get_data_up_to(current_date)
# 2. 使用固定模型预测下一期
y_pred = model.predict(X_hist.iloc[-1:]) # 仅用最新特征
# 3. 记录预测值与实际值(实际值在后续日期才能获得)
prediction_results.append({
"prediction_date": current_date,
"predicted_value": y_pred[0],
"actual_value": None # 留待后续填充
})
# 4. 滚动到下一期
current_date = advance_one_period(current_date)
# 回填实际值(事后获取)
fill_actual_values(prediction_results)
4.4 步骤三:结果记录与评估
每次滚动预测完成后,必须记录以下关键信息,形成完整的回放验证日志:
| 记录字段 | 说明 | 示例 |
|---|---|---|
| 预测时间点 | 做出预测时的日历时间 | 2023-06-01 |
| 预测值 | 模型输出的预测结果 | 0.0325(赔付率) |
| 实际值 | 事后观察到的真实结果 | 0.0298 |
| 预测误差 | 实际值 - 预测值 | -0.0027 |
| 输入数据窗口 | 本次预测使用的历史数据范围 | 2022-06 ~ 2023-05 |
| 模型版本 | 固定参数的模型标识 | v3.1 |
💡 精算实践提示:结果记录建议采用“宽表”格式,每行一次预测,列包含上述所有字段。这样便于后续计算累计误差、绘制残差序列图、以及按时间维度分层评估模型稳定性。
4.5 评估指标与可视化
回放验证完成后,通常使用以下指标评估模型在时间序列上的表现:
- 累计预测误差(CPE):Σ(实际值 - 预测值),反映系统性偏差。
- 平均绝对误差(MAE):平均 |实际值 - 预测值|,反映预测精度。
- 误差自相关性:检查相邻期误差是否独立,若存在正自相关,说明模型未捕捉到时间趋势。
- 预测区间覆盖率:若模型输出置信区间,检查实际值落入区间的比例是否接近名义置信水平。
下图展示了回放验证结果的可视化分析框架:
4.6 执行检查清单
为确保回放验证的严谨性,建议在每次执行前逐项确认以下事项:
- 参数锁定确认:模型文件是否已设置写保护?是否从训练管线中分离?
- 时间轴对齐:预测时间点与实际值回填时间点是否严格对应?是否存在前瞻偏差?
- 数据一致性:滚动过程中使用的特征工程是否与生产环境完全一致?
- 结果可复现:是否设置了随机种子?相同输入能否得到相同输出?
- 异常处理:若某期数据缺失或异常,是否定义了明确的处理规则(如跳过、插值、标记)?
📌 最佳实践:将回放验证脚本封装为自动化流水线,每次模型更新后自动触发。结果写入数据库,支持按模型版本、时间范围、业务线等维度进行对比分析。这不仅能提升效率,还能建立模型治理的审计追踪。