4. 回放验证的基本框架:输入-过程-输出框架、关键假设、基准设定、回放窗口选择
回放验证(Back-Testing Validation)是精算模型效果评估的核心环节,其本质是将模型“回放”到历史数据中,检验模型输出与实际观测值的一致性。一个严谨的回放验证框架必须明确界定输入、过程与输出三要素,并在此基础上设定关键假设、选择合理的基准与回放窗口。
4.1 输入-过程-输出(IPO)框架
IPO框架将回放验证分解为三个逻辑阶段,确保验证过程可追溯、可复现。下表总结了各阶段的核心内容与典型产物:
| 阶段 | 核心内容 | 典型产物/示例 |
|---|---|---|
| 输入(Input) | 历史观测数据、模型参数、外部经济假设、承保策略假设 | 保单级历史赔付数据、费率因子表、利率路径 |
| 过程(Process) | 模型引擎执行、假设校准、随机模拟、聚合计算 | 蒙特卡洛模拟引擎、GLM拟合过程、准备金链梯法计算 |
| 输出(Output) | 模型预测值、预测分布、统计诊断量、偏差分析报告 | 预测赔付率、实际vs预期(A/E)比率、P值、残差图 |
关键原则:IPO框架要求输入数据必须与模型开发时使用的数据在时间窗口上严格分离(即“回放”),过程必须锁定模型版本与参数,输出必须包含不确定性度量(如置信区间),而非仅点估计。
4.2 关键假设的识别与分类
回放验证的有效性高度依赖于对模型关键假设的显式识别。假设可分为三类,每类对验证结果的影响不同:
- 结构性假设:模型函数形式、分布选择(如泊松 vs 负二项)、变量交互项。这类假设错误通常导致系统性偏差。
- 参数假设:费率因子、损失发展因子、折现率。参数假设的敏感性可通过应力测试评估。
- 环境假设:经济通胀率、监管政策变化、巨灾发生频率。环境假设在回放中通常被“冻结”,以隔离模型自身表现。
实操建议:在回放验证前,应编制一份《关键假设清单》,明确每个假设的“冻结”状态(即回放期间是否允许变化)。对于允许变化的假设,需记录其变化依据。
4.3 基准设定(Benchmarking)
基准是衡量模型回放效果的参照系。没有基准,A/E比率或残差分析就失去了比较意义。常见的基准设定方式包括:
| 基准类型 | 定义 | 适用场景 | 注意事项 |
|---|---|---|---|
| 朴素基准 | 简单统计量(如历史均值、移动平均) | 模型初筛、快速诊断 | 可能忽略趋势与结构性变化 |
| 行业基准 | 行业平均赔付率、标准生命表 | 市场对标、监管报告 | 需确保数据口径一致 |
| 内部基准 | 上一版模型、简化版模型、分业务线历史经验 | 模型迭代验证、版本对比 | 需控制其他变量不变 |
| 理论基准 | 无偏估计的理论期望值(如Bühlmann信度模型) | 学术研究、模型理论验证 | 计算复杂度较高 |
常见陷阱:使用“全周期历史均值”作为基准时,若业务结构在回放窗口内发生重大变化(如产品线重组),均值基准会严重失真。此时应优先使用“同期群组基准”或“动态基准”。
4.4 回放窗口选择
回放窗口(Back-Testing Window)决定了模型在哪个历史时间段内接受检验。窗口选择直接影响验证结论的稳健性。下表对比了三种主流窗口策略:
| 窗口策略 | 定义 | 优势 | 劣势 |
|---|---|---|---|
| 固定窗口 | 选取一个固定的历史区间(如2018-2020年) | 简单、易于沟通 | 可能遗漏近期结构性变化 |
| 滚动窗口 | 以固定步长向前滚动,每次使用最近N期数据 | 捕捉模型时效性变化 | 计算量大,结果序列可能波动 |
| 扩展窗口 | 起始点固定,终点逐步向后扩展 | 可观察模型随数据积累的稳定性 | 早期窗口样本量小,统计功效不足 |
4.5 框架整合:从输入到决策
完整的回放验证框架将上述要素整合为一个闭环流程。以下伪代码展示了IPO框架在编程实现中的核心逻辑:
def backtest_validation(model, data, assumptions, window_config):
# 1. 输入阶段:数据切分与假设冻结
train_data, test_data = split_by_window(data, window_config)
frozen_assumptions = freeze_assumptions(assumptions, window_config)
# 2. 过程阶段:模型回放执行
predictions = model.predict(test_data, frozen_assumptions)
# 3. 输出阶段:偏差计算与诊断
ae_ratio = calculate_ae(test_data.actual, predictions)
residuals = test_data.actual - predictions
diagnostics = {
'ae_ratio': ae_ratio,
'rmse': np.sqrt(np.mean(residuals**2)),
'mae': np.mean(np.abs(residuals)),
'residual_autocorr': acf(residuals, nlags=12)
}
# 4. 基准对比
benchmark_pred = benchmark_model.predict(test_data)
benchmark_ae = calculate_ae(test_data.actual, benchmark_pred)
return diagnostics, benchmark_ae
框架价值:通过IPO框架,精算师可以系统性地回答三个核心问题:模型在历史数据上表现如何?(输出);哪些假设驱动了偏差?(过程);与基准相比是否有显著改进?(基准)。这三个问题的答案共同构成模型是否通过回放验证的决策依据。