Woolhouse M’thly#
Woolhouse’s formula is a method of approximating 1/mthly life annuities from annual factors that does not depend on a fractional age assumption. It is based on the Euler-Maclaurin series expansion for the integral of a function. Life insurances may then be computed from twin relationships.
Life Annuities#
\(\ddot{a}^{(m)}_{x} \approx \ddot{a}_{x} - \dfrac{m-1}{2m} - \dfrac{m^2 - 1}{12m^2}(\mu_x + \delta)\)
1/m’thly whole life annuity using the three-term Woolhouse approximation. The third term is often omitted in practice, which leads to poor approximations in some cases.
\( \ddot{a}^{(m)}_{x:\overline{t|}} \approx \ddot{a}^{(m)}_{x} - ~_tE_x ~ \ddot{a}^{(m)}_{x+t} = \ddot{a}_{x:\overline{t|}} - \dfrac{m-1}{2m}(1 - ~_tE_x) - \dfrac{m^2 - 1}{12m^2}(\mu_x + \delta -~_tE_x(\mu_{x+t} + \delta))\)
1/m’thly temporary life annuity from the difference of whole life Woolhouse approximations
\(\overline{a}_{x} \approx \ddot{a}_{x} - \dfrac{1}{2} - \dfrac{1}{12}(\mu_x + \delta)\)
continuous life annuity with Woolhouse approximation when we let \(m \to \infty\).
\(\mu_x \approx -\dfrac{1}{2}(\ln p_{x-1} + \ln p_x)\)
if the force of mortality \(\mu\) is not provided for the third Woolhouse term, it can be approximated from survival probabilities at integer ages.
Methods#
Ths Woolhouse class implements an instance of Mthly, which uses the Woolhouse assumption with either two or three terms, to compute m-thly pay annuities with Woolhouse approximation formulas, from which 1/m-thly life insurance are computed from their twin formulas.
from actuarialmath import Woolhouse, SULT, Recursion, UDD, Contract
import describe
describe.methods(Woolhouse)
class Woolhouse - 1/m'thly shortcuts with Woolhouse approximation
Args:
m : number of payments per year
life : original fractional survival and mortality functions
three_term : whether to include (True) or ignore (False) third term
approximate_mu : exact (False), approximate (True) or function for third term
Methods:
--------
mu_x(x, s):
Computes mu_x or calls approximate_mu for third term
Examples#
SOA Question 7.7
For a whole life insurance of 10,000 on (x), you are given:
Death benefits are payable at the end of the year of death
A premium of 30 is payable at the start of each month
Commissions are 5% of each premium
Expenses of 100 are payable at the start of each year
\(i = 0.05\)
\(1000 A_{x+10} = 400\)
\(_{10} V\) is the gross premium policy value at the end of year 10 for this insurance
Calculate \(_{10} V\) using the two-term Woolhouse formula for annuities.
print("SOA Question 7.7: (D) 1110")
x = 0
life = Recursion().set_interest(i=0.05).set_A(0.4, x=x+10)
a = Woolhouse(m=12, life=life).whole_life_annuity(x+10)
print(a)
contract = Contract(premium=0, benefit=10000, renewal_policy=100)
V = life.gross_future_loss(A=0.4, contract=contract.renewals())
contract = Contract(premium=30*12, renewal_premium=0.05)
V1 = life.gross_future_loss(a=a, contract=contract.renewals())
print(V, V1, V+V1)
SOA Question 7.7: (D) 1110
12.141666666666666
5260.0 -4152.028174603174 1107.9718253968258
SOA Question 6.25:
For a fully discrete 10-year deferred whole life annuity-due of 1000 per month on (55), you are given:
The premium, \(G\), will be paid annually at the beginning of each year during the deferral period
Expenses are expected to be 300 per year for all years, payable at the beginning of the year
Mortality follows the Standard Ultimate Life Table
\(i = 0.05\)
Using the two-term Woolhouse approximation, the expected loss at issue is -800
Calculate \(G\).
print("SOA Question 6.25: (C) 12330")
life = SULT()
woolhouse = Woolhouse(m=12, life=life)
benefits = woolhouse.deferred_annuity(55, u=10, b=1000 * 12)
expenses = life.whole_life_annuity(55, b=300)
payments = life.temporary_annuity(55, t=10)
print(benefits + expenses, payments)
def fun(G):
return life.gross_future_loss(A=benefits + expenses, a=payments,
contract=Contract(premium=G))
G = life.solve(fun, target=-800, grid=[12110, 12550])
print(G)
SOA Question 6.25: (C) 12330
98042.52569470297 8.019169307712845
12325.781125438532
SOA Question 6.15
For a fully discrete whole life insurance of 1000 on (x) with net premiums payable quarterly, you are given:
\(i = 0.05\)
\(\ddot{a}_x = 3.4611\)
\(P^{(W)}\) and \(P^{(UDD)}\) are the annualized net premiums calculated using the 2-term Woolhouse (W) and the uniform distribution of deaths (UDD) assumptions, respectively
Calculate \(\dfrac{P^{(UDD)}}{P^{(W)}}\).
print("SOA Question 6.15: (B) 1.002")
x = 0
life = Recursion().set_interest(i=0.05).set_a(3.4611, x=0)
A = life.insurance_twin(3.4611)
udd = UDD(m=4, life=life)
a1 = udd.whole_life_annuity(x=x)
woolhouse = Woolhouse(m=4, life=life)
a2 = woolhouse.whole_life_annuity(x=x)
print(life.gross_premium(a=a1, A=A)/life.gross_premium(a=a2, A=A))
SOA Question 6.15: (B) 1.002
1.0022973504113772
SOA Question 5.7
You are given:
\(A_{35} = 0.188\)
\(A_{65} = 0.498\)
\(_{30}p_{35} = 0.883\)
\(i = 0.04\)
Calculate \(1000 \ddot{a}^{(2)}_{35:\overline{30|}}\) using the two-term Woolhouse approximation.
print("SOA Question 5.7: (C) 17376.7")
life = Recursion().set_interest(i=0.04)
life.set_A(0.188, x=35)
life.set_A(0.498, x=65)
life.set_p(0.883, x=35, t=30)
mthly = Woolhouse(m=2, life=life, three_term=False)
print(mthly.temporary_annuity(35, t=30))
print(1000 * mthly.temporary_annuity(35, t=30))
SOA Question 5.7: (C) 17376.7
17.37671459632958
17376.71459632958