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。若需支持连续型或分数年龄假设,需替换生存概率与折现方式,本案例仅覆盖离散年度模型。