アクチュアリーのためのPython入門(決算数理編第6回)
決算における利源分析
📚 アクチュアリーのためのPython入門
この記事は決算数理編の一部です。
▶ 目次はこちら
▶ 逆引きガイドはこちら
はじめに
前回までで、保有契約、異動契約(支払)、入金データから、
保険料積立金や危険保険料、予定事業費などの計算を行いました。
決算処理では、これらの保険収支に加えて、
損益計算書の項目から、利源分析を行います。
ここでは、保険収支だけで構成される、
死差損益と責任準備金関係損益だけ計算してみましょう。
利源分析の前に
まず、保有保険金額、異動保険金額から、
保有と異動が整合していることを確認します。
年度始保険金額 - 異動による減少保険金額 - 年度末保険金額 = 0
となることを確認しましょう。
まずは、ヘッダー部分です。
今まで作成してきた関数をインポートします。
また、決算期の設定を行います。
今回のデータは2025年度の設定です。
from core_b import *
from calc_inforce import calc_inforce
from calc_movement import calc_movement
from calc_premium import calc_premium
import pandas as pd
# 決算期の設定
year = 2025
各関数の結果はデータフレーム化されていますので、
ここで使用する項目を抜き出して、.sum()で集計します。
# 年度始保有契約の計算
begin_inforce_df = calc_inforce(year-1)
begin_summary = begin_inforce_df[["UPR", "calc_Vn", "UPRz", "P_Vz", "amount"]].sum()
# 年度末保有契約の計算
end_inforce_df = calc_inforce(year)
end_summary = end_inforce_df[["UPR", "calc_Vn", "UPRz", "P_Vz", "amount"]].sum()
# 異動契約の計算
movement_df = calc_movement(year)
move_summary = movement_df[["death_ben", "death_reserve", "SV", "surrender_reserve", "amount"]].sum()
# 保険料の計算
premium_df = calc_premium(year)
prem_summary = premium_df[["income_prem", "risk_prem", "expected_expenses"]].sum()
保険金額の整合しているか確認します。
結果は0と表示されるはずです。
実務では、0とならないこともあります。
その場合、どのデータが原因なのか突き止め、
データ修正やプログラムが必要なのか確認します。
# 保険金額の確認
amount_check = begin_summary["amount"] - move_summary["amount"] - end_summary["amount"]
print("amount_check:", amount_check)
死差損益
続いて、死差損益です。
次の集計または計算を行います。
- 年度始と年度末の5年チルメル式の責任準備金
- 予定利息
- 年度始諸積増
- 年度末諸積増
また、死差損益の項目はアクチュアリー会のテキスト
「保険2(生命保険)」を参考にします。
収益の部の小計は、
premium : 収入保険料
begining_reserve : 年度始保険料積立金
begining_unearned_prem : 年度始未経過保険料
interest : 予定利息
end_difference : 年度末諸積増
の合計としています。
損失の部の小計は、
benefit : 支払保険金
expected_expenses : 予定事業費
surrender_reserve : 解約失効契約の消滅時保険料積立金
end_reserve : 年度末保険料積立金
end_unearned_prem : 年度末未経過保険料
begining_difference : 年度始諸積増
の合計としています。
収益の小計 - 損失の小計 = 死差損益(death_gain)
を計算しています。
# 死差損益の計算
# 5年チルメル式責任準備金の集計
Vzt = begin_summary["UPRz"] + begin_summary["P_Vz"]
Vzt1 = end_summary["UPRz"] + end_summary["P_Vz"]
# 予定利息の計算
interest = roundhu((Vzt + Vzt1) * Decimal(ival["P"]) / Decimal((2 + ival["P"])), 0)
# 年始諸積増の計算
begin_difference = (begin_summary["UPR"] + begin_summary["calc_Vn"]) - Vzt
# 年末諸積増の計算
end_difference = (end_summary["UPR"] + end_summary["calc_Vn"]) - Vzt1
# 小計
death_subtotal1 = prem_summary["income_prem"] + begin_summary["calc_Vn"] + begin_summary["UPR"] \
+ interest + end_difference
death_subtotal2 = move_summary["death_ben"] + prem_summary["expected_expenses"] + move_summary["surrender_reserve"] \
+ end_summary["calc_Vn"] + end_summary["UPR"] + begin_difference
# 死差損益
death_gain = ([{
"premium": prem_summary["income_prem"],
"begining_reserve": begin_summary["calc_Vn"],
"begining_unearned_prem": begin_summary["UPR"],
"interest": interest,
"end_difference": end_difference,
"subtotal": death_subtotal1,
"benefit": move_summary["death_ben"],
"expected_expenses":prem_summary["expected_expenses"],
"surrender_reserve":move_summary["surrender_reserve"],
"end_reserve":end_summary["calc_Vn"],
"end_unearned_prem":end_summary["UPR"],
"begining_difference":begin_difference,
"subtotal2":death_subtotal2,
"death_gain":death_subtotal1 - death_subtotal2
}])
death_gain_df = pd.DataFrame(death_gain)
print(death_gain_df.T)
なお、death_gain_df.Tの.Tはデータフレームの行と列を入れ替えます。
では、結果を確認しています。
print(death_gain)
結果は次のように表示なります。
0
premium 1915265
begining_reserve 8194279
begining_unearned_prem 73747
interest 42696
end_difference 560308
subtotal 10786295
benefit 3000000
expected_expenses 284359
surrender_reserve 1583922
end_reserve 7223111
end_unearned_prem 53655
begining_difference 709625
subtotal2 12854672
death_gain -2068377
このサンプルでは、約200万円の死差損となりました。
この水準が妥当なのか確認するために、
別の計算でも死差損益を計算してみます。
収入危険保険料 - (死亡保険金 - 死亡時の保険料積立金)
でも死差損益が計算できますので、それを実行してみましょう。
# 確認用(危険保険料 - (死亡保険金 - 死亡時V))
death_gain = prem_summary["risk_prem"] - (move_summary["death_ben"] \
- move_summary["death_reserve"])
print(death_gain)
結果は次のように表示されます。
-2040845
こちらも約200万円の死差損となりました。
実務でも両方で計算して妥当性の検証を行っています。
責任準備金関係損益
続いて、責任準備金化関係損益です。
実際は、危険準備金も関係するのですが、ここでは省略します。
項目は同じくアクチュアリー会のテキストを参照ください。
# 責任準備金関係損益の計算
# 小計
reserve_subtotal1 = begin_difference + move_summary["surrender_reserve"]
reserve_subtotal2 = end_difference + move_summary["SV"]
# 責任準備金関係損益(危険準備金は除く)
reserve_gain = ([{
"begining_difference":begin_difference,
"surrender_reserve":move_summary["surrender_reserve"],
"subtotal1":reserve_subtotal1,
"end_difference":end_difference,
"surrender_value":move_summary["SV"],
"subtotal2":reserve_subtotal2,
"reserve_gain":reserve_subtotal1 - reserve_subtotal2,
"surrender_gain":move_summary["surrender_reserve"] - move_summary["SV"]}])
reserve_gain_df = pd.DataFrame(reserve_gain)
print(reserve_gain_df.T)
結果は次のようになります。
0
begining_difference 709625
surrender_reserve 1583922
subtotal1 2293547
end_difference 560308
surrender_value 1499994
subtotal2 2060302
reserve_gain 233245
surrender_gain 83928
約20万円の責任準備金関係益で、
うち約8万円の解約失効益となりました。
まとめ
今回はサンプルの決算データを使用して、利源分析を行いました。
利源分析自体はアクチュアリー会のテキストにもありますで、
機械的に集計して計算していくだけです。
その前に異動や保有契約がただしく反映されているか確認したり、
死差損益の妥当性を検証したりということも行います。
サンプルではレコード数が少ないので、
誤りがあればすぐに分かりますが、
実務では数十万とか数百万といったレコードを扱いますので、
こういった確認や検証が非常に大事になります。
📚 ナビゲーション
◀ 前の記事
危険保険料と予定事業費の計算
▶ 次の記事
📚 目次
アクチュアリーのためのPython入門