寿险精算实验二——保费计算

寿险精算实验二——保费计算

  • 一、传统寿险的净保费
    • 1.1 净保费计算公式
    • 1.2 运用Python计算保费
    • 1.3 保费的敏感性分析
  • 二、传统寿险的毛保费
    • 2.1 毛保费计算公式
    • 2.2 运用Python计算保费

一、传统寿险的净保费

       本实验的目的是用换算表来计算基本类型寿险产品的净保费。
       本章节的实验内容:设计定期寿险、终身寿险、两全保险的投保年龄、缴费期及不同利率、不同生命表假设下的不同缴费期的净保费费率表。

1.1 净保费计算公式

       以下公式适用期初缴费、期末赔付的l离散情形。
       (1)20年期定期寿险的公式
       趸缴净保费: N P x = M x − M x + 20 D x NP_x=\frac{M_x-M_{x+20}}{D_x} NPx=DxMxMx+20
       10年缴费净保费: N P x = M x − M x + 20 N x − N x + 10 NP_x=\frac{M_x-M_{x+20}}{N_x-N_{x+10}} NPx=NxNx+10MxMx+20
       20年缴费净保费: N P x = M x − M x + 20 N x − N x + 20 NP_x=\frac{M_x-M_{x+20}}{N_x-N_{x+20}} NPx=NxNx+20MxMx+20
       (2)终身寿险
       趸缴净保费: N P x = M x D x NP_x=\frac{M_x}{D_x} NPx=DxMx
       10年缴费净保费: N P x = M x N x − N x + 10 NP_x=\frac{M_x}{N_x-N_{x+10}} NPx=NxNx+10Mx
       20年缴费净保费: N P x = M x N x − N x + 20 NP_x=\frac{M_x}{N_x-N_{x+20}} NPx=NxNx+20Mx
       缴费至59岁净保费: N P x = M x N x − N 60 NP_x=\frac{M_x}{N_x-N_{60}} NPx=NxN60Mx
       终身缴费净保费: N P x = M x N x NP_x=\frac{M_x}{N_x} NPx=NxMx
       (3)20年期两全险
       趸缴净保费: N P x = M x − M x + 20 + D x + 20 D x NP_x=\frac{M_x-M_{x+20}+D_{x+20}}{D_x} NPx=DxMxMx+20+Dx+20
       10年缴费净保费: N P x = M x − M x + 20 + D x + 20 N x − N x + 10 NP_x=\frac{M_x-M_{x+20}+D_{x+20}}{N_x-N_{x+10}} NPx=NxNx+10MxMx+20+Dx+20
       20年缴费净保费: N P x = M x − M x + 20 + D x + 20 N x − N x + 20 NP_x=\frac{M_x-M_{x+20}+D_{x+20}}{N_x-N_{x+20}} NPx=NxNx+20MxMx+20+Dx+20

1.2 运用Python计算保费

       首先,在编制生命表换算表这一章节,我们已经得到编制好的换算表。下面将根据生命表中的“非养老类业务一表”,并假设保额以1万元为单位保额,运用Python计计算单位保额对应的净保费。
       (1)定期寿险

## 定期寿险净保费计算
## 定期寿险净保费计算
def DingQi(t,s,data):
    NPxM = 'DSNPxM' + '_' +str(t) +'_' + str(s)
    NPxF = 'DSNPxF' + '_' +str(t) +'_' + str(s)
    data[NPxM]=None
    data[NPxF]=None
    for k in range(w+1-t):
        if s==0:
            data[NPxM][k] = (data['MxM'][k] - data['MxM'][k+t])/data['DxM'][k]*10000
            data[NPxF][k] = (data['MxF'][k] - data['MxF'][k+t])/data['DxF'][k]*10000
        else:
            if s < t+1:
                data[NPxM][k] = (data['MxM'][k] - data['MxM'][k+t])/(data['NxM'][k]-data['NxM'][k+s])*10000
                data[NPxF][k] = (data['MxF'][k] - data['MxF'][k+t])/(data['NxF'][k]-data['NxF'][k+s])*10000
    return data[['x',NPxM,NPxF]]
