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