Active - Deterministic - Base

Valuation Model

Documentation

class AValBasePMD(*, valuation_dt: pandas._libs.tslibs.timestamps.Timestamp, assumption_set: str, net_benefit_method: str, policy_id: str, gender: str, birth_dt: pandas._libs.tslibs.timestamps.Timestamp, tobacco_usage: bool, policy_start_dt: pandas._libs.tslibs.timestamps.Timestamp, policy_end_dt: pandas._libs.tslibs.timestamps.Timestamp, elimination_period: numpy.int64, idi_market: str, idi_contract: str, idi_benefit_period: str, idi_occupation_class: str, cola_percent: float, premium_pay_to_dt: pandas._libs.tslibs.timestamps.Timestamp, gross_premium: float, gross_premium_freq: str, benefit_amount: float, modifier_ctr: float = 1.0, modifier_interest: float = 1.0, modifier_incidence=1.0, modifier_lapse=1.0, modifier_mortality=1.0)

The active life reserve (ALR) valuation model for the base policy.

Parameters

valuation_dtTimestamp

The valuation date which reserves are based.

assumption_setstr

The assumption set to use for running the model. Options are :

  • stat

  • gaap

  • best-estimate

net_benefit_methodstr

The net benefit method. Options are :

  • NLP = Net level premium

  • PT1 = 1 year preliminary term

  • PT2 = 2 year preliminary term

policy_idstr

The policy ID of the policy holder.

genderstr

The gender of the policy holder.

birth_dtTimestamp

The birth date of the policy holder.

tobacco_usagebool

The tabacco usage of the policy holder.

policy_start_dtTimestamp

The date coverage starts for the policy issued.

policy_end_dtTimestamp

The date coverage ends for the policy issued.

elimination_periodint64

The elimination days before benefits are paid for the policy holder.

idi_marketstr

The IDI market for the policy holder.

idi_contractstr

The IDI contract type of the policy holder.

idi_benefit_periodstr

The IDI benefit period for the policy holder.

idi_occupation_classstr

The IDI occupation class of the policy holder.

cola_percentfloat

The COLA percent for the policy holder (0 if no COLA provided).

premium_pay_to_dtTimestamp

The date premium payments end for the policy issued.

gross_premiumfloat

The policy gross premium amount.

gross_premium_freqstr

The frequency of premium payments.

benefit_amountfloat

The benefit amount for the policy holder.

Sensitivities

modifier_ctrfloat

Modifier for CTR.

modifier_interestfloat

Interest rate modifier.

modifier_incidence

The incidence rate modifier.

modifier_lapse

The withdraw rate modifier

modifier_mortality

The withdraw rate modifier

Meta

model_versionstr

The model version generated by versioneer.

last_commitstr

The last git commit.

run_date_timeTimestamp

The run date and time.

claim_cost_modelcallable

The claim cost model used.

coverage_idstr

The coverage id which recognizes base policy vs riders.

Intermediates

age_issueddate

The calculate age policy was issued.

lapse_ratesDataFrame

The placholder for lapse rates.

mortality_ratesDataFrame

The placholder for lapse rates.

incidence_ratesDataFrame

The placholder for incidence rates.

modeled_claim_costdict

The placholder for modeled disabled lives.

Returns

frameDataFrame

The frame of projected reserves.

Steps

  1. Calculate Issue Age - Calculate the age policy issued.

  2. Create Projectetd Frame - Create projected benefit frame from policy start date to policy end date by duration year.

  3. Calculate Age Attained - Calculate age attained by policy duration on the frame.

  4. Calculate Benefit Term Date - Calculate benefit termination date if active individual were to become disabled for each policy duration.

  5. Model Claim Cost - Model claim cost for active live if policy holder were to become disabled for each policy duration

  6. Get Incidence Rate - Get incidence rates and multiply by incidence sensitivity to form final rate.

  7. Get Mortality Rates - Get lapse rates and multiply by incidence sensitivity to form final rate.

  8. Get Lapse Rates - Get lapse rates and multiply by incidence sensitivity to form final rate.

  9. Calculate Premiums - Calculate premiums for each duration.

  10. Calculate Benefit Cost - Calculate benefit cost by multiplying disabled claim cost by final incidence

    rate for each duration.

  11. Calculate Lives - Calculate the beginning, middle, and ending lives for each duration using lapse rates.

  12. Calculate Discount Factors - Calculate beginning, middle, and ending discount factors for each duration.

  13. Calculate Durational ALR - Calculate active life reserves (ALR) for each duration.

  14. Calculate Valuation Date ALR - Calculate active life reserves (ALR) for each duration as of valuation date.

  15. Create Output Frame - Reduce output to only needed columns.