t=20  # 20年定期寿险
dt1= DingQi(t,0,data)  # 趸缴
dt2 = DingQi(t,10,data)  # 10年缴费
dt3 = DingQi(t,20,data)  # 20年缴费
pd.concat([dt1,dt2,dt3],axis=1)[0:w+1-t].iloc[:,[0,1,2,4,5,7,8]]

       部分结果如图所示:
在这里插入图片描述
       (2)终身寿险

## 终身寿险净保费计算
def ZhongShen(data,s=0,AgeF=True,agez=60):
    if AgeF==True:##表示缴费至某年龄,默认为60-1=59岁
        NPxM = 'ZSSNPxM' + '_'  + str(agez)
        NPxF = 'ZSSNPxF' + '_'  + str(agez)
        data[NPxM]=None
        data[NPxF]=None
        for k in range(agez):
            data[NPxM][k] = data['MxM'][k] / (data['NxM'][k]-data['NxM'][60]) * 10000
            data[NPxF][k] = data['MxF'][k] / (data['NxF'][k]-data['NxF'][60]) * 10000
    else:
        NPxM = 'ZSSNPxM' + '_'  + str(s)
        NPxF = 'ZSSNPxF' + '_'  + str(s)
        data[NPxM]=None
        data[NPxF]=None
        if s==0: ## 趸缴
            for k in range(w+1):
                data[NPxM][k] = data['MxM'][k] / data['DxM'][k] * 10000
                data[NPxF][k] = data['MxF'][k] / data['DxF'][k] * 10000
        elif s==106: ## 终身缴费
            for k in range(w+1):
                data[NPxM][k] = data['MxM'][k] / data['NxM'][k] * 10000
                data[NPxF][k] = data['MxF'][k] / data['NxF'][k] * 10000
        else:
            for k in range(w+1-s):
                data[NPxM][k] = data['MxM'][k] / (data['NxM'][k] - data['NxM'][k+s]) * 10000
                data[NPxF][k] = data['MxF'][k] / (data['NxF'][k] - data['NxF'][k+s]) * 10000
    return data[['x',NPxM,NPxF]]
dt1= ZhongShen(data,0,True,60)  # 缴费至59岁
dt2= ZhongShen(data,0,False,60)  # 趸缴
dt3= ZhongShen(data,10,False,60)  # 缴费10年
dt4= ZhongShen(data,20,False,60)  # 缴费20年
dt5= ZhongShen(data,106,False,60)  # 终身缴费
pd.concat([dt1,dt2,dt3,dt4,dt5],axis=1).iloc[:,[0,1,2,4,5,7,8,10,11,13,14]]

       部分结果如图所示:
在这里插入图片描述
       (3)两全保险

## 两全保险净保费计算
def LiangQuan(t,s,data):
    NPxM = 'LQNPxM' + '_' +str(t) +'_' + str(s)
    NPxF = 'LQNPxF' + '_' +str(t) +'_' + str(s)
    data[NPxM]=None
    data[NPxF]=None
    for k in range(w+1-t):
        if s==0:
            data[NPxM][k] = (data['MxM'][k] - data['MxM'][k+t] + data['DxM'][k+t]) / data['DxM'][k]*10000
            data[NPxF][k] = (data['MxF'][k] - data['MxF'][k+t] + data['DxF'][k+t]) / data['DxF'][k]*10000
        else:
            if s < t+1:
                data[NPxM][k] = (data['MxM'][k] - data['MxM'][k+t] + data['DxM'][k+t]) / (data['NxM'][k]-data['NxM'][k+s])*10000
                data[NPxF][k] = (data['MxF'][k] - data['MxF'][k+t] + data['DxF'][k+t]) / (data['NxF'][k]-data['NxF'][k+s])*10000
    return data[['x',NPxM,NPxF]]
t=20  # 20年两全保险
dt1= LiangQuan(t,0,data)  # 趸缴
dt2 = LiangQuan(t,10,data)  # 10年缴费
dt3 = LiangQuan(t,20,data)  # 20年缴费
pd.concat([dt1,dt2,dt3],axis=1)[0:w+1-t].iloc[:,[0,1,2,4,5,7,8]]

       部分结果如图所示:
