December 19, 2023 | 储蓄和投资 数据分析 观点
我的保险经纪给我推荐了FWD Invest First Plus这个ILP,借机拆解了一下。因为受网上很多负面评价的影响,我本身对ILPs有一定偏见,但是拆解这个产品以后,让我的态度有了一些改观。
我没有购买任何ILP,我的投资主要在Robo advisor(Endowus)和券商平台的ETF(FSMOne,IBKR)。ILPs的费用只是其中一个原因,灵活度和沉没成本是最重要的原因。
FWD提供50+基金选择(FWD Fund Lab),股、债、货币基金平衡,可以做合理的搭配控制风险。当然相对于Robo advisor和券商平台,基金选择的还是非常有限。可选基金包括S&P500 Index Fund,对于我这样无脑投大盘的投资者是一个选项。
保险经纪极力推荐的Fundsmith Equity Fund,据说是表现非常好的AI Fund(accredited investor Fund)。粗略看这个基金,投资的分布基本是Large-cap+Growth,这个组合就是在控制风险的同时追求增长。过去十年表现良好,当然过去十年大盘也表现很好。我不会分析基金——因为不懂,所以我不会轻易投,investmentmoats做了很详细的分析。
ILP被很多人诟病的一个原因,是它的费用问题。那它到底多贵呢?我看到不少人说,退掉ILP,用Robo。那是不是Robo advisor就更有优势呢?于是我用网上的资源做了一个具体的计算。以下的计算完全是给予公开信息和基本投资收益假设,不保证绝对准确,更不代表任何投资建议。
计算数据基于以下假设
import numpy as np
import pandas as pd
from IPython.display import display
import matplotlib.pyplot as plt
premium = 12000
payment_term = 15
policy_term = 25
irr = 0.08
# ILP Bonus and Fees---------------------
# booster bonus rate
reward_band = lambda a : 4 if (a / 12000 > 4) else int(a / 12000)
booster_bonus_rate_table = np.array([
[0.17, 0.18, 0.19, 0.20, 0.21], # 15
[0.17, 0.18, 0.19, 0.20, 0.21], # 16
[0.17, 0.18, 0.19, 0.20, 0.21], # 17
[0.17, 0.18, 0.19, 0.20, 0.21], # 18
[0.17, 0.18, 0.19, 0.20, 0.21], # 19
[0.20, 0.21, 0.22, 0.23, 0.24], # 24
[0.20, 0.21, 0.22, 0.23, 0.24], # 24
[0.20, 0.21, 0.22, 0.23, 0.24], # 24
[0.20, 0.21, 0.22, 0.23, 0.24], # 24
[0.20, 0.21, 0.22, 0.23, 0.24], # 24
[0.26, 0.27, 0.31, 0.32, 0.33], # 25
[0.26, 0.27, 0.31, 0.32, 0.33], # 26
[0.26, 0.27, 0.31, 0.32, 0.33], # 27
[0.26, 0.27, 0.31, 0.32, 0.33], # 28
[0.26, 0.27, 0.31, 0.32, 0.33], # 29
[0.27, 0.28, 0.32, 0.33, 0.34], # 30
])
booster_bonus_rate = lambda premium, pt: booster_bonus_rate_table[pt - 15][reward_band(premium)]
# loyalty bonus rate
loyalty_bonus_rate = lambda py: 0.012 if py >= 21 else 0.01 if py >= 11 else 0.007 if py >= 6 else 0
# initial account charge, throughout the premium payment term only, monthly charge
# N is policy year
A = lambda pt: 0.01 if pt >= 30 else 0.012 if pt >= 25 else 0.014 if pt >= 20 else 0.018
inital_account_charge_monthly = lambda premium, pt, N: A(pt) / 12 * premium * N
# policy charge: start from the 25th policy month (5th year) to the end of policy term
# N is policy year or payment term if policy year passed the term
policy_charge = lambda premium, N, pt: 0.012 / 12 * premium * (N if N <= pt else pt)
# ---------------------
# Calculation---------------------
fig, ax = plt.subplots() # Create a figure containing a single axes.
def cal_return(fund_expense_ratio, type_of_investment, fix_fee=0):
policy_values = [0] * policy_term
policy_value_total = 0
fees = [0] * policy_term
bonuses = [0] * policy_term
interests = [0] * policy_term
for N in range(0, policy_term):
booster_bonus = 0 if not type_of_investment == 'ILP' else 0 if N > 4 else booster_bonus_rate(premium, payment_term) * premium
bonuses[N] = int(booster_bonus)
policy_values[N] = 0 if N >= payment_term else (premium + booster_bonus)
# monthly fee
yearly_fee = 0
yearly_interest = 0
for n in range(0, 12):
# calculate fee
fee = 0
if type_of_investment == 'ILP':
fee += inital_account_charge_monthly(premium, payment_term, N + 1) if N < payment_term else 0
fee += 0 if N < 3 else policy_charge(premium, N + 1, payment_term)
fee += (policy_value_total + policy_values[N]) * (fund_expense_ratio / 12)
policy_values[N] -= fee
# for record only
yearly_fee += fee
# add fee
policy_values[N] -= fix_fee
yearly_fee += fix_fee
# yearly interest
yearly_interest = (policy_value_total + policy_values[N]) * (irr)
policy_values[N] += yearly_interest
fees[N] = int(yearly_fee)
interests[N] = int(yearly_interest)
# add loyalty_bonus, which paid at the end of policy year based on the policy value
if type_of_investment == 'ILP':
loyalty_bonus = 0 if N < 5 else loyalty_bonus_rate(N + 1) * policy_value_total
policy_values[N] += loyalty_bonus
# for record
bonuses[N] += int(loyalty_bonus)
policy_values[N] = int(policy_values[N])
policy_value_total += policy_values[N]
df = pd.DataFrame(data=[policy_values, interests, fees, bonuses])
transposed_df = df.transpose()
transposed_df.columns = ['value_per_annual', 'interest', 'fees', 'bonuses']
display(transposed_df)
print("Total Value:", sum(policy_values))
# plot the graph
ax.plot([i for i in range(1, policy_term + 1)], np.cumsum(policy_values), label=type_of_investment)
leg = plt.legend(loc='upper center')
cal_return(0.0061, "ILP") # https://lgi.dzhintl.com/doc/uploads/documents/index.php?type=FS&fid=IUSI&lang=EN
cal_return(0.004 + 0.0032, "Robo") # https://endowus.com/investment-funds-list/lion-global-infinity-u.s-500-stock-index-fund-SG9999003289
cal_return(0.000945, "ETF", 50) # https://www.ssga.com/library-content/products/factsheets/etfs/us/factsheet-us-en-spy.pdf
plt.show()
费用对资产的累积有很大的影响:Cost really matters a lot!
101 ILPs的费用并没有比Robo advisor高。当然计算本身很多假设性,保险产品的复杂操作可能会影响收益。ILPs产品本身也存在政策风险,boost bonus,loyalty bonus,包括基金收费模型保险公司有权更改(如下):
产品介绍里有一条"Reserving the right to change the pricing model of subfund"。这让产生我疑问:ILP背后Fund的费用到底是多少,这可能一定程度上影响计算。上面的计算我使用了Factsheet里的expense ratio。在FWD Fund Lab网站上并不能看到它的费用。至少从Endowus的返利模型上看,机构投资Sub-fund的费用和个人投资者是不一样的。基金管理的隐形费用在ILP里很难看出来。
相比Robo,101 ILPs的设计太复杂,其中的各种福利和规则让人感觉不透明和无掌控感,也就是通常大家觉得保险公司各种隐型条款,层层收费,对此信心不足。
ILPs灵活度太低是更大的问题。对于年轻人,投资是一个持续学习的过程,ILPs最大的诟病,是沉没成本太高。Robo advisor在初始资金少的情况下,费用低,也没有退出成本。资产累计到一定程度可以选择其他的方式。
以上的假设是无脑定投标普500指数。实际情况要更复杂。因为股票市场的高波动性,很难保证在我们需要用钱时市场状况好。理论上在逐步接近退休年龄时,我们需要调整股债比例降低风险。ILPs和Robo都选择股债组合的搭配,自动平衡。而券商平台上只能自己调配,增加交易成本。ILPs和Robo的优势就是可以让你做到hands-free。
在逐步拆解这个ILP产品过程中我也学到很多,对ILPs的态度有了改观,可以更中立的去看待不同的理财投资产品。总体来说,我对这家年轻的保险公司印象不错,比较认可它的电子化,信息透明度。这个产品的低管理费和返利力度(相比于其他很多保险产品),也让我对保险投资产品有了新的看法。以及更好的认识了Robo advisor——我才意识到它费用其实很高!如果已经购买101 ILPs,没有必要焦虑,保险也有独特的好处,比如资产隔离,遗产规划等,本身也可以很好的累积财富。而Robo advisor也不一定是保险理财产品的最佳替代方式。盲目退保可能得不偿失,如果没有信心自己管理资产,那安心的供保也会有很好的收益。
数据仍告诉我们:定投被动指数基金是最有效的低成本、低维护的资产增值方式。但仅仅是历史数据,未来谁都不可以预测!第一个ETF产生于1993,30年前而已,谁知道以后金融会如何发展,说不定比特币统治世界。保持开放心态,持续学习。
这是我偶然搜到的一位保险经纪对于ILPs的解释。我以自己目前有限的认知予以反驳。我觉得因为一些误导性的推销话术反而让ILPs诸多诟病:当客户发现这些错误引导后,对ILPs的态度就特别负面。
参考: