3. 赔付率时间序列分析:月度/季度赔付率趋势图、季节性分解、移动平均法平滑波动

赔付率时间序列分析是精算模型调优的基础环节。通过将赔付率数据按时间维度展开,精算师可以识别出长期趋势、周期性波动以及异常突变点,从而为费率调整、准备金评估和模型参数校准提供量化依据。本节聚焦于三种核心分析手段:趋势图绘制、季节性分解与移动平均平滑。

3.1 月度/季度赔付率趋势图

趋势图是时间序列分析的第一视觉工具。精算师通常将已赚保费(EP)与已发生赔付(Incurred Loss)按月度或季度聚合,计算综合赔付率(Loss Ratio = Incurred Loss / Earned Premium),并绘制成折线图。

维度 月度赔付率 季度赔付率
数据粒度 逐月聚合,波动较大 按季聚合,平滑度较高
适用场景 短期监控、快速预警 中期趋势判断、模型校准
常见问题 受月末效应、节假日影响 可能掩盖月度内的突变
推荐做法 结合移动平均线使用 配合同比(YoY)对比
精算实务提示:绘制趋势图时,建议同时叠加“12个月滚动赔付率”曲线,以消除季节性干扰,更清晰地展示赔付率的真实走向。

3.2 季节性分解

保险赔付率通常具有明显的季节性特征。例如,车险在冬季冰雪天气、夏季台风季赔付率上升;健康险在流感高发季赔付率走高。季节性分解(Seasonal Decomposition)将时间序列拆解为三个成分:趋势分量(Trend)、季节分量(Seasonal)和残差分量(Residual)。

常用的分解模型有两种:加法模型(Additive)和乘法模型(Multiplicative)。

  • 加法模型:Y(t) = Trend(t) + Seasonal(t) + Residual(t),适用于季节波动幅度不随趋势变化的情况。
  • 乘法模型:Y(t) = Trend(t) × Seasonal(t) × Residual(t),适用于季节波动幅度随趋势水平变化的情况(如赔付率越高,季节性波动越大)。
精算模型调优应用:若分解后的残差分量出现连续同号或超过±2σ的异常点,应检查该时段是否存在理赔政策变更、巨灾事件或数据录入错误,并据此调整模型中的季节因子或引入干预变量。
赔付率时间序列季节性分解示意图 原始序列 Y(t) 时间 趋势分量 Trend(t) 时间 季节分量 Seasonal(t) 时间 残差分量 Residual(t) 时间 原始 趋势 季节 残差

3.3 移动平均法平滑波动

移动平均法(Moving Average)是消除短期随机波动、突出长期趋势的最常用方法。精算实践中主要使用以下两种变体:

  • 简单移动平均(SMA):对最近 k 期的赔付率取算术平均。k 值越大,平滑效果越强,但对最新变化的响应越慢。
  • 加权移动平均(WMA):对近期的赔付率赋予更高权重,使平滑线更贴近实际值。常用权重为线性递减或指数衰减。
模型调优注意:移动平均法会引入“滞后效应”——平滑线相对于原始序列存在相位延迟。在精算模型中,若使用移动平均后的赔付率作为费率因子,需考虑滞后阶数对定价及时性的影响,必要时采用中心化移动平均(Centered MA)来消除相位偏移。

3.4 移动平均法在精算模型中的调优实践

以下是一个使用 Python 实现移动平均法平滑赔付率的代码示例,展示了如何计算 3 个月和 6 个月简单移动平均,并识别异常波动点。

import pandas as pd
import numpy as np

# 模拟月度赔付率数据
dates = pd.date_range(start='2022-01-01', periods=24, freq='M')
loss_ratio = [0.72, 0.68, 0.75, 0.71, 0.69, 0.78,
              0.73, 0.70, 0.76, 0.72, 0.74, 0.80,
              0.75, 0.71, 0.77, 0.73, 0.70, 0.79,
              0.74, 0.72, 0.78, 0.76, 0.73, 0.82]

df = pd.DataFrame({'日期': dates, '赔付率': loss_ratio})

# 计算3个月和6个月简单移动平均
df['SMA_3'] = df['赔付率'].rolling(window=3).mean()
df['SMA_6'] = df['赔付率'].rolling(window=6).mean()

# 计算残差(实际值 - 平滑值)
df['残差_SMA3'] = df['赔付率'] - df['SMA_3']
df['残差_SMA6'] = df['赔付率'] - df['SMA_6']

# 标记异常点:残差绝对值超过2倍标准差
threshold = 2 * df['残差_SMA3'].std()
df['异常标记'] = np.where(np.abs(df['残差_SMA3']) > threshold, '⚠️ 异常', '')

print(df[['日期', '赔付率', 'SMA_3', 'SMA_6', '异常标记']].to_string(index=False))
移动平均法平滑赔付率波动效果对比 原始赔付率 3个月移动平均 6个月移动平均 异常波动识别 当原始赔付率与移动平均线的偏离超过预设阈值(如±2σ)时,触发异常预警,需进一步排查原因。 示例:第12个月(赔付率0.80)与6个月移动平均(0.74)偏离达+6%,触发黄色预警。 原始 SMA-3 SMA-6

3.5 精算模型调优中的时间序列分析策略

将时间序列分析结果应用于精算模型调优时,建议遵循以下步骤:

  1. 数据准备:确保赔付率数据口径一致(如统一使用已赚保费和已发生赔付),剔除异常保单或巨灾事件的影响。
  2. 趋势识别:通过移动平均或季节性分解判断赔付率是上升、下降还是平稳,作为费率调整方向的基础依据。
  3. 季节性因子提取:将分解得到的季节分量作为模型中的固定效应因子,或作为动态调整的输入变量。
  4. 残差分析:对残差分量进行正态性检验和自相关检验(如ACF/PACF),判断模型是否遗漏了重要解释变量。
  5. 模型迭代:根据时间序列分析结果,调整模型中的趋势项、季节项或引入干预变量,重新拟合后再次评估残差表现。
精算模型调优核心原则:时间序列分析不是一次性工作,而是贯穿模型生命周期的持续监控手段。建议每月/每季度自动生成赔付率时间序列报告,并与模型预测值进行对比,形成“监控-分析-调优-再监控”的闭环。