在这里插入图片描述

1.3 保费的敏感性分析

       净保费的计算基于一定的死亡率以及 利率假设,如果死亡率或者利率发生变化,那么净保费的计算结果也会跟着改变。下面将对死亡率和利率分别进行敏感性分析,采用的具体方法为控制变量法。
       (1)死亡率敏感性分析
       首先我们先观察当死亡率发生变化时,相应净保费产生的变化。我们将以终身寿险终身缴费和20年定期寿险20年期缴为例,计算当利率假设不变(2.5%)、基准死亡率采用 C L 1 CL1 CL1时,死亡率发生正负10%的变化时,相应的净保费为多少。

dt_sen = data[['x','QxM']]
## 定期寿险净保费计算
def DingQi2(t,s,data,BH):
    DSNPx = 'DSNPx' + BH
    data[DSNPx]=None
    for k in range(w+1-t):
        if s==0:
            data[DSNPx][k] = (data['MxM'][k] - data['MxM'][k+t])/data['DxM'][k]*10000
        else:
            if s < t+1:
                data[DSNPx][k] = (data['MxM'][k] - data['MxM'][k+t])/(data['NxM'][k]-data['NxM'][k+s])*10000
    return data[['x',DSNPx]]

## 终身寿险终身缴费净保费计算
def ZhongShen2(data,BH):
    ZSSNPx = 'ZSSNPx' + BH
    data[ZSSNPx]=None
    for k in range(w+1):
        data[ZSSNPx][k] = data['MxM'][k] / data['DxM'][k] * 10000
    return data[['x',ZSSNPx]]

## 计算换算表
def middle(data,ii=0.025):
    # 定价利率不变
    v = 1 / (1+ii)
    w = data['QxM'].count() -1 # 极限年龄
    data['PxM'] = 1- data['QxM']   # 计算生存概率

    ############# 计算中间变量
    data['lxM'] = None
    data['dxM'] = None
    data['exM'] = None
    ## 计算生存人数
    for k in range(w+1):
        if k == 0:
            data['lxM'][0] = 100000
        else:
            data['lxM'][k] = data['lxM'][k-1] * data['PxM'][k-1]
    ## 计算死亡人数
    for k in range(w+1):
        if k < w:
            data['dxM'][k] = data['lxM'][k] - data['lxM'][k+1] 
        else:
            data['dxM'][k] = data['lxM'][k]
    # 计算平均余命
    for k in range(w+1):
        if k < w:
            exM =0
            for t in range(k+1,w+1):
                exM = exM + data['lxM'][t]
            data['exM'][k] = exM / data['lxM'][k]  + 0.5
        else:
            data['exM'][k] = 0.5

    data['DxM'] =  (v ** data['x']) * data['lxM'] # 计算Dx 
    data['CxM'] =  (v ** (data['x']+0.5)) * data['dxM'] # 计算Cx 
    # 计算Mx 
    data['MxM'] = None
    for k in range(w+1):
        mxM=0
        for t in range(k,w+1):
            mxM = mxM + data['CxM'][t]
        data['MxM'][k] = mxM
    # 计算Nx 
    data['NxM'] = None
    for k in range(w+1):
        nxM=0
        for t in range(k,w+1):
            nxM = nxM + data['DxM'][t]
        data['NxM'][k] = nxM
    # 计算Rx 
    data['RxM'] = None
    for k in range(w+1):
        rxM=0
        for t in range(k,w+1):
            rxM = rxM + data['MxM'][t]
        data['RxM'][k] = rxM
    # 计算Sx 
    data['SxM'] = None
    for k in range(w+1):
        sxM=0
        for t in range(k,w+1):
            sxM = sxM + data['NxM'][t]
        data['SxM'][k] = sxM
    return data
## 死亡率为基准情形
dt_sen = middle(dt_sen,ii=0.025)

