アクチュアリーのためのPython入門(保険数理モデリング編第4回)
保険契約の現在価値
📚 アクチュアリーのためのPython入門
この記事は保険数理モデリング編の一部です。
▶ 目次はこちら
▶ 逆引きガイドはこちら
はじめに
前回は複数商品の将来キャッシュフローの計算をしました。
複数商品を一度に取り扱う場合は、商品種類によって異なる
- 死亡率
- 解約率
- 給付種類(死亡や生存など)
- 保険料や解約返戻金
などを関数化しました。
キャッシュフローの計算には、
商品種類による分岐はなるべくなくし、
修正しやすく、分かりやすくしました。
前回までのキャッシュフローは、
結果を表示するため、2030年度までとしていましたが、
実際は保有契約がなくなるまでキャッシュフローは続きます。
その上で、今回はキャッシュフローの現在価値を計算します。
キャッシュフローの現在価値について
生命保険数学では、
将来の支払いに備えるため留保しておく金額を
保険料積立金(責任準備金)としています。
これはあらかじめ決められた予定利率や予定死亡率などに
基づいて計算されるもので、日本の会計基準で用いられます。
一方で、現在の市場環境や実績の死亡率などを
反映して評価を行う場面もあります。
例えば、将来の保険金の支払いを「今の金利で」評価すると、
その価値はどの程度になるのかという考え方です。
実績の死亡率などを反映した将来のキャッシュフローを、
現在の市場環境(主に金利)を用いて評価したものを
経済価値ベースの保険負債といいます。
(他にリスクマージンなども保険負債に含まれます)
なお、保険料積立金の計算式は、
$$_tV = A - P _{net}\cdot\ddot{a}$$の形で、支払現価-収入現価です。
キャッシュフローもそれに合わせて、
支払-収入で計算します(前回までとは符号が逆です)。
キャッシュフローの現在価値も保険料積立金と同じように、
将来の支払いに備えるため留保しておくべき金額です。
ただし、安全を見込んだ予定死亡率や予定利率ではなく、
より実態に近い額となります。
cashflow.pyの準備
前回まで複数商品の保有契約を計算したcashflow.pyとは別に、
現在価値を計算するpresentvalue.pyを作成しますが、
その前にcashflow.pyの一部を修正しておきます。
まず、キャッシュフローの計算を関数化して、
外部ファイルから引用できるようにします。
また、結果の出力部分は、
引用した場合は、読み込まないようにします。
具体的には次のようにします。
# キャッシュフロー計算の関数化 base_yearは計算基準年度
def create_cashflow(base_year = 2022):
# 結果を入れる変数
results1 = []
df = pd.read_excel("contr_all.xlsx")
for _, row in df.iterrows():
product = row["product"]
policy = int(row["policy"])
sex = row["sex"]
age = int(row["age"])
term = row["term"]
amount = int(row["amount"])
# 保険収支の計算
l0 = amount # 初期保険金額
# 残存表の作成
lx = [l0] # 保有保険金額
dx = [] # 死亡保険金額
wx = [] # 解約保険金額
mx = [] # 満期保険金額
n = InsPeriod(product, sex, age, term) # 保険期間
m = PremPeriod(product, sex, age, term) # 保険料払込期間
# 生命表の作成
for t in range(n):
q = qdx(sex, age + t)
w = qwx(product, t, m)
next_d = lx[-1] * q * mort_k(product)
next_w = lx[-1] * w
if t == n - 1:
next_m = lx[-1] - next_d - next_w
next_l = 0
else:
next_m = 0
next_l = lx[-1] - next_d - next_w
lx.append(next_l)
dx.append(next_d)
wx.append(next_w)
mx.append(next_m)
# 補整値の計算
af = amount / lx[base_year - policy + 1]
# 保険収支の項目
inprem = [] # 保険料収入
benefit = [] # 保険金支払い
surrender = [] # 解約返戻金支払い
expenses = [] # 事業費
cashflow = [] # キャッシュフロー
P = float(prem_func(product, sex, age, term))
# キャッシュフローの計算
for t in range(n):
# 保険料の収入
if t < m:
inprem.append(lx[t] * P)
else:
inprem.append(0)
# 保険金の支払い
if t == n - 1:
# 死亡+満期保険金の支払い
pay_ben = dx[t] + mx[t] * maturity(product)
else:
# 死亡保険金の支払い
pay_ben = dx[t]
benefit.append(pay_ben)
# 解約返戻金の支払い
W = float(sv_func(product, sex, age, term, t + 1))
surrender.append(wx[t] * W)
# 事業費の支払い
expenses.append(inprem[t] * 0.3)
# キャッシュフロー
cashflow.append(benefit[t] + surrender[t]\
+ expenses[t] - inprem[t])
# 商品別のキャッシュフロー
results1.append({"product":product,
"year":policy + t,
"benefit":int(benefit[t] * af),
"surrender":int(surrender[t] * af),
"expenses":int(expenses[t] * af),
"inprem":int(inprem[t] * af),
"cashflow":int(cashflow[t] * af)
})
result_df = pd.DataFrame(results1)
# 商品別の集計
grouped_product = result_df.groupby(["product", "year"]).sum()
summary_product = grouped_product.reset_index()
# 合計の集計
grouped_total = result_df.groupby("year").sum()
summary_total = grouped_total.reset_index()
# Totalのラベルを付ける
summary_total["product"] = "Total"
# 結合
summary = pd.concat([summary_product, summary_total], ignore_index=True)
# 年度のフィルタ
summary = summary[summary["year"] >= base_year + 1]
return summary
# キャッシュフローの出力
if __name__ == "__main__":
summary = create_cashflow()
summary.to_excel("result_all.xlsx", index=False)
キャッシュフローを計算するcreate_cashflow関数は、
引数として、計算基準年度base_yearを持たせます。
また、その初期値を今回は2022年度末としておきます。
if __name__ == "__main__":で、
メインで動作させた場合はキャッシュフローを出力し、
ファイルを引用した場合は、出力させないようにします。
ここまでが、cashflow.pyの準備です。
現在価値を計算するファイルの作成
現在価値を計算するファイルを新しく作成します。
ファイル名はpresentvalue.pyとしておきます。
先ほど作成したcreate_cashflow関数を使えるようにしておきます。
今回使用する金利は、金融庁が過去に行った
経済価値ベースのフィールドテストの金利を使用します。
現価率の計算から分かるように、
キャッシュフローはすべて年央に発生すると仮定しています。
from core import *
from cashflow import create_cashflow
rate0 = [
0.00178,0.00295,0.00328,0.00400,0.00478,0.00519,0.00588,0.00680,0.00769,0.00877,
0.00972,0.01053,0.01129,0.01204,0.01283,0.01367,0.01452,0.01532,0.01605,0.01667,
0.01718,0.01759,0.01795,0.01827,0.01856,0.01885,0.01914,0.01944,0.01977,0.02012,
0.02051,0.02092,0.02135,0.02178,0.02221,0.02263,0.02305,0.02345,0.02384,0.02421,
0.02458,0.02492,0.02526,0.02558,0.02590,0.02619,0.02648,0.02676,0.02702,0.02728,
0.02753,0.02776,0.02799,0.02821,0.02842,0.02863,0.02883,0.02902,0.02920,0.02938,
0.02956,0.02972,0.02988,0.03004,0.03019,0.03034,0.03049,0.03063,0.03076,0.03089,
0.03102,0.03114,0.03126,0.03138,0.03150,0.03161,0.03172,0.03182,0.03193,0.03203,
0.03212,0.03222,0.03231,0.03240,0.03249,0.03258,0.03267,0.03275,0.03283
]
# 現価率
def DF(t):
if t < len(rate0):
r = rate0[t]
else:
r = rate0[-1]
return (1 + r) ** (-t-0.5)
続いて、先ほど作成したcreate_cashflow関数で
キャッシュフローを計算して、計算結果をsummaryへ代入します。
Totalのみを抽出し(E,T,Wは削除)、
経過年数tを付け加えます。
# 計算基準年度
base_year = 2022
# キャッシュフローの計算
summary = create_cashflow(base_year)
# Totalのみ抽出
summary = summary[summary["product"] == "Total"]
# 経過年数を追加
summary["t"] = summary["year"] - base_year - 1
最後に現在価値を計算します。
summaryから経過年数とキャッシュフローを取得して、
現価率を乗じて、足し合わせていきます。
# 現在価値を計算
PV = 0
for _, row in summary.iterrows():
t = int(row["t"])
cf = int(row["cashflow"])
PV += cf * DF(t)
# 結果の表示
print(int(PV))
計算結果は次のようになります。
812213
まとめ
今回は、金利を使ってキャッシュフローの現在価値を計算しました。
保険会社に導入された経済価値ベース規制では、中核になる部分ですので、
実際の数値で計算してみることで、理解が進むのではないでしょうか。
📚 ナビゲーション
◀ 前の記事
複数商品のキャッシュフロー
▶ 次の記事
保険負債の金利変動による影響
📚 目次
アクチュアリーのためのPython入門