アクチュアリーのためのPython入門(保険数理モデリング編第9回)
月次キャッシュフロー2
📚 アクチュアリーのためのPython入門
この記事は保険数理モデリング編の一部です。
▶ 目次はこちら
▶ 逆引きガイドはこちら
はじめに
月単位のキャッシュフローの続きです。
年単位のキャッシュフローと異なるのは、
年月の進みを考えないといけない(12カ月で1年)ので、
会計年度の計算部分を加えました。
今回はその続きのキャッシュフロー部分を考えます。
月次キャッシュフロー
まず、計算基準日時点で保険金額となるように、
補整値を計算します。
ここは年単位のキャッシュフローと同じです。
経過月数の計算になっているところだけ注意です。
afは補整値です。
# 計算基準日までの経過月数
btwn = (base_year + 1 - policy_year) * 12 + 4 - policy_month
# 補整値の計算
af = amount / lx[btwn]
キャッシュフローの計算ですが、
計算回数を保険期間×12として、月単位にします。
保険料は年払いを想定していますので、
年単位の契約応当月に収入保険料を計上します。
他は月単位に変更している以外は基本的に年単位と同じです。
# キャッシュフローの項目
inprem = [] # 保険料収入
benefit = [] # 保険金支払い
surrender = [] # 解約返戻金支払い
expenses = [] # 事業費
cashflow = [] # キャッシュフロー
P = float(prem_func(product, sex, age, term))
# キャッシュフローの計算
for f in range(n * 12) :
# 保険料の収入
if f < m * 12 and f % 12 == 0:
inprem.append(lx[f] * P)
else:
inprem.append(0)
# 保険金の支払い
if f == n * 12 - 1:
# 死亡+満期保険金の支払い
pay_ben = dx[f] + mx[f] * maturity(product)
else:
# 死亡保険金の支払い
pay_ben = dx[f]
benefit.append(pay_ben)
# 解約返戻金の支払い
t = int(f / 12) # 経過年数
rmd_m = f % 12 # 端数月数
wt = float(sv_func(product, sex, age, term, t))
wt1 = float(sv_func(product, sex, age, term, t + 1))
W = (1 - (rmd_m + 1)/12) * wt + (rmd_m + 1)/12 * wt1
surrender.append(wx[f] * W)
# 事業費の支払い
expenses.append(inprem[f] * 0.3)
# キャッシュフロー
cashflow.append(benefit[f] + surrender[f] \
+ expenses[f] - inprem[f])
# 商品別のキャッシュフロー
results1.append({"product":product,
"benefit":int(benefit[f] * af),
"surrender":int(surrender[f] * af),
"expenses":int(expenses[f] * af),
"inprem":int(inprem[f] * af),
"cashflow":int(cashflow[f] * af)
})
pandasを使ったDataFrameによる集計部分です。
前回計算した計算年月と会計年度をconcatで結合しています。
またdropで計算年月を削除していますが、
確認のため、計算年月のを入れたままにすることも可能です。
会計年度fiscal_yearごとのキャッシュフローを集計しています。
# 年月のデータフレーム
time_df = pd.DataFrame(time_axis)
# 計算結果のデータフレーム
result_df = pd.DataFrame(results1)
# データフレームを結合
result = pd.concat([time_df, result_df], axis = 1)
# 商品別の集計
result_df = result.drop(columns = ["cf_year", "cf_month"])
grouped_product = result_df.groupby(["product", "fiscal_year"]).sum()
summary_product = grouped_product.reset_index()
# 合計の集計
grouped_total = result_df.groupby("fiscal_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["fiscal_year"] >= base_year + 1]
return summary
# キャッシュフローの出力
if __name__ == "__main__":
summary = create_cashflow()
summary.to_excel("result_all3.xlsx", index=False)
なお、年単位のときと今回の月単位のときの残存表にズレが生じています。
これは、年単位のときの残存表の死亡率をそのまま使っているからです。
生命保険数学のテキストにあるように、死亡解約脱退残存表では、
死亡率を
$q_x={q^*_x} \times {(1-\frac{q^w_x}{2})}$
のようにしておくのが通例ですが、
それを省いた結果、ズレが生じています。
まとめ
2回にわたり、月単位のキャッシュフローの計算を行いました。
月単位にするため、いろいろなところを修正する必要があります。
特に期間やキャッシュフローの発生タイミングは非常に難しいです。
でも、ここまでできれは、
専用のソフトウェアと考え方に大きな差はありません
Pythonでキャッシュフローを概算するだけなら、
実務でも使えるようになっているはずです。
📚 ナビゲーション
◀ 前の記事
月次キャッシュフロー1
▶ 次の記事
📚 目次
アクチュアリーのためのPython入門