dt1 = DingQi2(20,20,dt_sen,BH='bubian')
dt2 = ZhongShen2(dt_sen,BH='bubian')
dt_basic =  pd.concat([dt1,dt2],axis=1)[21:41].iloc[:,[0,1,3]]
dt_basic
## 死亡率负变化10%
ttt = 0.1
dt_sen['QxM'] = dt_sen['QxM'] * (1-ttt)
dt_sen = middle(dt_sen,ii=0.025)

dt1 = DingQi2(20,20,dt_sen,BH='fubianhua')
dt2 = ZhongShen2(dt_sen,BH='fubianhua')
dt_basic2 =  pd.concat([dt1,dt2],axis=1)[21:41].iloc[:,[0,1,3]]
dt_basic2
## 死亡率正变化10%
ttt = 0.1
dt_sen['QxM'] = dt_sen['QxM'] / (1-ttt) * (1+ttt)
dt_sen = middle(dt_sen,ii=0.025)

dt1 = DingQi2(20,20,dt_sen,BH='zhengbianhua')
dt2 = ZhongShen2(dt_sen,BH='zhengbianhua')
dt_basic3 =  pd.concat([dt1,dt2],axis=1)[21:41].iloc[:,[0,1,3]]
dt_basic3
dt_basic = pd.concat([dt_basic,dt_basic2,dt_basic3],axis=1).iloc[:,[0,1,2,4,5,7,8]]
dt_basic
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
mpl.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.figure(figsize=(10,10))
plt.plot(dt_basic['x'],dt_basic['DSNPxbubian'],color='red',linewidth=2.0,linestyle='--')
plt.plot(dt_basic['x'],dt_basic['DSNPxfubianhua'],color='blue',linewidth=2.0,linestyle='--')
plt.plot(dt_basic['x'],dt_basic['DSNPxzhengbianhua'],color='darkturquoise',linewidth=2.0,linestyle='--')
plt.title('20年缴费20年定期寿险净保费随死亡率的变化')
plt.legend()
plt.show()
plt.figure(figsize=(10,10))
plt.plot(dt_basic['x'],dt_basic['ZSSNPxbubian'],color='red',linewidth=2.0,linestyle='--')
plt.plot(dt_basic['x'],dt_basic['ZSSNPxfubianhua'],color='blue',linewidth=2.0,linestyle='--')
plt.plot(dt_basic['x'],dt_basic['ZSSNPxzhengbianhua'],color='darkturquoise',linewidth=2.0,linestyle='--')
plt.title('终身缴费终身寿险净保费随死亡率的变化')
plt.legend()
plt.show()

       结果如下两张图所示:
寿险精算实验二——保费计算_第1张图片
寿险精算实验二——保费计算_第2张图片
       由上面两张图可知,随着死亡率升高,两种保险的保费都增加,这是死亡保险的共同特征。另外,以39岁为例,定期寿险保费变化的相对比率大于终身寿险的保费变化的相对比率,所以,相对而言,定期寿险对于死亡率的变化更加敏感。
       (2)利率敏感性分析
       同样思路,我们固定死亡率假设,仍然采用采用 C L 1 CL1 CL1,通过改变利率假设,计算不同利率条件下对应的净保费。以缴费期20年的终身寿险和以缴费期20年的两全保险为例,观察利率变动对净保费的影响,并截取18-60年龄段的数据来做简单分析。

dt_sen = data[['x','QxM']]
## 两全保险净保费计算
def LiangQuan2(t,s,data,ii=0.025):
    LQNPx = 'LQNPx' +  '_' + str(ii)
    data[LQNPx]=None
    for k in range(w+1-t):
        if s==0:
            data[LQNPx][k] = (data['MxM'][k] - data['MxM'][k+t] + data['DxM'][k+t]) / data['DxM'][k]*10000
        else:
            if s < t+1:
                data[LQNPx][k] = (data['MxM'][k] - data['MxM'][k+t] + data['DxM'][k+t]) / (data['NxM'][k]-data['NxM'][k+s])*10000
    return data[['x',LQNPx]]

## 终身寿险缴费20年净保费计算
def ZhongShen3(data,s,ii=0.025):
    ZSSNPx = 'ZSSNPx' + '_' + str(ii)
    data[ZSSNPx]=None
    for k in range(w+1-s):
        data[ZSSNPx][k] = data['MxM'][k] / (data['NxM'][k] - data['NxM'][k+s]) * 10000
    return data[['x',ZSSNPx]]
