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调高,两保费应下降(贴现更强)。