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
Calculate Issue Age - Calculate the age policy issued.
Create Projectetd Frame - Create projected benefit frame from policy start date to policy end date by duration year.
Calculate Age Attained - Calculate age attained by policy duration on the frame.
Calculate Benefit Term Date - Calculate benefit termination date if active individual were to become disabled for each policy duration.
Model Claim Cost - Model claim cost for active live if policy holder were to become disabled for each policy duration
Get Incidence Rate - Get incidence rates and multiply by incidence sensitivity to form final rate.
Get Mortality Rates - Get lapse rates and multiply by incidence sensitivity to form final rate.
Get Lapse Rates - Get lapse rates and multiply by incidence sensitivity to form final rate.
Calculate Premiums - Calculate premiums for each duration.
- Calculate Benefit Cost - Calculate benefit cost by multiplying disabled claim cost by final incidence
rate for each duration.
Calculate Lives - Calculate the beginning, middle, and ending lives for each duration using lapse rates.
Calculate Discount Factors - Calculate beginning, middle, and ending discount factors for each duration.
Calculate Durational ALR - Calculate active life reserves (ALR) for each duration.
Calculate Valuation Date ALR - Calculate active life reserves (ALR) for each duration as of valuation date.
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.