UDD M’thly#
With the UDD fractional age assumption, we can work with annual insurance and annuity factors \(A_x\) and \(\ddot{a}_x\), then adjust for a more appropriate frequency \(A^{(m)}_{x}\) and \(\ddot{a}^{(m)}_{x}\) using the following relationships.
Life insurance#
Under UDD, the values of annual \(A_x\) can be used to derive exact results for 1/mthly insurance \(A^{(m)}_{x}\).
\(A^{(m)}_x = \dfrac{i}{i^{(m)}} A_x\)
discrete whole life insurance
\({^2}A^{(m)}_x = \dfrac{i^2 + 2i}{(i^2 + 2i)^{(m)}} ~ {^2}A_x\)
doubling the force of interest for discrete whole life insurance
\(A^ {1~(m)}_{x:\overline{t|}} = \dfrac{i}{i^{(m)}} A^{1}_{x:\overline{t|}}\)
discrete term insurance
\(A^{(m)}_{x:\overline{t|}} = \dfrac{i}{i^{(m)}} A^{1}_{x:\overline{t|}} + ~_tE_x\)
endowment insurance combines the death and survival benefits, so we need to split off the death benefit to apply the derivations.
\(_{u|}A^{(m)}_{x} = ~_uE_x \dfrac{i}{i^{(m)}} A_{x+u}\)
discrete deferred insurance
Continuous Life Insurance#
Under UDD, continuous life insurance can also be related to annual life insurance factors
\(\overline{A}_x = \dfrac{i}{\delta} A_x\)
whole life insurance
\({^2}\overline{A}_x = \dfrac{i^2 + 2i}{2\delta} ~ {^2} A_x\)
doubling the force of interest for whole life insurance
\(\overline{A}^ {1}_{x:\overline{t|}} = \dfrac{i}{\delta} A^{1}_{x:\overline{t|}}\)
term life insurance
\(\overline{A}_{x:\overline{t|}} = \dfrac{i}{\delta} A^{1}_{x:\overline{t|}} + ~_tE_x\)
endowment insurance
\(_{u|}\overline{A}_{x} = ~_uE_x ~ \dfrac{i}{\delta} A_{x+u}\)
deferred life insurance
Interest functions#
Under UDD, values of 1/mthly life annuities can be adjusted from annual life annuity factors using interest rate functions \(\alpha(m)\) and \(\beta(m)\). This can be shown by subtituting in annuity twins into the insurance relationships above.
\(\alpha(m) = \dfrac{id}{i^{(m)} ~ d^{(m)}}\)
\(\beta(m) = \dfrac{i - i^{(m)}}{i^{(m)} ~ d^{(m)}}\)
Life annuities#
Using the values of \(\ddot{a}_x\), and the interest rate functions, to obtain \(\ddot{a}^{(m)}_{x}\) under UDD:
\(\ddot{a}^{(m)}_{x} = \alpha(m) ~ \ddot{a}_{x} - \beta(m)\)
whole life annuity
\(\ddot{a}^{(m)}_{x:\overline {n|}} = \alpha(m) ~ \ddot{a}_{x:\overline {n|}} - \beta(m)(1 - ~_tE_x)\)
temporary life annuity
\(_{u|}\ddot{a}^{(m)}_{x} = \alpha(m) ~ _{u|}\ddot{a}_{x} - \beta(m) ~ _uE_x\)
deferred whole life annuity
Methods#
The UDD class implements an instance of Mthly, which assumes uniform distribution of deaths (UDD) between integer ages, to compute life insurance and annuities with 1/mthly benefits with shortcut formulas.
from actuarialmath import UDD, SULT, Recursion, Contract
import describe
describe.methods(UDD)
class UDD - 1/mthly shortcuts with UDD assumption
Args:
m : number of payments per year
life : original fractional survival and mortality functions
Methods:
--------
alpha(m, i):
Derive 1/mthly UDD interest rate beta function value
beta(m, i):
Derive 1/mthly UDD interest rate alpha function value
interest_frame(i):
Display 1/mthly UDD interest function values
Examples#
SOA Question 6.38
For an n-year endowment insurance of 1000 on (x), you are given:
Death benefits are payable at the moment of death
Premiums are payable annually at the beginning of each year
Deaths are uniformly distributed over each year of age
\(i = 0.05\)
\(_nE_x = 0.172\)
\(\overline{A}_{x:\overline{n|}} = 0.192\)
Calculate the annual net premium for this insurance.
print("SOA Question 6.38: (B) 11.3")
x, n = 0, 10
life = Recursion().set_interest(i=0.05)\
.set_A(0.192, x=x, t=n, endowment=1, discrete=False)\
.set_E(0.172, x=x, t=n)
a = life.temporary_annuity(x, t=n, discrete=False)
print(a)
def fun(a): # solve for discrete annuity, given continuous
life = Recursion().set_interest(i=0.05)\
.set_a(a, x=x, t=n)\
.set_E(0.172, x=x, t=n)
return UDD(m=0, life=life).temporary_annuity(x, t=n)
a = life.solve(fun, target=a, grid=a) # discrete annuity
P = life.gross_premium(a=a, A=0.192, benefit=1000)
print(a, P)
SOA Question 6.38: (B) 11.3
*Temporary Annuity a_0(t=10) <--
a_0(t=10) = [ 1 - A_0(t=10) ] / d(t=10) ~annuity twin
a_0(t=1) = 1 ~one-year discrete annuity
a_1(t=1) = 1 ~one-year discrete annuity
16.560714925944584
16.978162620976775 11.308644185253657
SOA Question 6.32
For a whole life insurance of 100,000 on (x), you are given:
Death benefits are payable at the moment of death
Deaths are uniformly distributed over each year of age
Premiums are payable monthly
\(i = 0.05\)
\(\ddot{a}_x = 9.19\)
Calculate the monthly net premium.
print("SOA Question 6.32: (C) 550")
x = 0
life = Recursion().set_interest(i=0.05).set_a(9.19, x=x)
benefits = UDD(m=0, life=life).whole_life_insurance(x)
payments = UDD(m=12, life=life).whole_life_annuity(x)
print(benefits, payments)
print(life.gross_premium(a=payments, A=benefits, benefit=100000)/12)
SOA Question 6.32: (C) 550
*Whole Life Insurance A_0(t=WL) <--
A_x = 1 - d * a_x ~annuity twin
0.5763261529803323 8.72530251348809
550.4356936711871
SOA Question 6.22
For a whole life insurance of 100,000 on (45) with premiums payable monthly for a period of 20 years, you are given:
The death benefit is paid immediately upon death
Mortality follows the Standard Ultimate Life Table
Deaths are uniformly distributed over each year of age
\(i = 0.05\)
Calculate the monthly net premium.
print("SOA Question 6.22: (C) 102")
life = SULT(udd=True)
a = UDD(m=12, life=life).temporary_annuity(45, t=20)
A = UDD(m=0, life=life).whole_life_insurance(45)
print(life.gross_premium(A=A, a=a, benefit=100000)/12)
SOA Question 6.22: (C) 102
102.40668704849178
SOA Question 7.9
For a semi-continuous 20-year endowment insurance of 100,000 on (45), you are given:
Net premiums of 253 are payable monthly
Mortality follows the Standard Ultimate Life Table
Deaths are uniformly distributed over each year of age
\(i = 0.05\)
Calculate \(_{10}V\), the net premium policy value at the end of year 10 for this insurance.
print("SOA Question 7.9: (A) 38100")
sult = SULT(udd=True)
x, n, t = 45, 20, 10
a = UDD(m=12, life=sult).temporary_annuity(x+10, t=n-10)
A = UDD(m=0, life=sult).endowment_insurance(x+10, t=n-10)
print(a, A)
contract = Contract(premium=253*12, endowment=100000, benefit=100000)
print(A*100000 - a*12*253, sult.gross_future_loss(A=A, a=a, contract=contract))
SOA Question 7.9: (A) 38100
7.831075686716718 0.6187476755196442
38099.62176709247 38099.62176709246
SOA Question 6.49
For a special whole life insurance of 100,000 on (40), you are given:
The death benefit is payable at the moment of death
Level gross premiums are payable monthly for a maximum of 20 years
Mortality follows the Standard Ultimate Life Table
\(i = 0.05\)
Deaths are uniformly distributed over each year of age
Initial expenses are 200
Renewal expenses are 4% of each premium including the first
Gross premiums are calculated using the equivalence principle
Calculate the monthly gross premium.
print("SOA Question 6.49: (C) 86")
sult = SULT(udd=True)
a = UDD(m=12, life=sult).temporary_annuity(40, t=20)
A = sult.whole_life_insurance(40, discrete=False)
P = sult.gross_premium(a=a, A=A, benefit=100000, initial_policy=200,
renewal_premium=0.04, initial_premium=0.04)
print(P/12)
SOA Question 6.49: (C) 86
85.99177833261696
Generate table of interest functions (for FAM-L exam):
print("Interest Functions at i=0.05")
print("----------------------------")
print(UDD.interest_frame())
Interest Functions at i=0.05
----------------------------
i(m) d(m) i/i(m) d/d(m) alpha(m) beta(m)
1 0.05000 0.04762 1.00000 1.00000 1.00000 0.00000
2 0.04939 0.04820 1.01235 0.98795 1.00015 0.25617
4 0.04909 0.04849 1.01856 0.98196 1.00019 0.38272
12 0.04889 0.04869 1.02271 0.97798 1.00020 0.46651
0 0.04879 0.04879 1.02480 0.97600 1.00020 0.50823