The BasicTermASL_ME Model#
Overview#
The BasicTermASL_ME
is an adjustable step length(ASL) model, and projects the cashflows of
in-force policies at time 0 and future new business
policies issued after time 0.
As is the case with BasicTerm_ME,
time-dependent cells in BasicTermASL_ME carry out
calculations for all model points, and returns values for all the model points
as pandas Series or numpy array objects.
Unlike BasicTerm_ME, with BasicTermASL_ME
the user can specify the length of each projection step,
from 1 month to 1 year. By default, the first 60 steps are monthly
projections, while steps after that are annual.
This model reads issue date information from model point input,
and handles policy anniversaries precisely.
Space Inheritance#
BasicTermASL_ME has 3 spaces, namely
Base,
Projection
and Pricing.
Base is the base space
of Projection and
and Pricing, and
most Cells and References are defined in
Base.
Pricing is for calculating premiums.
In Pricing,
the issue dates of all model points are set to the projection start date
in model_point().
premium_pp() calculates
premiums per 1000 sum assured per payment from
loading_prem() and
the present values of claims over present value of polices in-force for premium payments.
Pricing.premium_pp() is brought in to Projection
as pricing_premium_pp and
referenced by Projection.premium_pp().
Projection Steps#
Projection steps are indexed with i.
Step i starts from one day after date_(i)
and ends on date_(i+1).
date_(0) is the projection start date.
The start date is specified by a date string assigned to date_init.
date_(i) returns a Timestamp object.
The length of each projection step can be specified by
offset() cells. offset(i) should return
the length of step i as a pandas DateOffset object,
so that the object can be added to
the Timestamp values of date_(i).
date_(i) should always be an end-of-month date,
so offset(i) should return DateOffset objects
such that date_(i) are always end-of-month dates.
YearEnd and MonthEnd objects are good examples.
By default, ‘2021-12-31’ is set to date_init,
and the first 60 steps are monthly and steps after that are annual.
>>> BasicTermASL_ME.Base.date_(0)
Timestamp('2021-12-31 00:00:00')
>>> BasicTermASL_ME.Base.date_(60)
Timestamp('2026-12-31 00:00:00')
>>> BasicTermASL_ME.Base.date_(61)
Timestamp('2027-12-31 00:00:00')
>>> BasicTermASL_ME.Base.offset(0)
<MonthEnd>
>>> BasicTermASL_ME.Base.offset(60)
<YearEnd: month=12>
Policy Anniversary#
When a policy’s anniversary date is in a projection step,
some cells, such as pols_lapse() and premiums() calculate their values by separately
calculating the parts before and after the anniversary and then adding them up.
For example, the formula of pols_lapse() looks like below:
def pols_lapse(i, j=None):
if j is None:
return pols_lapse(i, 'LAST') + pols_lapse(i, 'NEXT')
elif j == 'LAST':
lapse = 1 - (1 - lapse_rate(i))**(last_part(i) / 12)
return (pols_if_at(i, "BEG_STEP") - pols_death(i, 'LAST')) * lapse
elif j == 'NEXT':
lapse = 1 - (1 - lapse_rate(i+1))**(next_part(i) / 12)
return (pols_if_at(i, "AFT_NB") - pols_death(i, 'NEXT')) * lapse
else:
raise ValueError('invalid j')
When the second parameter j is not given,
pols_lapse(i) adds pols_lapse(i, 'LAST')
and pols_lapse(i, 'NEXT')
and returns the their sum.
pols_lapse(i, 'LAST') returns
the number of lapsed policies before the
policy anniversary in Step i.
pols_lapse(i, 'NEXT') returns
the number of lapsed policies during Step i after the
policy anniversary in Step i.
If the length of Step i is shorter than a full year,
then there may not be an anniversary date in Step i, in which
case pols_lapse(i, 'LAST') should
be the entire pols_lapse(i) and
pols_lapse(i, 'NEXT') should be zero.
The figure below illustrates adjacent policy terms
and the policy anniversary between them occurring during Step i.
next_anniversary(i) returns
the first anniversary date after date_(i)
for all model points as a Series of Timestamp objects.
months_in_step(i) returns the number of
months in Step i as an integer.
last_part(i) returns the length of time
from date_(i) to next_anniversary(i) in months.
next_part(i) returns the length of time
from next_anniversary(i) to date_(i+1) in months.
The fractional portions of last_part(i)
and next_part(i) represent residual days.
Model Specifications#
The Base space#
The sole base Space in the BasicTermASL_ME model.
Base is the only base Space defined
in the BasicTermASL_ME model,
and it contains logic and data commonly used in the sub spaces
of Base.
Parameters and References
(In all the sample code below,
the global variable Projection refers to the
Projection Space.)
- model_point_table#
All model points as a DataFrame. The sample model point data was generated by generate_model_points_ASL.ipynb included in the library. By default,
model_point()returns this entiremodel_point_table. The DataFrame has an index namedpoint_id, and has the following columns:age_at_entrysexpolicy_termpolicy_countsum_assuredissue_datepayment_freqpayment_term
Cells with the same names as these columns return the corresponding columns.
The DataFrame is saved in the Excel file model_point_table.xlsx located in the model folder.
model_point_tableis created by Projection’s new_pandas method, so that the DataFrame is saved in the separate file.
- disc_rate_ann#
Annual discount rates by duration as a pandas Series.
>>> Projection.disc_rate_ann year 0 0.00000 1 0.00555 2 0.00684 3 0.00788 4 0.00866 146 0.03025 147 0.03033 148 0.03041 149 0.03049 150 0.03056 Name: disc_rate_ann, Length: 151, dtype: float64
The Series is saved in the Excel file disc_rate_ann.xlsx placed in the model folder.
disc_rate_annis created by Projection’s new_pandas method, so that the Series is saved in the separate file.See also
- mort_table#
Mortality table by age and duration as a DataFrame. See basic_term_sample.xlsx included in this library for how the sample mortality rates are created.
>>> Projection.mort_table 0 1 2 3 4 5 Age 18 0.000231 0.000254 0.000280 0.000308 0.000338 0.000372 19 0.000235 0.000259 0.000285 0.000313 0.000345 0.000379 20 0.000240 0.000264 0.000290 0.000319 0.000351 0.000386 21 0.000245 0.000269 0.000296 0.000326 0.000359 0.000394 22 0.000250 0.000275 0.000303 0.000333 0.000367 0.000403 .. ... ... ... ... ... ... 116 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 117 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 118 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 119 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 120 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 [103 rows x 6 columns]
The DataFrame is saved in the Excel file mort_table.xlsx placed in the model folder.
mort_tableis created by Projection’s new_pandas method, so that the DataFrame is saved in the separate file.See also
- date_init#
The projection start date as a string in the YYYY-MM-DD format. The start date needs to be an end-of-month date. By default, ‘2021-12-31’ is assigned.
Projection parameters#
Model point data#
|
The attained age at |
The age at entry of the model points |
|
Issue ages of the model points |
|
Target model points |
|
|
Duration of model points at |
|
Duration of model points at period |
|
The sex of the model points |
The sum assured of the model points |
|
The policy term of the model points. |
|
Payment frequency |
|
|
Average timing of premium payments. |
Premium payment period in years |
Assumptions#
|
Mortality rate to be applied at time t |
MultiIndexed mortality table |
|
Acquisition expense per policy |
|
Annual maintenance expense per policy |
|
The inflation factor for Period |
|
Inflation rate |
|
|
Lapse rate |
|
Projection length in months |
Discount factors. |
|
Discount factors for premiums. |
|
|
Discount rate for period |
Policy attributes#
|
Claim per policy |
Loading per premium |
|
Premium per policy |
|
|
Indicates if model points are active. |
|
Indicates if premiums are being paid |
|
Indicates if model points are maturing in step |
|
Length of time till next anniversary in step |
|
Lentgh of time after next anniversary |
|
Nex anniversary dates |
Net premium per policy |
|
|
Number of premium payments in step |
Policy decrement#
|
Number of death |
|
Number of policies in-force |
|
Number of policies in-force |
|
Average number of policies in-force in step |
Initial number of policies in-force |
|
|
Number of lapse in step |
Number of maturing policies |
|
|
Number of new business policies |
|
Number of policies in-force for premium payment |
Cashflows#
|
Premium income |
|
Claims |
|
Commissions |
|
Expenses |
|
Net cashflow |
Present values#
Present value of claims |
|
Present value of commissions |
|
Present value of expenses |
|
Present value of net cashflows. |
|
Present value of policies in-force |
|
Present value of polices in-force for premium payments |
|
Present value of premiums |
Results#
|
Output values of a given cells |
Result table of cashflows |
|
Result table of policy decrement |
|
Result table of present value of cashflows |
Validation#
Check |
The Pricing space#
Space to calculate premiums
This space is for calculating premiums.
To calculate premiums, model_point() adjusts
the issue ages read from
model_point_table
so that all the model points become new business issued the day after
date_(0).
Target model points |
|
Premium per policy |
|
Net premium 1000 sum assured. |
The Projection space#
Space to carry out cashflow projections
This space is for carrying out cashflow projections.
The only difference from its base space,
Base is that
Pricing.premium_pp
is assigned to pricing_premium_pp in this space,
and premium_pp() is overridden to reference pricing_premium_pp
and returns the values of it.
Premium per policy |
Cells Descriptions#
- date_(i)[source]#
Date at each projection step.
Returns a date representing each projection step as pandas Timestamp.
date_(0)is read fromdate_init. Fori > 0,date_(i)is defined recursively as:date_(i-1) + offset(i-1)
date_(i)must always return an end-of-month date. The length of each projection step is specified byoffset(). Items indexed withiand representing the change of a quantity in a projection period such as cashflows, represents the change during the projection period starting from one day afterdate_(i)and ending ondate_(i+1)See also
- months_(i)[source]#
Number of elapsed months
Returns the number of elapsed months from
date_(0)atdate_(i).
- months_in_step(i)[source]#
Returns the number of months in step
iReturns the number of month between
date_(i)anddate_(i+1).
- step_to_month(i)[source]#
Returns the number of months for step
iReturn the number of months from
date_(0)todate_(i).See also
- max_proj_len()[source]#
The upper bound for the time index
iDefined as:
month_to_step(max(proj_len()))
Note that
proj_len()retuns lengths in months while this cells retuns an index value converted bymonth_to_step().
- month_to_step(m)[source]#
Returns step index for months
For a given number of months elapsed from
date_(0), returns the minimum step index such thatstep_to_month(i)is equal to or greater thanm.
- offset(i)[source]#
Time interval in step
iThis cells if for controlling the number of months in step
i. Stepiis from one day afterdate_(i)todate_(i+1). This cells should return an object of a sub calass of pandas DateOffset, such as MonthEnd and YearEnd object. The returned object must always represent end of month, and must not be longer than 1 year.To set the length of step
itoNmonthhs, offset(i) should returnpd.offsets.MonthEnd(N). To set the length to 1 year, offset(i) should returnpd.offsets.Year(1).By default, the formula is set so that the model projects monthly for the first 60 months (5 years) then annually after that.
offset()is defined as:if i < 60: return pd.offsets.MonthEnd(1) else: return pd.offsets.YearEnd(1)
See also
- age_at_entry()[source]#
The age at entry of the model points
The
age_at_entrycolumn of the DataFrame returned bymodel_point().
- issue_date()[source]#
Issue ages of the model points
The
issue_agecolumn of the DataFrame returned bymodel_point().
- model_point()[source]#
Target model points
Returns as a DataFrame the model points to be in the scope of calculation. By default, this Cells returns the entire
model_point_tablewithout change. To select model points, change this formula so that this Cells returns a DataFrame that contains only the selected model points.Examples
To select only the model point 1:
def model_point(): return model_point_table.loc[1:1]
To select model points whose ages at entry are 40 or greater:
def model_point(): return model_point_table[model_point_table["age_at_entry"] >= 40]
Note that the shape of the returned DataFrame must be the same as the original DataFrame, i.e.
model_point_table.When selecting only one model point, make sure the returned object is a DataFrame, not a Series, as seen in the example above where
model_point_table.loc[1:1]is specified instead ofmodel_point_table.loc[1].Be careful not to accidentally change the original table.
- duration_m(i)[source]#
Duration of model points at
iin monthsReturns durations at period
iin months of all model points as a Series indexed with model point ID.duration_m(i)is calculated fromdate_(i)andissue_date().duration_m()is 0 in the issue month.Negative values of
duration_m()indicate future new business policies. For example, If theduration_m()is -15 at time 0, the model point is issued 15 months later.See also
- duration_y(i)[source]#
Duration of model points at period
iin yearsReturns a Series calculated as:
duration_m(i) // 12
See also
- sex()[source]#
The sex of the model points
Note
This cells is not used by default.
The
sexcolumn of the DataFrame returned bymodel_point().
- sum_assured()[source]#
The sum assured of the model points
The
sum_assuredcolumn of the DataFrame returned bymodel_point().
- policy_term()[source]#
The policy term of the model points.
The
policy_termcolumn of the DataFrame returned bymodel_point().
- payment_freq()[source]#
Payment frequency
The
payment_freqcolumn of the DataFrame returned bymodel_point(), which indicates the number of payments in a year of each model point.
- payment_lag(i, j)[source]#
Average timing of premium payments.
If ‘LAST’ is passed to
j, returns the average time in months fromdate_(i)to a payment before the next policy anniversary. Defined as:last_part(i, freq_id='PREM') + max(pay_count(i, 'LAST') - 1, 0) * pay_interval / 2
where
pay_intervalis defined as12 // payment_freq().If ‘NEXT’ is passed to
j, returns the average time in months from the next anniversary date to a premium payment after the policy anniversary. Defined as:max(pay_count(i, 'NEXT') - 1, 0) * pay_interval / 2
See also
- payment_term()[source]#
Premium payment period in years
The
payment_termcolumn of the DataFrame returned bymodel_point().
- mort_rate(i)[source]#
Mortality rate to be applied at time t
Returns a Series of the mortality rates to be applied at time t. The index of the Series is
point_id, copied frommodel_point().See also
- mort_table_reindexed()[source]#
MultiIndexed mortality table
Returns a Series of mortlity rates reshaped from
mort_table. The returned Series is indexed by age and duration capped at 5.
- inflation_factor(i)[source]#
The inflation factor for Period
i.Defined as:
(1 + inflation_rate())**(months_in_step(i)/12)
See also
- lapse_rate(i)[source]#
Lapse rate
By default, the lapse rate assumption is defined by duration as:
max(0.1 - 0.02 * duration_y(i), 0.02)
See also
- proj_len()[source]#
Projection length in months
proj_len()returns how many months the projection for each model point should be carried out for all the model point. Defined as:np.maximum(12 * policy_term() - duration_m(0) + 1, 0)
Since this model carries out projections for all the model points simultaneously, the projections are actually carried out from 0 to
max_proj_lenfor all the model points.See also
- disc_factors()[source]#
Discount factors.
Vector of the discount factors as a Numpy array. Used for calculating the present values of cashflows.
See also
- disc_factors_prem(j)[source]#
Discount factors for premiums.
Returns a 2D numpy array. The array contains discount factors for discounting premiums of each model point. The timings of premium cashflows are adjusted by
payment_lag(). Sincepayment_lag()differs by model point,disc_factors_prem()returns a 2D array by model point and by time indexi. In each projection step, premium payments before and after policy anniversary are modeled separately, so different discount factors are returned depending of the value ofj. Whenj='LAST', the returned discount factors are for discounting premiums paid before policy anniversary, while whenj='NEXT', the factors are for premiums after the anniversary. For eachiandj,disc_factors_prem()is defined as:(1 + disc_rate(i))**(-t)
where
tis defined as forj='LAST':(months_(i) + payment_lag(i, j)) / 12
and for
j='NEXT'as:(months_(i) + last_part(i, j) + payment_lag(i, j)) / 12
- Parameters:
j – ‘LAST’ or ‘NEXT’
See also
- disc_rate(i)[source]#
Discount rate for period
iReturns an annual discount rate to be applied for period
i, which starts one day afterdate_(i)and ends ondate_(i+1). The discount rate is read fromdisc_rate_ann. If the number of years elapsed fromdate_initchanges during the period, discount rates read fromdisc_rate_annare prorated.See also
- claim_pp(i)[source]#
Claim per policy
The claim amount per plicy. Defaults to
sum_assured().
- loading_prem()[source]#
Loading per premium
0.5by default. Used bypremium_pp()in thePricingspace.See also
Premium per policy
This cells is defined in sub spaces.
- is_active(i)[source]#
Indicates if model points are active.
Returns a Series indexed with model point ID indicating whether each model point is active at
date_(i)byTrueorFalse. A model point is active if it has been issued but not expired.is_active()is defined as:(0 <= duration_m(i)) & (duration_m(i) < policy_term() * 12)
See also
- is_paying(i)[source]#
Indicates if premiums are being paid
Returns a Series of booleans indexed with model point ID indicating whether each model point is paying premiums at
date_(i). Defined as:is_active(i) & (duration_m(i) < payment_term() * 12)
See also
- is_maturing(i)[source]#
Indicates if model points are maturing in step
i.Returns a Series indexed with model point ID indicating whether each model point is maturing during the period from one day after
date_(i)todate_(i+1)byTrueorFalse.is_maturing()is defined as:(duration_m(i) < policy_term() * 12) & (policy_term() * 12 <= duration_m(i+1))
See also
- last_part(i, freq_id='ANV')[source]#
Length of time till next anniversary in step
iWhen
freq_idtakes its default value ‘ANV’,last_part()returns and a Series indexed with model point ID that indicates for each model point the length of time in months until the next policy anniversary in stepi. The decimal fraction of the length, if any, represents the proportion of the number of days befor anniversary in the anniversary months. The measured part corresponds to the remaining policy year the model point is in atdate_(i). If no policy anniversary is in Stepi, thenmonths_in_step(i)is returned. If ‘PREM’ is given tofreq_id, the lengh of time in months till the next payment date is returned.
- next_part(i)[source]#
Lentgh of time after next anniversary
Returns the length of time in month after the next anniversary during the step
i. If no anniversary is in stepi, thenmonths_in_step(i)is returned.Defined as:
months_in_step(i) - last_part(i)
- next_anniversary(i, freq_id='ANV')[source]#
Nex anniversary dates
Returns a Series of the next anniversary dates for all the model points.
When the second parameter
freq_idis ommitted or takes the default value of ‘ANV’, the next anniversary date for each model point is calculated as the first policy anniversary date that comes afterdate_(i).When
freq_idis ‘PREM’, returns the next payment date afterdate_(i), based on the premium payment cycle calculated frompayment_freq()andissue_date().See also
Net premium per policy
Note
This cells is implmented in the
Pricingsubspace.
- pay_count(i, j=None)[source]#
Number of premium payments in step
iThe number of premium payments in step
i(from 1 day afterdate_(i)todate_(i+1)). If ‘LAST’ is passed toj, only the payments in stepiduring the last policy period (the year that the policy is in atdate_(i)) is counted. If ‘NEXT’ is passed toj, only the payments in stepiafter the next policy anniversary is counted.- Parameters:
i – Step index
j (optional) –
None(default), ‘LAST’ or ‘NEXT’
- pols_if(i)[source]#
Number of policies in-force
pols_if(t)is an alias forpols_if_at(t, 'BEG_STEP').See also
- pols_if_at(i, timing)[source]#
Number of policies in-force
pols_if_at(t, timing)calculates and returns the number of policies in-force at various timings in stepi. The second parametertimingtakes a string value to indicate the timing, which is either'BEG_STEP','DECR_LAST','AFT_MAT','AFT_NB'or'DECR_NEXT'.BEG_STEP
The number of policies in-force at the beginning of step
i. At time 0, the value is read frompols_if_init(). For time > 0, it is equal topols_if_at(i-1, 'DECR_NEXT').DECR_LAST
The number of policies in-force reflecting decrement by lapse and death before the next policy anniversary in step
i. Defined as:pols_if_at(i, 'BEG_STEP') - pols_lapse(i, 'LAST') - pols_death(i, 'LAST')
AFT_MAT
The number of policies after reflecting maturity decrement. Defined as:
pols_if_at(i, 'DECR_LAST') - pols_maturity(i)
AFT_NB
The number of policies after reflecting increase by new business. Defined as:
pols_if_at(i, 'AFT_MAT') + pols_new_biz(i)
DECR_NEXT
The number of policies after reflecting decrement by lapse and death after the next policy anniversary in step
i. Defined as:pols_if_at(i, 'AFT_NB') - pols_lapse(i, 'NEXT') - pols_death(i, 'NEXT')
- pols_if_avg(i)[source]#
Average number of policies in-force in step
iFor policies existing on
date_(i+1), defined as the mean ofpols_if_at(i, 'BEG_STEP')andpols_if_at(i+1, 'BEG_STEP').For policies maturing during step
i, defined as the mean ofpols_if_at(i, 'BEG_STEP')andpols_if_at(i, 'DECR_LAST').
- pols_if_init()[source]#
Initial number of policies in-force
Number of in-force policies at time 0 referenced from
pols_if_at(0, 'BEF_MAT').
- pols_lapse(i, j=None)[source]#
Number of lapse in step
iBy default, returns a Series each of whose elements represents the number of policies lapsed during step
ifor each model point. If ‘LAST’ is passed toj, only lapse before the next anniversary in stepiis counted. If ‘NEXT’ is passed toj, only lapse after the next anniversary is counted.- Parameters:
i – Step index
j (optional) –
None, ‘LAST’ or ‘NEXT’
See also
- pols_maturity(i)[source]#
Number of maturing policies
Returns a Series each of whose elements represent the number of policies maturing in step
ifor a model point. Maturity occurs whenduration_m()equals 12 timespolicy_term(). The amount is equal topols_if_at(t, "DECR_LAST").Otherwise
0.See also
- pols_new_biz(i)[source]#
Number of new business policies
Returns a Series each of whose elements represents the number of new business policies issued in step
i. Policies are issued when the following condition is met:(duration_m(i) < 0) & (duration_m(i+1) >= 0)
The numbers of new business policies are read from the
policy_countcolumn inmodel_point().See also
- pols_if_pay(i, j)[source]#
Number of policies in-force for premium payment
Returns a Series each of whose elements represents the number of policies in-force adjusted for
payment_lag(). If ‘LAST’ is passed toj, returns the number of in-force policies atpayment_lag(i, 'LAST')months pastdate_(i).If ‘NEXT’ is passed to
j, returns the number of in-force policies atpayment_lag(i, 'NEXT')months pastnext_anniversary(i).See also
Premium income
By default, returns a Series each of whose elements represent premium income of a model point in step
i. If ‘LAST’ is passed toj, only premiums before the next anniversary in stepiare aggregated. If ‘NEXT’ is passed toj, only premiums after the next anniversary are aggregated.See also
- claims(i)[source]#
Claims
Claims incurred during the period from
date_(i)+ 1 todate_(i+1)defined as:claim_pp(i) * pols_death(i)
See also
- commissions(i)[source]#
Commissions
By default, 100% premiums for the first policy year, 0 otherwise.
See also
- expenses(i)[source]#
Expenses
Expenses for Period
i. defined as the sum of acquisition expenses and maintenance expenses. The acquisition expenses are modeled asexpense_acq()timespols_new_biz(). The maintenance expenses are modeled asexpense_maint()timesinflation_factor()timespols_if_avg().
- net_cf(i)[source]#
Net cashflow
Net cashflow during step
idefined as:premiums(i) - claims(i) - expenses(i) - commissions(i)
See also
- pv_claims()[source]#
Present value of claims
Returns a Numpy array of the presenet values of claims.
See also
- pv_commissions()[source]#
Present value of commissions
Returns a Numpy array of the presenet values of commissions.
See also
- pv_expenses()[source]#
Present value of expenses
Returns a Numpy array of the presenet values of expenses.
See also
- pv_net_cf()[source]#
Present value of net cashflows.
Defined as:
pv_premiums() - pv_claims() - pv_expenses() - pv_commissions()
- pv_pols_if_pay()[source]#
Present value of polices in-force for premium payments
Calculated for ‘LAST’ and ‘NEXT’ separately, as
pay_count()timespols_if_pay()discounted bydisc_factors_prem().See also
Present value of premiums
Returns a Numpy array of the presenet values of premiums.
See also
- result_cells(name, point_id=None, j=None)[source]#
Output values of a given cells
Returns as a DataFrame the values of a cells specified by
namefor alli. By default, returns the values for all model points. Ifpoint_idis specified, returns the values only of the model point. If ‘LAST’ or ‘NEXT’ is passed toj, only the values of the ‘LAST’ or ‘NEXT’ part ofnameare aggregated.
- check_pay_count()[source]#
Check
pay_count().Return
Trueif, for all model points, the sum of the numbers of past and future premium payments equates topayment_term()timespayment_freq(). Th numbers of future payments are calculated by summingpay_count()for allifrom 0 tomax_proj_len()- 1. The numbers of past payments are calculated fromduration_m(0),payment_freq()andpayment_term().
- model_point()[source]#
Target model points
model_point()adjusts the issue date colum of the DataFrame read frommodel_point_tablefor the pricing purpose. For all model points, the issue dates are set to the date one day afterdate_(0).
Premium per policy
Returns a Series of premiums per policy per payment for all model points, defined as:
(1 + loading_prem()) * (sum_assured() / 1000) * net_premium_rate()
Net premium 1000 sum assured.
Calculates and returns a Series of net premium rates per 1000 sum assured per payment for all model points. Defined as:
(1000 / sum_assured()) * pv_claims() / pv_pols_if_pay()
See also
sum_assured()pv_claims()pv_pols_if_pay()
Premium per policy
A Series of premium per policy for all the model points. Defined as
pricing_premium_pp(), which ispremium_ppinPricingspace.