## 利率为基准情形
ii = 0.025
dt_sen = middle(dt_sen,ii=ii)

dt1 = LiangQuan2(20,20,dt_sen,ii=ii)
dt2 = ZhongShen3(dt_sen,s=20,ii=ii)
dt_basic =  pd.concat([dt1,dt2],axis=1)[18:61].iloc[:,[0,1,3]]
dt_basic
## 利率为下浮0.5%情形
ii = 0.02
dt_sen = middle(dt_sen,ii=ii)

dt1 = LiangQuan2(20,20,dt_sen,ii=ii)
dt2 = ZhongShen3(dt_sen,s=20,ii=ii)
dt_basic2_1 =  pd.concat([dt1,dt2],axis=1)[18:61].iloc[:,[0,1,3]]
dt_basic2_1
## 利率为下浮1%情形
ii = 0.015
dt_sen = middle(dt_sen,ii=ii)

dt1 = LiangQuan2(20,20,dt_sen,ii=ii)
dt2 = ZhongShen3(dt_sen,s=20,ii=ii)
dt_basic2_2 =  pd.concat([dt1,dt2],axis=1)[18:61].iloc[:,[0,1,3]]
dt_basic2_2
## 利率为上浮0.5%情形
ii = 0.03
dt_sen = middle(dt_sen,ii=ii)

dt1 = LiangQuan2(20,20,dt_sen,ii=ii)
dt2 = ZhongShen3(dt_sen,s=20,ii=ii)
dt_basic3_1 =  pd.concat([dt1,dt2],axis=1)[18:61].iloc[:,[0,1,3]]
dt_basic3_1
## 利率为上浮1%情形
ii = 0.035
dt_sen = middle(dt_sen,ii=ii)

dt1 = LiangQuan2(20,20,dt_sen,ii=ii)
dt2 = ZhongShen3(dt_sen,s=20,ii=ii)
dt_basic3_2 =  pd.concat([dt1,dt2],axis=1)[18:61].iloc[:,[0,1,3]]
dt_basic3_2
dt_basic = pd.concat([dt_basic,dt_basic2_1,dt_basic2_2,dt_basic3_1,dt_basic3_2],axis=1).iloc[:,[0,1,2,4,5,7,8,10,11,13,14]]
dt_basic
plt.figure(figsize=(10,5))
plt.plot(dt_basic['x'],dt_basic['LQNPx_0.025'],color='red',linewidth=2.0,linestyle='--')
plt.plot(dt_basic['x'],dt_basic['LQNPx_0.02'],color='blue',linewidth=2.0,linestyle='--')
plt.plot(dt_basic['x'],dt_basic['LQNPx_0.015'],color='darkturquoise',linewidth=2.0,linestyle='--')
plt.plot(dt_basic['x'],dt_basic['LQNPx_0.03'],color='darkgreen',linewidth=2.0,linestyle='--')
plt.plot(dt_basic['x'],dt_basic['LQNPx_0.035'],color='orange',linewidth=2.0,linestyle='--')
plt.title('不同利率下20年两全保险20年缴费期净保费随死亡率的变化')
plt.legend()
plt.show()
plt.figure(figsize=(10,5))
plt.plot(dt_basic['x'],dt_basic['ZSSNPx_0.025'],color='red',linewidth=2.0,linestyle='--')
plt.plot(dt_basic['x'],dt_basic['ZSSNPx_0.02'],color='blue',linewidth=2.0,linestyle='--')
plt.plot(dt_basic['x'],dt_basic['ZSSNPx_0.015'],color='darkturquoise',linewidth=2.0,linestyle='--')
plt.plot(dt_basic['x'],dt_basic['ZSSNPx_0.03'],color='darkgreen',linewidth=2.0,linestyle='--')
plt.plot(dt_basic['x'],dt_basic['ZSSNPx_0.035'],color='orange',linewidth=2.0,linestyle='--')
plt.title('不同利率下20年两全保险20年缴费期净保费随死亡率的变化')
plt.legend()
plt.show()

       结果如下两图所示:
