Reserves#

The term reserves is sometimes used in place of policy values. AMLCR uses policy value to mean the expected value of the future loss random variable, and restricts reserve to mean the actual capital held in respect of a policy, which may be greater than or less than the policy value.

Recursion#

The following recursive formulae relating \(_tV\) to \(_{t+1}V\) for policy values can be derived for policies with discrete cash flows.

Gross reserves

\(( _tV^g + G - e)(1 + i) = q_{x+t} ~ (b + E) + p_{x+t} ~ _{t+1}V^g\)

  • recursion for gross reserves

Expense reserves

\(( _tV^e + P^e - e)(1 + i) = q_{x+t} ~ E + p_{x+t} ~ _{t+1}V^e\)

  • recursion for expense reserves

Net reserves

\(( _tV + P)(1 + i) = q_{x+t} ~ b + p_{x+t} ~ _{t+1}V\)

  • recursion for net reserves

Refund of benefit reserve

\(( _tV + P)(1 + i) = q_{x+t} ~ (b +~ _{t+1}V) + p_{x+t} ~ _{t+1}V\)

  • if reserves are also refunded after death, then the end-of-year value reserves should be added to death benefits in the reserves recursion formula

Interim reserves#

Recursive formulae for interim reserves \(_{t+r}V\) where \(0 \le r \le 1\) can be similarly obtained. These compute the reserve for fully discrete annual-premium insurances in the middle of the year.

\(( _tV + P)(1 + i)^r =~ _rq_{x+t} ~ b ~ v^{1-r} + ~_rp_{x+t} ~ _{t+r}V\)

  • forward recursion for interim net reserves

\(_{t+r}V ~ (1 + i)^{1-r} =~ _{1-r}q_{x+t+r} ~ b + ~_{1-r}p_{x+t+r} ~ _{t+1}V\)

  • backward recursion for interim net reserves

Modified reserves#

Because acquisition expenses are large relative to the renewal and claims expenses, accounting with level net premiums typically results in large negative values for expense reserves (called deferred acquisition costs or DAC) particularly at issue. Modified premium reserves are computed without expenses, and modifies the net premium method to assume a lower initial net premium that allow implicitly for the DAC.

Full Preliminary Term

FPT is the most common method for modifying net premium policy value. It treats the insurance policy as one-year term insurance combined with a policy as if it were issued one year later.

\(\alpha = A^{1}_{x:\overline{1|}} = v ~ q_x\)

  • initial FPT premium

\(\beta = \dfrac{A_{x+1}}{\ddot{a}_{x+1}}\)

  • renewal FPT premium

\(_0V^{FPT} ~ = ~ _1V^{FPT} ~ = 0\)

  • since renewal premium set year 1 policy value to 0, while initial premium set to equal year 1 expected benefits.

\(_tV^{FPT}\) for \((x) ~= ~ _{t-1}V\) for \((x+1)\)

  • since renewal FPT premium for (x) is net premium for (x+1) with term lengths adjusted

Methods#

The Reserves class implements methods to solve reserves by recursion, and compute interim and modified reserves.

from actuarialmath import Reserves, Contract
import describe
describe.methods(Reserves)
class Reserves - Compute recursive, interim or modified reserves

    Methods:
    --------

    set_reserves(T, endowment, V):
      Set values of the reserves table and the endowment benefit amount

    fill_reserves(x, s, reserve_benefit, contract):
      Iteratively fill in missing values in reserves table

    t_V_forward(x, s, t, premium, benefit, per_premium, per_policy, reserve_benefit):
      Forward recursion (with optional reserve benefit)

    t_V_backward(x, s, t, premium, benefit, per_premium, per_policy, reserve_benefit):
      Backward recursion (with optional reserve benefit)

    t_V(x, s, t, premium, benefit, reserve_benefit, per_premium, per_policy):
      Solve year-t reserves by forward or backward recursion

    r_V_forward(x, s, r, premium, benefit):
      Forward recursion for interim reserves

    r_V_backward(x, s, r, benefit):
      Backward recursion for interim reserves

    FPT_premium(x, s, n, b, first):
      Initial or renewal Full Preliminary Term premiums

    FPT_policy_value(x, s, t, b, n, endowment, discrete):
      Compute Full Preliminary Term policy value at time t

    V_plot(ax, color, title):
      Plot values from reserves tables

    reserves_frame():
      Returns reserves table as a DataFrame

