アクチュアリーのためのPython入門(第4回)
保険料と保険料積立金を計算する
はじめに
前回は、死亡給付現価と年金給付現価を計算しました。
今回はそれらを使って、
- 営業保険料(年払)
- 保険料積立金
を計算します。
ようやく「保険数理」の根幹部分に来ました。
今回やること
今回扱うのは、次の2つです。
- 定期保険の年払営業保険料
- 定期保険の経過年数ごとの平準純保険料式の保険料積立金
営業保険料の計算
数理の理論説明は省略し、
前回に計算した給付現価をそのまま使う形にします。
# 定期保険の純保険料の計算
def netPremT(start_age, n):
value = 0
# 純保険料の計算
value = A1xn(start_age, n) / axn(start_age, n)
return value
# 営業保険料の計算
def PremT(start_age, n):
value = 0
# 予定事業費
# 新契約費(初回のみ保険金比例)
alpha = 0.001
# 新契約費(払込中保険料比例)
delta = 0.06
# 維持費(払込中保険金比例)
gamma = 0.00115
# 集金費(払込中保険料比例)
beta = 0.03
# 営業保険料の計算
value = (A1xn(start_age, n) + alpha + gamma * axn(start_age, n)) / ((1 - beta - delta) * axn(start_age, n))
# 端数処理
value = roundhu(value, 6)
return value
netPremTは純保険料を計算する関数として定義しています。
start_ageは年齢、nは保険期間です。
同様にPremTは営業保険料の関数です。
alpha、delta、gammma、betaは予定事業費です。
営業保険料の計算式はテキストどおりの計算式です。
端数処理のroundhu(value, 6)はvalueを小数第6位まで求める(第7位を四捨五入)関数で、
コードは後述、説明は次回とさせてください。
保険料積立金の計算
続いて、保険料積立金です。
実務では、保険料と保険料積立金の計算基数や給付現価の基礎率は
必ずしも一致しませんが、ここでは、Pythonに慣れることが目的ですので、
同じと仮定しておきます。
# 保険料積立金の計算
def ResT(start_age, n, t):
value = 0
# 保険料積立金の計算
value = A1xn(start_age + t, n - t) - netPremT(start_age, n) * axn(start_age + t, n - t)
# 端数処理
value = roundhu(value, 6)
return value
start_ageは年齢、nは保険期間、tは経過年数です。
保険料積立金の計算は先の純保険料を使っています。
こちらもテキストどおりの計算式です。
あとは、先の端数処理のroundhuを定義しておきます。
# 端数処理 四捨五入
# decimalのインポート
from decimal import Decimal, ROUND_HALF_UP, getcontext
# 四捨五入の関数
def roundhu(value, ndigits):
getcontext().prec = 28
d = Decimal(str(value))
quant = Decimal("1").scaleb(-ndigits)
return d.quantize(quant, rounding=ROUND_HALF_UP)
valueをndigits桁まで求めるという意味です。
次回、このdecimalの意味と、なぜroundではなく、
四捨五入する関数を作成するのか説明します。
最後に計算結果を確認してみます。まずは、
40歳5年定期保険の年払営業保険料、年払純保険料、
41歳5年定期保険の年払営業保険料、年払純保険料です。
print(PremT(40,5), round(netPremT(40,5),6))
print(PremT(41,5), round(netPremT(41,5),6))
出力例は次のようになります。
0.003021 0.001396
0.003150 0.001514
続いて、40歳5年定期保険の保険料積立金の計算結果で、
1年経過後、2年経過後、3年経過後、4年経過後です。
print(ResT(40, 5, 1), ResT(40, 5, 2), ResT(40, 5, 3), ResT(40, 5, 4))
出力例は次のようになります。
0.000221 0.000334 0.000337 0.000229
まとめ
今回は、
- 営業保険料
- 保険料積立金
をPythonで計算しました。
次回は、
- round関数ではなく、関数を定義して端数処理を行うのか
- 浮動小数点誤差の考え方
について整理します。