寿险精算实验二——保费计算_第3张图片
寿险精算实验二——保费计算_第4张图片
       通过以上两张图,我们可以发现,净保费随着利率的升高而减少,并且在利率较小的时候,净保费对利率的敏感性更强。从年龄上看,随着投保年龄的增长,所需要缴纳的净保费也会升高。

二、传统寿险的毛保费

       本实验的目的是熟悉毛保费的计算,了解费用率结构对毛保费的影响。
       本章节的实验内容为:设计定期寿险、终身寿险、两全保险的不同缴费期的费用比例,从而得到毛保费费率表。

2.1 毛保费计算公式

       本章节仍然采用上章编制生命表换算表设计的保险产品,定期寿险、两全保险的费用率假设如下:
寿险精算实验二——保费计算_第5张图片
       终身寿险费用假设如下:
寿险精算实验二——保费计算_第6张图片
       (1)趸缴20年定期寿险毛保费计算公式
        G P x = 10000 ( M x − M x + 20 ) 0.9 D x GP_x=\frac{10000(M_x-M_{x+20})}{0.9D_x} GPx=0.9Dx10000(MxMx+20)
       (2)10年缴费20年定期寿险毛保费计算公式
        G P x = 10000 ( M x − M x + 20 ) N x − N x + 10 − ( 0.5 D x + 0.3 D x + 1 + . . . + 0.08 D x + 10 ) GP_x=\frac{10000(M_x-M_{x+20})}{N_x-N_{x+10}-(0.5D_x+0.3D_{x+1}+...+0.08D_{x+10})} GPx=NxNx+10(0.5Dx+0.3Dx+1+...+0.08Dx+10)10000(MxMx+20)
       (3)20年缴费20年定期寿险毛保费计算公式
        G P x = 10000 ( M x − M x + 20 ) N x − N x + 20 − ( 0.6 D x + 0.4 D x + 1 + . . . + 0.08 D x + 10 ) GP_x=\frac{10000(M_x-M_{x+20})}{N_x-N_{x+20}-(0.6D_x+0.4D_{x+1}+...+0.08D_{x+10})} GPx=NxNx+20(0.6Dx+0.4Dx+1+...+0.08Dx+10)10000(MxMx+20)
       (4)10年缴费终身寿险毛保费计算公式
        G P x = M x N x − N x + 10 − ( 0.5 D x + 0.3 D x + 1 + . . . + 0.08 D x + 10 ) GP_x=\frac{M_x}{N_x-N_{x+10}-(0.5D_x+0.3D_{x+1}+...+0.08D_{x+10})} GPx=NxNx+10(0.5Dx+0.3Dx+1+...+0.08Dx+10)Mx
       (5)20年缴费终身寿险毛保费计算公式
        G P x = M x N x − N x + 20 − ( 0.6 D x + 0.4 D x + 1 + . . . + 0.08 D x + 10 ) GP_x=\frac{M_x}{N_x-N_{x+20}-(0.6D_x+0.4D_{x+1}+...+0.08D_{x+10})} GPx=NxNx+20(0.6Dx+0.4Dx+1+...+0.08Dx+10)Mx
       (6)缴费至59岁(至少缴费10年)终身寿险毛保费计算公式
        G P x = M x N x − N 60 − ( 0.6 D x + 0.3 D x + 1 + . . . + 0.08 D x + 10 ) GP_x=\frac{M_x}{N_x-N_{60}-(0.6D_x+0.3D_{x+1}+...+0.08D_{x+10})} GPx=NxN60(0.6Dx+0.3Dx+1+...+0.08Dx+10)Mx

2.2 运用Python计算保费

       首先,在编制生命表换算表这一章节,我们已经得到编制好的换算表。下面将根据生命表中的“非养老类业务一表”,并假设保额以1万元为单位保额,运用Python计计算单位保额对应的毛保费。
       未完待续
       
       
       
       
       
       
       
       
       
       
       
       
       

你可能感兴趣的:(寿险精算)