Usage

import pandas as pd
from footings_idi_model.models import AValBasePMD

model = AValBasePMD(
    policy_id="policy-1",
    gender="M",
    tobacco_usage="N",
    birth_dt=pd.Timestamp("1970-03-26"),
    policy_start_dt=pd.Timestamp("2015-06-02"),
    policy_end_dt=pd.Timestamp("2035-03-26"),
    elimination_period=90,
    idi_market="INDV",
    idi_contract="AS",
    idi_benefit_period="TO65",
    idi_occupation_class="M",
    cola_percent=0.0,
    premium_pay_to_dt=pd.Timestamp("2020-03-31"),
    gross_premium=10.0,
    gross_premium_freq="MONTH",
    benefit_amount=100.0,
    valuation_dt=pd.Timestamp("2020-03-31"),
    assumption_set="STAT",
    net_benefit_method="NLP",
)

To run the model call the run method.

output = model.run()
/home/runner/work/footings-idi-model/footings-idi-model/.venv/lib/python3.8/site-packages/pandas/core/series.py:726: RuntimeWarning: divide by zero encountered in log
  result = getattr(ufunc, method)(*inputs, **kwargs)

The model returns a DataFrame of the projected reserves.

output.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 16 entries, 4 to 19
Data columns (total 24 columns):
 #   Column          Non-Null Count  Dtype         
---  ------          --------------  -----         
 0   MODEL_VERSION   16 non-null     object        
 1   LAST_COMMIT     16 non-null     object        
 2   RUN_DATE_TIME   16 non-null     datetime64[ns]
 3   SOURCE          16 non-null     object        
 4   POLICY_ID       16 non-null     object        
 5   COVERAGE_ID     16 non-null     object        
 6   DATE_BD         16 non-null     datetime64[ns]
 7   DATE_ED         16 non-null     datetime64[ns]
 8   DURATION_YEAR   16 non-null     Int64         
 9   LIVES_BD        16 non-null     float64       
 10  LIVES_MD        16 non-null     float64       
 11  LIVES_ED        16 non-null     float64       
 12  DISCOUNT_BD     16 non-null     float64       
 13  DISCOUNT_MD     16 non-null     float64       
 14  DISCOUNT_ED     16 non-null     float64       
 15  BENEFIT_AMOUNT  16 non-null     float64       
 16  INCIDENCE_RATE  16 non-null     float64       
 17  BENEFIT_COST    16 non-null     float64       
 18  PVFB            16 non-null     float64       
 19  PVFNB           16 non-null     float64       
 20  ALR_BD          16 non-null     float64       
 21  ALR_ED          16 non-null     float64       
 22  ALR_DATE        16 non-null     datetime64[ns]
 23  ALR             16 non-null     float64       
