Source code for simplelife.projection

"""Source module to create ``Projection`` space from.

.. rubric:: Project Templates

This module is included in the following project templates.

* :mod:`simplelife`
* :mod:`nestedlife`

.. rubric:: References

Attributes:
    pol: Alias to :py:mod:`Policy<simplelife.policy>` space
    asmp: Alias to :py:mod:`Assumption<simplelife.assumptions>` space
    scen: Alias to :py:mod:`Economic<simplelife.economic>` space

"""

def last_t():
    return min(asmp.LastAge - pol.IssueAge, pol.PolicyTerm)

[docs]def ppl_Age(t): """Attained age at time ``t``""" return pol.IssueAge + t
[docs]def ppl_SumAssured(t): """Sum assured per policy at time ``t``""" return pol.SumAssured
[docs]def ppl_AnnualizedPrem(t): """Annualized premium per policy at time ``t``""" return ppl_SumAssured(t) * pol.AnnualizedPremRate
# --- Income ---
[docs]def ppl_incm_Premium(t): """Premium income per policy from t to t+1""" return ppl_SumAssured(t) * pol.GrossPremRate * pol.PremFreq
[docs]def ppl_incm_Investment(t): """Investment Income per policy from t to t+1""" return (ppl_rsv_Total_AfterMat(t) + ppl_incm_Premium(t)) * scen.InvRetRate(t)
[docs]def ppl_incm_Total(t): """Income Total per policy""" return prj_incm_Premium(t) + prj_incm_Investment(t)
# --- Comissions ---
[docs]def ppl_exps_CommInit(t): """Initial commission per policy at time t""" if t == 0: return ppl_incm_Premium(t) * asmp.CmsnInitPrem * (1 + asmp.CnsmpTax) else: return 0
[docs]def ppl_exps_CommRen(t): """Renewal commission per policy at time t""" if t == 0: return 0 elif t < asmp.CmsnRenTerm: return ppl_incm_Premium(t) * asmp.CmsnRenPrem * (1 + asmp.CnsmpTax) else: return 0
# --- Expenses ---
[docs]def ppl_exps_Acq(t): """Acquisition expense per policy at time t""" if t == 0: return ppl_AnnualizedPrem(t) * asmp.ExpsAcqAP \ + (ppl_SumAssured(t) * asmp.ExpsAcqSA + asmp.ExpsAcqPol) \ * scen.InflFac(t) / scen.InflFac(0) else: return 0
[docs]def ppl_exps_Maint(t): """Maintenance expense per policy at time t""" return ppl_AnnualizedPrem(t) * asmp.ExpsMaintAP \ + (ppl_SumAssured(t) * asmp.ExpsMaintSA + asmp.ExpsMaintPol) \ * scen.InflFac(t)
[docs]def ppl_exps_Other(t): """Other expenses per policy at time t""" return 0
# --- Benfeits ---
[docs]def ppl_bnft_Death(t): """Death benefit per policy""" return ppl_SumAssured(t)
[docs]def ppl_bnft_AccDeath(t): """Accidental death benefit per policy""" return 0
[docs]def ppl_bnft_Surrender(t): """Surrender benefit per policy""" return ppl_SumAssured(t) * (pol.CashValueRate(t) + pol.CashValueRate(t + 1)) / 2
[docs]def ppl_bnft_Annuity(t): """Annuity benefit per policy""" return 0
[docs]def ppl_bnft_Maturity(t): """Maturity benefit per policy""" return 0
[docs]def ppl_bnft_AccHosp(t): """Accidental hospitalization benefit per policy""" return 0
[docs]def ppl_bnft_SickHosp(t): """Sickness hospitalization benefit per policy""" return 0
[docs]def ppl_bnft_Surgery(t): """Surgery benefit per policy""" return 0
[docs]def ppl_bnft_Living(t): """Living benefit per policy""" return 0
[docs]def ppl_bnft_Other(t): """Other benefit per policy""" return 0
# --- Reserve ---
[docs]def ppl_rsv_PremReserve_AfterMat(t): """Premium reserve per policy: After maturity""" return ppl_SumAssured(t) * pol.NLPReserveRate('VAL', t)
[docs]def ppl_rsv_UnearnedPrem_AfterMat(t): """Unearned premium: After maturity""" return 0 # ppl_SumAssured(t) * polset.UnernPremRate(polset, tt, True)
[docs]def ppl_rsv_Total_AfterMat(t): """Total reserve per policy: After maturity""" return ppl_rsv_PremReserve_AfterMat(t) \ + ppl_rsv_UnearnedPrem_AfterMat(t)
[docs]def ppl_rsv_PremReserve_EoP(t): """Premium reserve per policy: End of period""" return ppl_SumAssured(t) * pol.NLPReserveRate('VAL', t)
[docs]def ppl_rsv_UnearnedPrem_EoP(t): """Unearned reserve per policy: End of period""" return 0 # ppl_SumAssured(t) * pol.UnernPremRate(polset, tt)
[docs]def ppl_rsv_HospReserve_EoP(t): """Hospitalization reserve per policy: End of period""" return 0
# -------------------------------------------------------------------------- # Number of Policies
[docs]def nop_BoP(t): """Number of policies: Beginning of period""" return nop_AfterMat(t)
[docs]def nop_Renewal(t): """Number of policies: Renewal policies""" return 0
[docs]def nop_NewBiz(t): """Number of policies: New business""" return pol.PolicyCount if t == 0 else 0
[docs]def nop_BoP1(t): """Number of policies: Beginning of period 1""" return nop_BoP(t) + nop_Renewal(t) + nop_NewBiz(t)
[docs]def nop_Death(t): """Number of policies: Death""" return nop_BoP1(t) * asmp.BaseMortRate(ppl_Age(t)) * asmp.MortFactor(t)
[docs]def nop_AccDeath(t): """Number of policies: Accidental death""" return 0
[docs]def nop_Surrender(t): """Number of policies: Surrender""" if 'SurrRateMult' in globals(): surr_rate_mult = SurrRateMult else: surr_rate_mult = 1 return nop_BoP1(t) * asmp.SurrRate(t) * surr_rate_mult
[docs]def nop_Annuity(t): """Number of policies: Annuity""" return 0
[docs]def nop_AccHosp(t): """Number of policies: Accidental Hospitalization""" return 0
[docs]def nop_SickHosp(t): """Number of policies: Sickness Hospitalization""" return 0
[docs]def nop_Surgery(t): """Number of policies: Surgery""" return 0
[docs]def nop_Living(t): """Number of policies: Living benefits""" return 0
[docs]def nop_Other(t): """Number of policies: Other benefits""" return 0
[docs]def nop_EoP(t): """Number of policies: End of period""" if t == 0: return 0 # pol.PolicyCount else: return nop_BoP1(t - 1) - nop_Death(t - 1) - nop_Surrender(t - 1)
[docs]def nop_Maturity(t): """Number of policies: Maturity""" if t == pol.PolicyTerm: return nop_EoP(t) else: return 0
[docs]def nop_AfterMat(t): """Number of policies: Maturity""" return nop_EoP(t) - nop_Maturity(t)
#--- Per Policy * Policy Counts ---
[docs]def prj_incm_Premium(t): """Premium income""" return ppl_incm_Premium(t) * nop_BoP1(t)
[docs]def prj_incm_Investment(t): """Investment income""" return ppl_incm_Investment(t) * nop_BoP1(t)
[docs]def prj_incm_Total(t): """Income Total""" return prj_incm_Premium(t) + prj_incm_Investment(t)
[docs]def prj_exps_CommInit(t): """Initial commissions""" return ppl_exps_CommInit(t) * nop_BoP1(t)
[docs]def prj_exps_CommRen(t): """Renewal commissions""" return ppl_exps_CommRen(t) * nop_BoP1(t)
[docs]def prj_exps_CommTotal(t): """Commissions Total""" return prj_exps_CommInit(t) + prj_exps_CommRen(t)
[docs]def prj_exps_Acq(t): """Acquisition expenses""" return ppl_exps_Acq(t) * (nop_NewBiz(t) + nop_Renewal(t))
[docs]def prj_exps_Maint(t): """Maintenance expenses""" return ppl_exps_Maint(t) * nop_BoP1(t)
[docs]def prj_exps_Other(t): """Other expenses""" return 0
[docs]def prj_exps_Total(t): """Total expenses""" return prj_exps_CommInit(t) + prj_exps_CommRen(t) \ + prj_exps_Acq(t) + prj_exps_Maint(t) + prj_exps_Other(t)
[docs]def prj_bnft_Death(t): """Death benefits""" return ppl_bnft_Death(t) * nop_Death(t)
[docs]def prj_bnft_AccDeath(t): """Accidental death benefits""" return ppl_bnft_AccDeath(t) * nop_AccDeath(t)
[docs]def prj_bnft_Surrender(t): """Surrender benefits""" return ppl_bnft_Surrender(t) * nop_Surrender(t)
[docs]def prj_bnft_Annuity(t): """Annuity benefits""" return ppl_bnft_Annuity(t) * nop_Annuity(t)
[docs]def prj_bnft_Maturity(t): """Matuirty benefits""" return ppl_bnft_Maturity(t) * nop_Maturity(t)
[docs]def prj_bnft_AccHosp(t): """Accidental hospitalization benefits""" return ppl_bnft_AccHosp(t) * nop_AccHosp(t)
[docs]def prj_bnft_SickHosp(t): """Sickness hospitalization benefits""" return ppl_bnft_SickHosp(t) * nop_SickHosp(t)
[docs]def prj_bnft_Surgery(t): """Surgery benefits""" return ppl_bnft_Surgery(t) * nop_Surgery(t)
[docs]def prj_bnft_Living(t): """Living benefits""" return ppl_bnft_Living(t) * nop_Living(t)
[docs]def prj_bnft_Other(t): """Other benefits""" return ppl_bnft_Other(t) * nop_Other(t)
[docs]def prj_bnft_Total(t): """Benefit Total""" return \ prj_bnft_Maturity(t) \ + prj_bnft_Death(t) \ + prj_bnft_AccDeath(t) \ + prj_bnft_Surrender(t) \ + prj_bnft_Annuity(t) \ + prj_bnft_AccHosp(t) \ + prj_bnft_SickHosp(t) \ + prj_bnft_Surgery(t) \ + prj_bnft_Living(t) \ + prj_bnft_Other(t)
[docs]def prj_NetLiabilityCashflow(t): """Net liability cashflow""" return \ prj_incm_Premium(t) \ - prj_bnft_Total(t) \ - prj_exps_Total(t)
[docs]def pv_incm_Premium(t): """Present value of premium income""" if t > last_t: return 0 else: return prj_incm_Premium(t) + pv_incm_Premium(t + 1) / (1 + scen.DiscRate(t))
[docs]def pv_bnft_Surrender(t): """Present value of surrender benefits""" if t > last_t: return 0 else: return (-prj_bnft_Surrender(t) + pv_bnft_Surrender(t + 1)) / (1 + scen.DiscRate(t))
[docs]def pv_bnft_Death(t): """Present value of death benefits""" if t > last_t: return 0 else: return (-prj_bnft_Death(t) + pv_bnft_Death(t + 1)) / (1 + scen.DiscRate(t))
[docs]def pv_exps_Total(t): """Present value of total expenses""" if t > last_t: return 0 else: return - prj_exps_Total(t) + pv_exps_Total(t + 1) / (1 + scen.DiscRate(t))
[docs]def pv_NetLiabilityCashflow(t): """Present value of net liability cashflow""" if t > last_t: return 0 else: return pv_NetLiabilityCashflow(t + 1) / (1 + scen.DiscRate(t)) \ + prj_incm_Premium(t) \ - prj_bnft_Total(t) / (1 + scen.DiscRate(t)) \ - prj_exps_Total(t)
[docs]def prj_ChangeInReserve(t): """Change in reserve""" return prj_rsv_Total_EoP(t + 1) - prj_rsv_Total_EoP(t)
[docs]def prj_ProfitBeforeTax(t): """Profit before Tax""" return \ prj_incm_Premium(t) \ + prj_incm_Investment(t) \ - prj_bnft_Total(t) \ - prj_exps_Total(t) \ - prj_ChangeInReserve(t)
[docs]def prj_rsv_PremReserve_EoP(t): """Premium reserve: End of period""" return ppl_rsv_PremReserve_EoP(t) * nop_EoP(t)
[docs]def prj_rsv_UnearnedPrem_EoP(t): """Unearned Premium: End of period""" return 0
[docs]def prj_rsv_HospReserve_EoP(t): """Hospitalization reserve: End of period""" return 0
[docs]def prj_rsv_Total_EoP(t): """Total reserve: End of period""" return prj_rsv_PremReserve_EoP(t) \ + prj_rsv_UnearnedPrem_EoP(t)\ + prj_rsv_HospReserve_EoP(t)