Active - Deterministic - ROP Rider¶
Valuation Model¶
Documentation¶
-
class
AValRopRPMD
(*, 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, rop_return_freq: int, rop_return_percent: float, rop_claims_paid: float)¶ The active life reserve (ALR) valuation model for the return of premium (ROP) policy rider.
This model is a child of the AValBasePMD and includes additional parameters for rop_return_freq, rop_return_percent and rop_claims_paid parameters.
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.
- rop_return_freqint
The return of premium (ROP) frequency in years.
- rop_return_percentfloat
The return of premium (ROP) percentage.
- rop_claims_paidfloat
The return of premium (ROP) benefits paid.
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.
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 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 AValRopRPMD
model = AValRopRPMD(
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=50.0,
valuation_dt=pd.Timestamp("2020-03-31"),
assumption_set="STAT",
net_benefit_method="NLP",
rop_return_freq=10,
rop_return_percent=0.5,
rop_claims_paid=0,
)
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 int64
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(13), int64(1), 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:29.566164 | AValRopRPMD | policy-1 | ROP | 2019-06-02 | 2020-06-02 | 5 | 0.987588 | ... | 0.862609 | 50.0 | 0 | 0.0 | 727.903256 | 539.359825 | 214.874296 | 273.256746 | 2020-03-31 | 262.18 |
5 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:29.566164 | AValRopRPMD | policy-1 | ROP | 2020-06-02 | 2021-06-02 | 6 | 0.983993 | ... | 0.837484 | 50.0 | 0 | 0.0 | 727.903256 | 495.962595 | 273.256746 | 333.700785 | 2021-03-31 | 322.42 |
6 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:29.566164 | AValRopRPMD | policy-1 | ROP | 2021-06-02 | 2022-06-02 | 7 | 0.980146 | ... | 0.813092 | 50.0 | 0 | 0.0 | 727.903256 | 453.982727 | 333.700785 | 396.341791 | 2022-03-31 | 384.78 |
7 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:29.566164 | AValRopRPMD | policy-1 | ROP | 2022-06-02 | 2023-06-02 | 8 | 0.975970 | ... | 0.789409 | 50.0 | 0 | 0.0 | 727.903256 | 413.384934 | 396.341791 | 461.341919 | 2023-03-31 | 449.44 |
8 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:29.566164 | AValRopRPMD | policy-1 | ROP | 2023-06-02 | 2024-06-02 | 9 | 0.971383 | ... | 0.766417 | 50.0 | 0 | 0.0 | 727.903256 | 374.137511 | 461.341919 | 528.879203 | 2024-03-31 | 516.59 |
9 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:29.566164 | AValRopRPMD | policy-1 | ROP | 2024-06-02 | 2025-06-02 | 10 | 0.966322 | ... | 0.744094 | 50.0 | 0 | 600.0 | 727.903256 | 336.212306 | 528.879203 | 0.000000 | 2025-03-31 | 0.00 |
10 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:29.566164 | AValRopRPMD | policy-1 | ROP | 2025-06-02 | 2026-06-02 | 11 | 0.960689 | ... | 0.722421 | 50.0 | 0 | 0.0 | 292.173279 | 299.583554 | 0.000000 | 40.528521 | 2026-03-31 | 0.00 |
11 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:29.566164 | AValRopRPMD | policy-1 | ROP | 2026-06-02 | 2027-06-02 | 12 | 0.954425 | ... | 0.701380 | 50.0 | 0 | 0.0 | 292.173279 | 264.228985 | 40.528521 | 93.363764 | 2027-03-31 | 80.87 |
12 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:29.566164 | AValRopRPMD | policy-1 | ROP | 2027-06-02 | 2028-06-02 | 13 | 0.947496 | ... | 0.680951 | 50.0 | 0 | 0.0 | 292.173279 | 230.127959 | 93.363764 | 148.285110 | 2028-03-31 | 136.93 |
13 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:29.566164 | AValRopRPMD | policy-1 | ROP | 2028-06-02 | 2029-06-02 | 14 | 0.939963 | ... | 0.661118 | 50.0 | 0 | 0.0 | 292.173279 | 197.260529 | 148.285110 | 205.448248 | 2029-03-31 | 194.24 |
14 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:29.566164 | AValRopRPMD | policy-1 | ROP | 2029-06-02 | 2030-06-02 | 15 | 0.931851 | ... | 0.641862 | 50.0 | 0 | 0.0 | 292.173279 | 165.604088 | 205.448248 | 265.050033 | 2030-03-31 | 253.68 |
15 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:29.566164 | AValRopRPMD | policy-1 | ROP | 2030-06-02 | 2031-06-02 | 16 | 0.923073 | ... | 0.623167 | 50.0 | 0 | 0.0 | 292.173279 | 135.134918 | 265.050033 | 327.347515 | 2031-03-31 | 315.67 |
16 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:29.566164 | AValRopRPMD | policy-1 | ROP | 2031-06-02 | 2032-06-02 | 17 | 0.913473 | ... | 0.605016 | 50.0 | 0 | 0.0 | 292.173279 | 105.831858 | 327.347515 | 392.660441 | 2032-03-31 | 380.55 |
17 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:29.566164 | AValRopRPMD | policy-1 | ROP | 2032-06-02 | 2033-06-02 | 18 | 0.902886 | ... | 0.587395 | 50.0 | 0 | 0.0 | 292.173279 | 77.678162 | 392.660441 | 461.370409 | 2033-03-31 | 448.74 |
18 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:29.566164 | AValRopRPMD | policy-1 | ROP | 2033-06-02 | 2034-06-02 | 19 | 0.891167 | ... | 0.570286 | 50.0 | 0 | 0.0 | 292.173279 | 50.661273 | 461.370409 | 533.878307 | 2034-03-31 | 520.63 |
19 | 0.6.0 | 5d026f4756f03f9cb797de5a8f0c3c6d2b349ccb | 2021-03-25 11:29:29.566164 | AValRopRPMD | policy-1 | ROP | 2034-06-02 | 2035-06-02 | 20 | 0.878272 | ... | 0.553676 | 50.0 | 0 | 600.0 | 292.173279 | 24.771750 | 533.878307 | 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-AValRopRPMD.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.