dtypes: Int64(1), datetime64[ns](4), float64(14), object(5)
memory usage: 3.1+ KB
output
MODEL_VERSION LAST_COMMIT RUN_DATE_TIME SOURCE POLICY_ID COVERAGE_ID DATE_BD DATE_ED DURATION_YEAR LIVES_BD ... DISCOUNT_ED BENEFIT_AMOUNT INCIDENCE_RATE BENEFIT_COST PVFB PVFNB ALR_BD ALR_ED ALR_DATE ALR
4 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:28:51.103323 AValBasePMD policy-1 BASE 2019-06-02 2020-06-02 5 0.987588 ... 0.862609 100.0 0.007967 63.152615 718.674145 681.817837 42.003443 43.920182 2020-03-31 43.58
5 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:28:51.103323 AValBasePMD policy-1 BASE 2020-06-02 2021-06-02 6 0.983993 ... 0.837484 100.0 0.008640 66.844643 664.237850 626.958346 43.920182 42.178943 2021-03-31 42.47
6 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:28:51.103323 AValBasePMD policy-1 BASE 2021-06-02 2022-06-02 7 0.980146 ... 0.813092 100.0 0.009378 70.470309 608.513445 573.890577 42.178943 36.730021 2022-03-31 37.62
7 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:28:51.103323 AValBasePMD policy-1 BASE 2022-06-02 2023-06-02 8 0.975970 ... 0.789409 100.0 0.010159 73.719344 551.717150 522.569922 36.730021 27.833475 2023-03-31 29.19
8 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:28:51.103323 AValBasePMD policy-1 BASE 2023-06-02 2024-06-02 9 0.971383 ... 0.766417 100.0 0.010993 76.523706 494.299539 472.956302 27.833475 15.819416 2024-03-31 17.44
9 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:28:51.103323 AValBasePMD policy-1 BASE 2024-06-02 2025-06-02 10 0.966322 ... 0.744094 100.0 0.011891 78.840308 436.730080 425.014131 15.819416 1.068907 2025-03-31 1.70
10 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:28:51.103323 AValBasePMD policy-1 BASE 2025-06-02 2026-06-02 11 0.960689 ... 0.722421 100.0 0.012832 80.333127 379.474938 378.710837 1.068907 0.000000 2026-03-31 0.00
11 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:28:51.103323 AValBasePMD policy-1 BASE 2026-06-02 2027-06-02 12 0.954425 ... 0.701380 100.0 0.013837 80.904860 323.197454 334.018269 0.000000 0.000000 2027-03-31 0.00
12 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:28:51.103323 AValBasePMD policy-1 BASE 2027-06-02 2028-06-02 13 0.947496 ... 0.680951 100.0 0.014907 80.313232 268.562749 290.910335 0.000000 0.000000 2028-03-31 0.00
13 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:28:51.103323 AValBasePMD policy-1 BASE 2028-06-02 2029-06-02 14 0.939963 ... 0.661118 100.0 0.016019 78.142521 216.319592 249.361819 0.000000 0.000000 2029-03-31 0.00
14 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:28:51.103323 AValBasePMD policy-1 BASE 2029-06-02 2030-06-02 15 0.931851 ... 0.641862 100.0 0.017184 74.205059 167.389106 209.344144 0.000000 0.000000 2030-03-31 0.00
15 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:28:51.103323 AValBasePMD policy-1 BASE 2030-06-02 2031-06-02 16 0.923073 ... 0.623167 100.0 0.018414 68.214594 122.696307 170.827327 0.000000 0.000000 2031-03-31 0.00
16 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:28:51.103323 AValBasePMD policy-1 BASE 2031-06-02 2032-06-02 17 0.913473 ... 0.605016 100.0 0.019708 59.806049 83.216248 133.784619 0.000000 0.000000 2032-03-31 0.00
17 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:28:51.103323 AValBasePMD policy-1 BASE 2032-06-02 2033-06-02 18 0.902886 ... 0.587395 100.0 0.021045 48.494481 49.993507 98.194848 0.000000 0.000000 2033-03-31 0.00
18 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:28:51.103323 AValBasePMD policy-1 BASE 2033-06-02 2034-06-02 19 0.891167 ... 0.570286 100.0 0.022403 33.672646 24.172297 64.042144 0.000000 0.000000 2034-03-31 0.00
19 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:28:51.103323 AValBasePMD policy-1 BASE 2034-06-02 2035-06-02 20 0.878272 ... 0.553676 100.0 0.023750 14.401111 7.012700 31.314570 0.000000 0.000000 2035-03-31 0.00

16 rows × 24 columns

An audit of the model is ran by calling the audit method shown below.

model.audit("Audit-AValBasePMD.xlsx")
/home/runner/work/footings-idi-model/footings-idi-model/.venv/lib/python3.8/site-packages/pandas/core/series.py:726: RuntimeWarning: divide by zero encountered in log
  result = getattr(ufunc, method)(*inputs, **kwargs)

The audit file can be downloaded here.

Projection Model

Documentation

To be completed.

Usage

To be completed.