Examples#

The FPT_premium and FPT_policy_value methods compute the Full Preliminary Term premiums and policy values for whole life, temporary and endowment insurances.

import math
def S(x, s, t):  # define a survival function
    return math.exp(-.00022*t - (.0000027*1.124**(x+s)*(1.124**t-1))/math.log(1.124))
life = Reserves().set_survival(S=S, minage=20, maxage=130)\
                  .set_interest(i=0.05)
P = life.net_premium(x=20, b=1000)
print('Level Net Premium:', P)
print('FPT premiums:     ',
      life.FPT_premium(x=20, b=1000, first=True), 
      life.FPT_premium(x=20, b=1000, first=False))
print('FPT policy values:', 
      [round(life.FPT_policy_value(x=20, b=1000, t=t), 4) for t in range(5)])
Level Net Premium: 2.465109289578718
FPT premiums:      0.2377514556176763 2.582546365777722
FPT policy values: [0, 0, 2.459, 5.0374, 7.7409]

The set_reserves method is called to load given values of reserves into an internal table, and then fill_reserves method can be called to iteratively fill in missing values. Internally, this calls the t_V method which attempts both the t_V_forward and t_V_backward methods that implement the recursion formula forwards and backwards respectively. Interim reserves recursion formulas for fractional durations are similarly implemented in the r_V_forward and r_V_backward methods. Values of reserves over time can be plotted with V_plot or displayed with the reserves_frame methods.

SOA Question 7.31

For a fully discrete 3-year endowment insurance of 1000 on (x), you are given:

  • Expenses, payable at the beginning of the year, are:

Year(s)

Percent of Premium

Per Policy

1

20%

15

2 and 3

8%

5

  • The expense reserve at the end of year 2 is –23.64

  • The gross annual premium calculated using the equivalence principle is G = 368.

  • \(G = 1000 P_{x:\overline{3|}} + P^e\) , where \(P^e\) is the expense loading

Calculate \(P_{x:\overline{3|}}\) .

print("SOA Question 7.31:  (E) 0.310")
x = 0
life = Reserves().set_reserves(T=3)
G = 368.05
def fun(P):  # solve net premium from expense reserve equation
    return life.t_V(x=x, t=2, premium=G-P, benefit=lambda t: 0, 
                    per_policy=5 + .08*G)
P = life.solve(fun, target=-23.64, grid=[.29, .31]) / 1000
print(P)
SOA Question 7.31:  (E) 0.310
0.309966

AMLCR2 Figure 7.4:

Policy values for each year of a 20-year term insurance, sum insured \(500,000, issued to (50). Mortality follows the Standard Ultimate Life Table (note AMLCR2 used Standard Select Table), with interest rate \)i=0.05$.

from actuarialmath.sult import SULT
life = SULT()
x, T, b = 50, 20, 500000    # $500K 20-year term insurance for (50)               
P = life.net_premium(x=x, t=T, b=b)
life.set_reserves(T=T)\
    .fill_reserves(x=x, contract=Contract(premium=P, benefit=b))
life.V_plot(title=f"Reserves for ${b} {T}-year term insurance issued to ({x})")
_images/4e980e9fdce78ec100139e179bebdf954be746adecc349ba49a0ac21cd1d3293.png

AMLCR2 Figure 7.3:

Policy values for each year of a 20-year endowment insurance, sum insured \(500,000, issued to (50). Mortality follows the Standard Ultimate Life Table (note AMLCR2 used Standard Select Table), with interest rate \)i=0.05$.

from actuarialmath.sult import SULT
life = SULT()
x, T, b = 50, 20, 500000    # $500K 20-year term insurance for (50)               
P = life.net_premium(x=x, t=T, b=b, endowment=b)
life.set_reserves(T=T)\
    .fill_reserves(x=x, contract=Contract(premium=P, benefit=b, endowment=b))
life.V_plot(title=f"Reserves for ${b} {T}-year endowment insurance issued to ({x})")
_images/e8828a18b7cb03f7563dc0308ce7b7ec300dac28b38108dbdcbd0795136cac21.png