链梯法的弊端和更新

链梯法是精算常用的方法,但是链梯法的问题也很大,需要重新翻看资料,按照写一篇论文的方式去研究这个问题。

chapter0

在此之前,先试着自动生成一组自动化脚本,记录下链梯法的预测过程,生成前后预实估计偏差。

案例数据:

Y
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 3209 1163   39   17    7   21
[2,] 3367 1292   37   24   10   NA
[3,] 3871 1474   53   22   NA   NA
[4,] 4239 1678  103   NA   NA   NA
[5,] 4929 1865   NA   NA   NA   NA
[6,] 5217   NA   NA   NA   NA   NA
import numpy as np
import pandas as pd
from statsmodels.formula.api import glm
from statsmodels.genmod.families import Poisson

# 原始矩阵(NA 用 np.nan)
Y = [
    [3209, 1163,   39,   17,    7,   21],
    [3367, 1292,   37,   24,   10,   np.nan],
    [3871, 1474,   53,   22,   np.nan, np.nan],
    [4239, 1678,  103,   np.nan, np.nan, np.nan],
    [4929, 1865,  np.nan, np.nan, np.nan, np.nan],
    [5217,   np.nan, np.nan, np.nan, np.nan, np.nan]
]

df_mat = pd.DataFrame(Y, index=range(1, 7), columns=range(1, 7))

# 转为长表:ai = 行索引 (origin year), bj = 列索引 (dev year)
df_long = df_mat.reset_index().melt(id_vars='index', var_name='bj', value_name='y')
df_long = df_long.rename(columns={'index': 'ai'})

# 删除 NA 观测(R 中的 NA 相当于这里的缺失)
df_obs = df_long.dropna(subset=['y']).copy()

# 确保 ai,bj 为类别(可选:statsmodels 的 C(...) 会自动处理)
df_obs['ai'] = df_obs['ai'].astype(int).astype('category')
df_obs['bj'] = df_obs['bj'].astype(int).astype('category')

# 拟合 Poisson GLM,等价 R: y ~ as.factor(ai) + as.factor(bj), family = poisson
model = glm(formula='y ~ C(ai) + C(bj)', data=df_obs, family=Poisson()).fit()

print(model.summary())

# 预测(包含原来缺失的位置也可以做预测)
df_long['ai'] = df_long['ai'].astype(int).astype('category')
df_long['bj'] = df_long['bj'].astype(int).astype('category')

# 为所有格子产生预测值(自动对缺失格也能预测)
df_long['yhat'] = model.predict(df_long)

# 如果只想看原始有观测的预测:
df_obs['yhat'] = model.predict(df_obs)

# 把预测结果 pivot 回矩阵形式(方便查看三角)
pred_mat = df_long.pivot(index='ai', columns='bj', values='yhat').sort_index().sort_index(axis=1)
print(pred_mat)