3. 死亡保险金现值计算

死亡保险金现值计算 学习卡片

任务目标

用生命表计算两类死亡保险的趸缴净保费(一次性纯保费):

  • 终身寿险:被保险人在任意年龄死亡时给付保险金,给付发生在死亡当年年末。
  • 定期寿险:仅在保障期 n 年内死亡才给付,同样年末给付。

采用离散模型,给付额固定为 1 元,利率固定。核心公式:

终身寿险:A_x = Σk=0..∞ vk+1 · kpx · qx+k

定期寿险:A1x:n = Σk=0..n-1 vk+1 · kpx · qx+k

其中 v = 1/(1+i) 为贴现因子,kpx 为 x 岁存活 k 年的概率,qx+k 为第 k+1 年当年死亡概率。

环境与依赖

Python 3.8+,仅用标准库,无需第三方包。生命表以字典形式内嵌,键为年龄,值为该年龄的死亡概率 qx。

实现代码

import math

# 简化生命表:年龄 -> 当年死亡概率 q_x(示例数据,可替换为真实生命表)
LIFE_TABLE = {
    30: 0.0010, 31: 0.0011, 32: 0.0012, 33: 0.0013, 34: 0.0015,
    35: 0.0017, 36: 0.0019, 37: 0.0021, 38: 0.0024, 39: 0.0027,
    40: 0.0030, 41: 0.0034, 42: 0.0038, 43: 0.0043, 44: 0.0048,
    45: 0.0054, 46: 0.0061, 47: 0.0069, 48: 0.0078, 49: 0.0088,
    50: 0.0100, 51: 0.0113, 52: 0.0128, 53: 0.0145, 54: 0.0164,
    55: 0.0186, 56: 0.0211, 57: 0.0239, 58: 0.0271, 59: 0.0307,
    60: 0.0348, 61: 0.0394, 62: 0.0446, 63: 0.0505, 64: 0.0572,
    65: 0.0648, 66: 0.0734, 67: 0.0831, 68: 0.0941, 69: 0.1065,
    70: 0.1206, 71: 0.1365, 72: 0.1545, 73: 0.1748, 74: 0.1978,
    75: 0.2237, 76: 0.2530, 77: 0.2860, 78: 0.3232, 79: 0.3650,
    80: 0.4120, 81: 0.4648, 82: 0.5240, 83: 0.5903, 84: 0.6643,
    85: 0.7466, 86: 0.8378, 87: 0.9385, 88: 1.0000,
}

def survival_prob(x, k, table):
    """计算 x 岁存活 k 年的概率 k_p_x。"""
    p = 1.0
    for age in range(x, x + k):
        q = table.get(age)
        if q is None:
            return 0.0
        p *= (1.0 - q)
    return p

def whole_life_insurance(x, i, table):
    """终身寿险趸缴净保费 A_x,年末给付 1 元。"""
    v = 1.0 / (1.0 + i)
    premium = 0.0
    k = 0
    while True:
        q = table.get(x + k)
        if q is None:
            break
        kp = survival_prob(x, k, table)
        premium += (v ** (k + 1)) * kp * q
        k += 1
    return premium

def term_life_insurance(x, n, i, table):
    """定期寿险趸缴净保费 A^1_{x:n},保障 n 年,年末给付 1 元。"""
    v = 1.0 / (1.0 + i)
    premium = 0.0
    for k in range(n):
        q = table.get(x + k)
        if q is None:
            break
        kp = survival_prob(x, k, table)
        premium += (v ** (k + 1)) * kp * q
    return premium

if __name__ == "__main__":
    x = 30          # 投保年龄
    i = 0.03        # 年利率 3%
    n = 20          # 定期寿险保障期 20 年

    a_whole = whole_life_insurance(x, i, LIFE_TABLE)
    a_term = term_life_insurance(x, n, i, LIFE_TABLE)

    print(f"投保年龄 x = {x}, 年利率 i = {i:.0%}")
    print(f"终身寿险趸缴净保费 A_x      = {a_whole:.6f}")
    print(f"定期寿险趸缴净保费 A^1_x:n  = {a_term:.6f}  (n = {n})")
    print(f"定期/终身 比值             = {a_term / a_whole:.4f}")

运行方式

将代码保存为 death_insurance.py,执行:

python death_insurance.py

验证方法与通过条件

  • 程序正常输出两行保费数值,无异常。
  • 终身寿险保费应大于定期寿险保费(保障范围更广),即比值 < 1。
  • 两个保费均应在 (0, 1) 区间内,因为给付额为 1 元且需贴现。
  • 将 n 增大到覆盖生命表末尾(如 n=60),定期寿险保费应趋近终身寿险保费。
  • 将利率 i 调高,两保费应下降(贴现更强)。

计算流程

输入 x, i, n, 生命表 贴现因子 v = 1/(1+i) 存活概率 k_p_x 逐年累加 v^(k+1)·k_p_x·q_(x+k) k = 0,1,2,... 终身寿险:k 到生命表末尾 定期寿险:k = 0..n-1 输出 A_x 与 A^1_(x:n) 比较与验证