モデル3 - EV計算¶
複数商品を管理し、またEV(エンベデッドヴァリュー)の計算ができる本格的なモデルです。
チュートリアル3 で説明しています。
このファイルでは、EV計算のロジックを記述しています。
EV計算¶
// EV計算のベースクラス abstract calculation EVBase { module Util{ int max_t = 100 } module EV{ @range = t @range_last = Util.max_t // EV計算用の係数 double lapsemass_factor = 0.3 double coc_factor = 0.05 double tax_rate = 0.25 // 負債キャッシュフロー現価などの取得 double[] discount_factor = NotImplemented double[] PVLiab_adj_base = NotImplemented double[] PVLiab_adj_mortup = NotImplemented double[] PVLiab_adj_mortdown = NotImplemented double[] PVLiab_adj_lapseup = NotImplemented double[] PVLiab_adj_lapsedown = NotImplemented double[] PVLiab_adj_morbup = NotImplemented double[] PVLiab_adj_expup = NotImplemented double[] CV_end = NotImplemented // リスク量の計算 double[] risk_mortup = Utl.max(PVLiab_adj_mortup(t) - PVLiab_adj_base(t), 0.0) double[] risk_mortdown = Utl.max(PVLiab_adj_mortdown(t) - PVLiab_adj_base(t), 0.0) double[] risk_lapseup = Utl.max(PVLiab_adj_lapseup(t) - PVLiab_adj_base(t), 0.0) double[] risk_lapsedown = Utl.max(PVLiab_adj_lapsedown(t) - PVLiab_adj_base(t), 0.0) double[] risk_morbup = Utl.max(PVLiab_adj_morbup(t) - PVLiab_adj_base(t), 0.0) double[] risk_expup = Utl.max(PVLiab_adj_expup(t) - PVLiab_adj_base(t), 0.0) double[] risk_lapsemass = lapsemass_factor * Utl.max(CV_end(t) - PVLiab_adj_base(t), 0.0) double[] risk_lapse = Utl.max(risk_lapseup(t), risk_lapsedown(t), risk_lapsemass(t)) double[] risk = calc_risk(risk_mortup(t), risk_mortdown(t), risk_morbup(t), risk_lapse(t), risk_expup(t)) // 資本コスト、CNHRの計算 // (資本コストをCNHRに反映するタイミングはいくつかあるが、即座に反映するものとした) double[] coc = risk(t) * coc_factor double[] cnhr_before_tax = if (t == Util.max_t) { coc(t) } elseif (discount_factor(t) <= 0.0) { coc(t) } else { coc(t) + cnhr_before_tax(t+1) * discount_factor(t+1) / discount_factor(t) } double[] cnhr_after_tax = cnhr_before_tax(t) * (1.0 - tax_rate) // PVFP, TVOG, CNHR, MCEV, 保険料現価, 新契約マージンの計算 double PVFP = NotImplemented double PVFPTVOG = NotImplemented double TVOG = PVFPTVOG - PVFP double CNHR = -cnhr_after_tax(0) double MCEV = PVFP + TVOG + CNHR double PVP = NotImplemented double NBM = if (PVP <= 0.0) { 0.0 } else { MCEV / PVP } // 相関を用いてリスク量を計算する関数 function double calc_risk(double _risk_mortup, double _risk_mortdown, double _risk_morbup, double _risk_lapse, double _risk_expup) = ( _risk_mortup * _risk_mortup * 1.00 + _risk_mortup * _risk_mortdown * -0.25 + _risk_mortup * _risk_morbup * 0.25 + _risk_mortup * _risk_lapse * 0.00 + _risk_mortup * _risk_expup * 0.25 + _risk_mortdown * _risk_mortup * -0.25 + _risk_mortdown * _risk_mortdown * 1.00 + _risk_mortdown * _risk_morbup * 0.00 + _risk_mortdown * _risk_lapse * 0.25 + _risk_mortdown * _risk_expup * 0.25 + _risk_morbup * _risk_mortup * 0.25 + _risk_morbup * _risk_mortdown * 0.00 + _risk_morbup * _risk_morbup * 1.0 + _risk_morbup * _risk_lapse * 0.00 + _risk_morbup * _risk_expup * 0.50 + _risk_lapse * _risk_mortup * 0.00 + _risk_lapse * _risk_mortdown * 0.25 + _risk_lapse * _risk_morbup * 0.00 + _risk_lapse * _risk_lapse * 1.00 + _risk_lapse * _risk_expup * 0.50 + _risk_expup * _risk_mortup * 0.25 + _risk_expup * _risk_mortdown * 0.25 + _risk_expup * _risk_morbup * 0.50 + _risk_expup * _risk_lapse * 0.50 + _risk_expup * _risk_expup * 1.00 ) ^ 0.5 // 1回目のランから計算結果を取得する関数 function double get_factor_deter(string varible_name, int shock, int t) = Fac.get_double("ev_deter", "OutputEV", varible_name, 0, shock, t) function double get_factor_stoch(string varible_name, int shock, int t) = Fac.get_double("ev_stoch", "OutputEV", varible_name, -1, shock, t) } // 出力(リスク量) module OutputRisk{ @range = t @range_last = Util.max_t double[] discount_factor = EV.discount_factor(t) double[] PVLiab_adj_base = EV.PVLiab_adj_base(t) double[] PVLiab_adj_mortup = EV.PVLiab_adj_mortup(t) double[] PVLiab_adj_mortdown = EV.PVLiab_adj_mortdown(t) double[] PVLiab_adj_lapseup = EV.PVLiab_adj_lapseup(t) double[] PVLiab_adj_lapsedown = EV.PVLiab_adj_lapsedown(t) double[] PVLiab_adj_morbup = EV.PVLiab_adj_morbup(t) double[] PVLiab_adj_expup = EV.PVLiab_adj_expup(t) double[] CV_end = EV.CV_end(t) double[] risk_mortup = EV.risk_mortup(t) double[] risk_mortdown = EV.risk_mortdown(t) double[] risk_lapseup = EV.risk_lapseup(t) double[] risk_lapsedown = EV.risk_lapsedown(t) double[] risk_morbup = EV.risk_morbup(t) double[] risk_expup = EV.risk_expup(t) double[] risk_lapsemass = EV.risk_lapsemass(t) double[] risk_lapse = EV.risk_lapse(t) double[] risk = EV.risk(t) double[] coc = EV.coc(t) double[] cnhr_before_tax = EV.cnhr_before_tax(t) double[] cnhr_after_tax = EV.cnhr_after_tax(t) } // 出力(EV数値) module OutputSummary{ double PVFP = EV.PVFP double TVOG = EV.TVOG double CNHR = EV.CNHR double MCEV = EV.MCEV double PVP = EV.PVP double NBM = EV.NBM } } // 決定論でのEV計算クラス calculation EVDeter(EVBase) { module EV{ double[] discount_factor = get_factor_deter("discount_factor_end", 0, t) double[] PVLiab_adj_base = get_factor_deter("PVLiab_adj", 0, t) double[] PVLiab_adj_mortup = get_factor_deter("PVLiab_adj", 1, t) double[] PVLiab_adj_mortdown = get_factor_deter("PVLiab_adj", 2, t) double[] PVLiab_adj_lapseup = get_factor_deter("PVLiab_adj", 3, t) double[] PVLiab_adj_lapsedown = get_factor_deter("PVLiab_adj", 4, t) double[] PVLiab_adj_morbup = get_factor_deter("PVLiab_adj", 5, t) double[] PVLiab_adj_expup = get_factor_deter("PVLiab_adj", 6, t) double[] CV_end = get_factor_deter("CV_end", 0, t) double PVFP = get_factor_deter("PV_profit_after_tax", 0, 0) double PVFPTVOG = get_factor_deter("PV_profit_after_tax", 0, 0) double PVP = get_factor_deter("PV_premium_income", 0, 0) } } // 確率論でのEV計算クラス calculation EVStoch(EVBase) { module EV{ double[] discount_factor = get_factor_deter("discount_factor_end", 0, t) double[] PVLiab_adj_base = get_factor_stoch("PVLiab_adj", 0, t) double[] PVLiab_adj_mortup = get_factor_stoch("PVLiab_adj", 1, t) double[] PVLiab_adj_mortdown = get_factor_stoch("PVLiab_adj", 2, t) double[] PVLiab_adj_lapseup = get_factor_stoch("PVLiab_adj", 3, t) double[] PVLiab_adj_lapsedown = get_factor_stoch("PVLiab_adj", 4, t) double[] PVLiab_adj_morbup = get_factor_stoch("PVLiab_adj", 5, t) double[] PVLiab_adj_expup = get_factor_stoch("PVLiab_adj", 6, t) double[] CV_end = get_factor_stoch("CV_end", 0, t) double PVFP = get_factor_deter("PV_profit_after_tax", 0, 0) double PVFPTVOG = get_factor_stoch("PV_profit_after_tax", 0, 0) double PVP = get_factor_stoch("PV_premium_income", 0, 0) } }