:orphan: ================================================== モデル3 - EV計算 ================================================== | 複数商品を管理し、またEV(エンベデッドヴァリュー)の計算ができる本格的なモデルです。 | :doc:`1300_tutorial3` で説明しています。 このファイルでは、EV計算のロジックを記述しています。 .. raw:: html EV計算 ----------------------- .. raw:: html

    // 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)

       }

    }