1 2 3

什么保险值得买?

未来的钱,也许没你想的那么值钱,这是一件挺反直觉的事。要解释这一切,还要从折现率说起

GitHub项目地址:insurance.ipynb

有位朋友买重疾险,保险顾问给的方案是,身故后返还两倍于累计缴纳金额的钱。听起来像捡便宜,究竟是怎么回事呢?

保险顾问给的具体方案是:

  • 支出:分 30 年支付重疾险,每年付 9000 元,共 27 万元
  • 收益:享受终生重疾险;身故后保险公司一次性返还 50 万元

乍看很划算。是不是真香,算过才知道。

为了把问题讲明白,先引一下背景知识。

一、折现率和净现值

1.1 什么是折现率

由于生息潜力和通胀预期,同样数额的钱在未来更不值钱。将未来的钱折算成现在的钱,存在折扣率,我们叫它 折现率 (Discount rate)。举个例子,如果你认为一年后的 107 元与现在的 100 元相当,折现率就是 7%。

1.2 什么是现值

按折现率,把“未来的钱”折算成“现在的钱”的值就是 现值 (Present value)。

$一年后的107元的现值 = \frac{107}{1 + 折现率} = \frac{107}{1 + 7\%} = 100$

1.3 什么是净现值

净现值 (Net present value),简记为 NPV。指“未来现金流入现值”与“未来现金流出现值”的差额。可以简单理解为 收益的现值 - 成本的现值

1.4 计算净现值

代入保险方案来计算净现值。下表中正值代表收益,负值代表成本:

0 1 2 3 29 t
-9,000 -9,000 -9,000 -9,000 -9,000 +500,000

假设折现率为 2%,净现值为:

$NPV = -9000 -9000*\frac{1}{1 + 0.02} -9000*\frac{1}{(1 + 0.02)^{2}} + ... -9000*\frac{1}{(1 + 0.02)^{29}} + 500000*\frac{1}{(1 + 0.02)^{t}}$

其中,t 是投保到身故的间隔年数,值域 $[30, +\infty]$

根据上式,计算净现值的 Python 函数如下:

# 计算成本、收益、NPV
def calc_npv(discount_rate=0.02, t=30):
    """返回 成本的现值、收益的现值、净现值NPV
    """
    cost = sum([9000/((1+discount_rate)**i) for i in range(30)])
    profit = 500000/((1+discount_rate)**t)
    return cost, profit, profit - cost

有了 成本的现值收益的现值NPV 这些值,我们就可以进行分析了。

二、成本-收益曲线

NPV = 收益的现值 - 成本的现值,因此展示 收益的现值成本的现值 比展示 NPV 更直观

下图是用 2% 折现率计算的成本-收益曲线。

由图可知:

  • 成本是常数:在缴费完成的情况下成本是常数,图中为横线
  • 收益随时间递减:50 万的到手时间越晚,其现值越低

盈亏平衡点在 45 年处。按 30 岁投保计算,第 45 年是 75 岁。这意味着,活过 75 岁就“亏了”。别忘了这是用 2% 折现率计算的。使用更高的折现率,“亏”的时间还会提前。

画图代码:

# 成本/收益曲线
import matplotlib.pyplot as plt

discount_rate = 0.02
npv = [calc_npv(discount_rate, t) for t in range(30, 60)]
x_list = list(range(30, 60))
cost_list = [e[0] for e in npv]
profit_list = [e[1] for e in npv]

plt.plot(x_list, cost_list, label='cost')
plt.plot(x_list, profit_list, label='profit', marker='.')
plt.title('cost-profit curves')
plt.xlabel('(years)')
plt.ylabel('(yuan)')
plt.legend()
plt.show()

Note: 我觉得 2% 的折现率太低了。以下是 2023 年的数据,供参考:

三、不同折现率的 NPV 曲线

净现值 (NPV) 是最能直观反映盈亏的指标。特别要注意 NPV 由正转负的点,即盈亏平衡点。

3%, 5%, 7% 三种折现率做 NPV 曲线。

假设 30 岁投保,由图可知:

  1. 盈亏平衡点:
    • 3% 折现率:65 岁达盈亏平衡点
    • 7% 折现率:无法盈亏平衡,交满 30 年保费时 NPV 已为负数
  2. 80 岁时的 NPV:
    • 3% 折现率:“亏” 6.7 万元
    • 7% 折现率:“亏” 10.2 万元
  3. 折现率 5% 和 7% 的 NPV 曲线出现交叉:
    • 这是因为折现率从 5% $\to$ 7% 时,成本现值 的下降速度高于 收益现值 的下降速度

请注意,“亏”打引号,是因为没有计算重疾险的兑付。在你亏的数字上,扣除保险公司兑付的保险费用,才是保险公司的利润,也就是你的实际亏损。

画图代码:

# 不同折现率,对应的净现值曲线
x_list = list(range(30, 60))
get_npv_list = lambda e: [calc_npv(e, t)[2] for t in range(30, 60)]
dr_02 = get_npv_list(0.02)
dr_03 = get_npv_list(0.03)
dr_05 = get_npv_list(0.05)
dr_07 = get_npv_list(0.07)

plt.plot(x_list, dr_02, label='2%')
plt.plot(x_list, dr_03, label='3%')
plt.plot(x_list, dr_05, label='5%')
plt.plot(x_list, dr_07, label='7%')
plt.title('NPV curves')
plt.xlabel('(years)')
plt.ylabel('(yuan)')
plt.legend()
plt.show()

Note: 7% 折现率也是有说法的。它是 OMB 提供的参考值,维基百科 原文如下:

“The US government uses a variety of discount rates but something around 7% is what the US Office of Management and Budget (OMB) recommends for a pretax rate of return on private investments. In the United Kingdom, HM Treasury fixes the social discount rate for the public sector at 3.5%.”

四、内部收益率 IRR

内部收益率 (IRR) 是净现值为 0 时的折现率。该值越大,对投保人越有利。

下面是很不严谨的 IRR 计算结果。因为只考虑那 50 万的事,不考虑保险兑付情况。毕竟每个人健康状况不同,保险兑付情况不一样,不太好算。

import numpy as np
from scipy.optimize import fsolve

def calc_root(t=50):
    f = lambda e: 500000/((1+e)**t) - sum([9000/((1+e)**i) for i in range(30)])
    return fsolve(f, 0)[0]

root = calc_root()
print(root)

输出的 $root \approx 0.017$

也就是说,30 岁投保 80 岁身故(参数 t = 50)的情况下,内部收益率 IRR 为 0.017。这个值是偏低的。

至今为止都是纸面计算。现实远比纸面魔幻,试想这些不确定因素:

  • 由于对身故情形的要求,50 万返款拿不到手
  • 30 - 50 年的时间维度下,可能发生大规模通胀,导致折现率被低估
  • 未来 30 年可能发生断供

本就不高的 IRR,显得更低了

五、简单结论

一通计算之下,这款产品似乎不那么香了。作为参考,如果你:

  • 活到 80 岁
  • 兑付 6.7 万保费(现值)
  • 成功返款 50 万

达到这个标准,恭喜你到达了盈亏平衡点。高于这个点你赚了,低于这个点保险公司赚了,你俩是零和博弈。

六、后日谈

作为风险厌恶者,我喜欢简单的保险产品。不要返款、不要年金。这是噱头。层层条款背后,大概率你玩不过它。

它是大机构,你是普通人,和大机构产生纠纷,输多赢少。所以我的策略是尽量避免和机构产生纠纷。越简单的合同,产生纠纷的几率越低。简单是优势来着。