4. 两全保险保费计算
任务说明
两全保险同时包含生存给付与死亡给付:被保险人在保险期满仍生存,领取满期生存保险金;若在保险期内死亡,领取死亡保险金。本案例用离散型终身/定期寿险的现值公式,计算两全保险的趸缴净保费(一次性缴清)和年缴净保费(均衡保费)。
精算模型
设保险期限为 n 年,死亡保险金为 D,满期生存保险金为 S,年利率 i,折现因子 v=1/(1+i)。记 kpx 为 x 岁存活 k 年的概率,qx 为当年死亡概率。
- 死亡给付现值(定期寿险):A_death = Σ(k=0..n-1) v^(k+1) · kpx · q(x+k) · D
- 生存给付现值(生存保险):A_surv = v^n · npx · S
- 趸缴净保费:NSP = A_death + A_surv
- 年金现值:ä_x:n = Σ(k=0..n-1) v^k · kpx
- 年缴净保费:NLP = NSP / ä_x:n
完整代码
import math
def survival_probs(qx_list, n):
"""由逐年死亡概率 qx_list 计算 kpx (k=0..n)"""
kpx = [1.0]
for k in range(n):
kpx.append(kpx[-1] * (1 - qx_list[k]))
return kpx # kpx[k] = kpx
def two_life_premium(qx_list, i, D, S, n):
"""
qx_list: 长度 n 的逐年死亡概率 [q_x, q_{x+1}, ..., q_{x+n-1}]
i: 年利率; D: 死亡保险金; S: 满期生存保险金; n: 保险期限
"""
v = 1.0 / (1.0 + i)
kpx = survival_probs(qx_list, n)
A_death = 0.0
for k in range(n):
A_death += (v ** (k + 1)) * kpx[k] * qx_list[k] * D
A_surv = (v ** n) * kpx[n] * S
annuity = 0.0
for k in range(n):
annuity += (v ** k) * kpx[k]
nsp = A_death + A_surv
nlp = nsp / annuity
return {
"A_death": A_death,
"A_surv": A_surv,
"annuity": annuity,
"NSP": nsp,
"NLP": nlp,
}
if __name__ == "__main__":
# 示例:30岁投保,5年期,年利率3%
qx = [0.001, 0.0012, 0.0015, 0.0018, 0.0022]
res = two_life_premium(qx_list=qx, i=0.03, D=100000, S=100000, n=5)
for k, val in res.items():
print(f"{k:8s} = {val:,.4f}")
运行与验证
直接运行脚本:python two_life.py。程序会打印死亡给付现值、生存给付现值、年金现值、趸缴净保费与年缴净保费。
判定通过条件:
- NSP 应等于 A_death + A_surv,且大于 0;
- NLP = NSP / annuity,且 NLP 小于 NSP(因年金现值大于 1);
- 将 i 调大,NSP 与 NLP 应下降;将 D 或 S 调大,NSP 与 NLP 应上升。
常见问题
若 qx_list 长度与 n 不一致会索引越界,调用前需保证 len(qx_list) == n。若需支持连续型或分数年龄假设,需替换生存概率与折现方式,本案例仅覆盖离散年度模型。