Active - Deterministic - COLA Rider

Valuation Model

Documentation

class AValColaRPMD(*, 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 cost of living adjustment (COLA) policy rider.

This model is a child of the AValBasePMD with the only change being how the monthly benefit is calculated. The base model uses the benefit amount passed while this model calculate the benefit with cola less the original benefit amount.

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 AValColaRPMD

model = AValColaRPMD(
    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:29:10.281435 AValColaRPMD policy-1 COLA 2019-06-02 2020-06-02 5 0.987588 ... 0.862609 100.0 0.007967 0.0 0.0 0.0 0.0 0.0 2020-03-31 0.0
5 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:29:10.281435 AValColaRPMD policy-1 COLA 2020-06-02 2021-06-02 6 0.983993 ... 0.837484 100.0 0.008640 0.0 0.0 0.0 0.0 0.0 2021-03-31 0.0
6 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:29:10.281435 AValColaRPMD policy-1 COLA 2021-06-02 2022-06-02 7 0.980146 ... 0.813092 100.0 0.009378 0.0 0.0 0.0 0.0 0.0 2022-03-31 0.0
7 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:29:10.281435 AValColaRPMD policy-1 COLA 2022-06-02 2023-06-02 8 0.975970 ... 0.789409 100.0 0.010159 0.0 0.0 0.0 0.0 0.0 2023-03-31 0.0
8 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:29:10.281435 AValColaRPMD policy-1 COLA 2023-06-02 2024-06-02 9 0.971383 ... 0.766417 100.0 0.010993 0.0 0.0 0.0 0.0 0.0 2024-03-31 0.0
9 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:29:10.281435 AValColaRPMD policy-1 COLA 2024-06-02 2025-06-02 10 0.966322 ... 0.744094 100.0 0.011891 0.0 0.0 0.0 0.0 0.0 2025-03-31 0.0
10 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:29:10.281435 AValColaRPMD policy-1 COLA 2025-06-02 2026-06-02 11 0.960689 ... 0.722421 100.0 0.012832 0.0 0.0 0.0 0.0 0.0 2026-03-31 0.0
11 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:29:10.281435 AValColaRPMD policy-1 COLA 2026-06-02 2027-06-02 12 0.954425 ... 0.701380 100.0 0.013837 0.0 0.0 0.0 0.0 0.0 2027-03-31 0.0
12 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:29:10.281435 AValColaRPMD policy-1 COLA 2027-06-02 2028-06-02 13 0.947496 ... 0.680951 100.0 0.014907 0.0 0.0 0.0 0.0 0.0 2028-03-31 0.0
13 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:29:10.281435 AValColaRPMD policy-1 COLA 2028-06-02 2029-06-02 14 0.939963 ... 0.661118 100.0 0.016019 0.0 0.0 0.0 0.0 0.0 2029-03-31 0.0
14 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:29:10.281435 AValColaRPMD policy-1 COLA 2029-06-02 2030-06-02 15 0.931851 ... 0.641862 100.0 0.017184 0.0 0.0 0.0 0.0 0.0 2030-03-31 0.0
15 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:29:10.281435 AValColaRPMD policy-1 COLA 2030-06-02 2031-06-02 16 0.923073 ... 0.623167 100.0 0.018414 0.0 0.0 0.0 0.0 0.0 2031-03-31 0.0
16 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:29:10.281435 AValColaRPMD policy-1 COLA 2031-06-02 2032-06-02 17 0.913473 ... 0.605016 100.0 0.019708 0.0 0.0 0.0 0.0 0.0 2032-03-31 0.0
17 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:29:10.281435 AValColaRPMD policy-1 COLA 2032-06-02 2033-06-02 18 0.902886 ... 0.587395 100.0 0.021045 0.0 0.0 0.0 0.0 0.0 2033-03-31 0.0
18 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:29:10.281435 AValColaRPMD policy-1 COLA 2033-06-02 2034-06-02 19 0.891167 ... 0.570286 100.0 0.022403 0.0 0.0 0.0 0.0 0.0 2034-03-31 0.0
19 0.6.0 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb 2021-03-25 11:29:10.281435 AValColaRPMD policy-1 COLA 2034-06-02 2035-06-02 20 0.878272 ... 0.553676 100.0 0.023750 0.0 0.0 0.0 0.0 0.0 2035-03-31 0.0

16 rows × 24 columns

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

model.audit("Audit-AValColaRPMD.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.