Active - Deterministic - SIS Rider¶
Valuation Model¶
Documentation¶
-
class
AValSisRPMD
(*, 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 changes being the addition of a step _get_sis_probability to lookup the probability of the policy holder qualifying for SIS (i.e., sis_probability) when modeling claim cost and the benefit amount is equal to the (1 - SIS prbability) x 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 AValSisRPMD
model = AValSisRPMD(
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:32.289130 | AValSisRPMD | policy-1 | SIS | 2019-06-02 | 2020-06-02 | 5 | 0.987588 | ... | 0.862609 | 100.0 | 0.007967 | 18.945856 | 215.602750 | 204.545774 | 12.601128 | 13.176120 | 2020-03-31 | 13.08 |
5 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:32.289130 | AValSisRPMD | policy-1 | SIS | 2020-06-02 | 2021-06-02 | 6 | 0.983993 | ... | 0.837484 | 100.0 | 0.008640 | 20.053419 | 199.271799 | 188.087893 | 13.176120 | 12.653764 | 2021-03-31 | 12.74 |
6 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:32.289130 | AValSisRPMD | policy-1 | SIS | 2021-06-02 | 2022-06-02 | 7 | 0.980146 | ... | 0.813092 | 100.0 | 0.009378 | 21.141130 | 182.554456 | 172.167529 | 12.653764 | 11.019093 | 2022-03-31 | 11.28 |
7 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:32.289130 | AValSisRPMD | policy-1 | SIS | 2022-06-02 | 2023-06-02 | 8 | 0.975970 | ... | 0.789409 | 100.0 | 0.010159 | 22.115814 | 165.515537 | 156.771301 | 11.019093 | 8.350162 | 2023-03-31 | 8.76 |
8 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:32.289130 | AValSisRPMD | policy-1 | SIS | 2023-06-02 | 2024-06-02 | 9 | 0.971383 | ... | 0.766417 | 100.0 | 0.010993 | 22.957123 | 148.290246 | 141.887184 | 8.350162 | 4.745977 | 2024-03-31 | 5.23 |
9 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:32.289130 | AValSisRPMD | policy-1 | SIS | 2024-06-02 | 2025-06-02 | 10 | 0.966322 | ... | 0.744094 | 100.0 | 0.011891 | 23.652092 | 131.019400 | 127.504503 | 4.745977 | 0.320870 | 2025-03-31 | 0.51 |
10 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:32.289130 | AValSisRPMD | policy-1 | SIS | 2025-06-02 | 2026-06-02 | 11 | 0.960689 | ... | 0.722421 | 100.0 | 0.012832 | 24.099990 | 113.842858 | 113.613486 | 0.320870 | 0.000000 | 2026-03-31 | 0.00 |
11 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:32.289130 | AValSisRPMD | policy-1 | SIS | 2026-06-02 | 2027-06-02 | 12 | 0.954425 | ... | 0.701380 | 100.0 | 0.013837 | 24.271444 | 96.959577 | 100.205688 | 0.000000 | 0.000000 | 2027-03-31 | 0.00 |
12 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:32.289130 | AValSisRPMD | policy-1 | SIS | 2027-06-02 | 2028-06-02 | 13 | 0.947496 | ... | 0.680951 | 100.0 | 0.014907 | 24.094044 | 80.569174 | 87.273281 | 0.000000 | 0.000000 | 2028-03-31 | 0.00 |
13 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:32.289130 | AValSisRPMD | policy-1 | SIS | 2028-06-02 | 2029-06-02 | 14 | 0.939963 | ... | 0.661118 | 100.0 | 0.016019 | 23.442804 | 64.896179 | 74.808700 | 0.000000 | 0.000000 | 2029-03-31 | 0.00 |
14 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:32.289130 | AValSisRPMD | policy-1 | SIS | 2029-06-02 | 2030-06-02 | 15 | 0.931851 | ... | 0.641862 | 100.0 | 0.017184 | 22.261621 | 50.217003 | 62.803373 | 0.000000 | 0.000000 | 2030-03-31 | 0.00 |
15 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:32.289130 | AValSisRPMD | policy-1 | SIS | 2030-06-02 | 2031-06-02 | 16 | 0.923073 | ... | 0.623167 | 100.0 | 0.018414 | 20.464489 | 36.809101 | 51.248304 | 0.000000 | 0.000000 | 2031-03-31 | 0.00 |
16 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:32.289130 | AValSisRPMD | policy-1 | SIS | 2031-06-02 | 2032-06-02 | 17 | 0.913473 | ... | 0.605016 | 100.0 | 0.019708 | 17.941953 | 24.965019 | 40.135469 | 0.000000 | 0.000000 | 2032-03-31 | 0.00 |
17 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:32.289130 | AValSisRPMD | policy-1 | SIS | 2032-06-02 | 2033-06-02 | 18 | 0.902886 | ... | 0.587395 | 100.0 | 0.021045 | 14.548386 | 14.998120 | 29.458515 | 0.000000 | 0.000000 | 2033-03-31 | 0.00 |
18 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:32.289130 | AValSisRPMD | policy-1 | SIS | 2033-06-02 | 2034-06-02 | 19 | 0.891167 | ... | 0.570286 | 100.0 | 0.022403 | 10.101838 | 7.251735 | 19.212683 | 0.000000 | 0.000000 | 2034-03-31 | 0.00 |
19 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:32.289130 | AValSisRPMD | policy-1 | SIS | 2034-06-02 | 2035-06-02 | 20 | 0.878272 | ... | 0.553676 | 100.0 | 0.023750 | 4.320381 | 2.103833 | 9.394390 | 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-AValSisRPMD.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.