va_bs_engine: Variable Annuity pricing engine with GBM

Description Usage Format Value Methods References Examples

Description

Class providing a variable annuity pricing engine with the underlying reference risk neutral fund modeled as a Geometric Brownian Motion and the intensity of mortality modeled by the Weibull intensity of mortality. The value of the VA contract is estimated by means of the Monte Carlo method if the policyholder cannot surrender (the so called "static" approach), and by means of Least Squares Monte Carlo in case the policyholder can surrender the contract (the "mixed" approach).
See References -[BMOP2011] for a description of the mixed and static approaches and the algorithm implemented by this class, [LS2001] for Least Squares Monte Carlo.

Usage

1

Format

R6Class object.

Value

Object of R6Class

Methods

new

Constructor method with arguments:

product

va_product object

interest

constant_parameters object with the interest rate

c1

numeric scalar argument of the intensity of mortality function mu

c2

numeric scalar argument of the intensity of mortality function mu

spot

numeric scalar with the initial fund price

volatility

constant_parameters object with the volatility

dividends

constant_parameters object with the dividend rate

death_time

Returns the time of death index. If the death doesn't occur during the product time-line it returns the last index of the product time-line

simulate_financial_paths

Simulates npaths paths of the underlying fund of the VA contract and the discount factors (interest rate) and saves them into private fields for later use.

simulate_mortality_paths

Simulates npaths paths of the intensity of mortality and saves them into private fields for later use.

get_fund

Gets the i-th path of the underlying fund where i goes from 1 to npaths

do_static

Estimates the VA contract value by means of the static approach (Monte Carlo), see References. It takes as arguments:

the_gatherer

gatherer object to hold the point estimates

npaths

positive integer with the number of paths to simulate

simulate

boolean to specify if the paths should be simulated from scratch, default is TRUE.

do_mixed

Estimates the VA contract by means of the mixed approach (Least Squares Monte Carlo), see References. It takes as arguments:

the_gatherer

gatherer object to hold the point estimates

npaths

positive integer with the number of paths to simulate

degree

positive integer with the maximum degree of the weighted Laguerre polynomials used in the least squares by LSMC

freq

string which contains the frequency of the surrender decision. The default is "3m" which corresponds to deciding every three months if surrendering the contract or not.

simulate

boolean to specify if the paths should be simulated from scratch, default is TRUE.

get_discount

Arguments are i,j. Gets the j-th discount factor corresponding to the i-th simulated path of the discount factors. This method must be implemented by sub-classes.

fair_fee

Calculates the fair fee for a contract using the bisection method. Arguments are:

fee_gatherer

data_gatherer object to hold the point estimates

npaths

numeric scalar with the number of MC simulations to run

lower

numeric scalar with the lower fee corresponding to positive end of the bisection interval

upper

numeric scalar with the upper fee corresponding to the negative end of the bisection interval

mixed

boolean specifying if the mixed method has to be used. The default is FALSE

tol

numeric scalar with the tolerance of the bisection algorithm. Default is 1e-4

nmax

positive integer with the maximum number of iterations of the bisection algorithm

simulate

boolean specifying if financial and mortality paths should be simulated.

References

  1. [BMOP2011] Bacinello A.R., Millossovich P., Olivieri A. ,Pitacco E., "Variable annuities: a unifying valuation approach." In: Insurance: Mathematics and Economics 49 (2011), pp. 285-297.

  2. [LS2001] Longstaff F.A. e Schwartz E.S. Valuing american options by simulation: a simple least-squares approach. In: Review of Financial studies 14 (2001), pp. 113-147

Examples

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#Sets up the payoff as a roll-up of premiums with roll-up rate 1%

rate <- constant_parameters$new(0.01)

premium <- 100
rollup <- payoff_rollup$new(premium, rate)

#Ten years time-line
begin <- timeDate::timeDate("2016-01-01")
end <- timeDate::timeDate("2025-12-31")

#Age of the policyholder.
age <- 60
# A constant fee of 4% per year (365 days)
fee <- constant_parameters$new(0.04)

#Barrier for a state-dependent fee. The fee will be applied only if
#the value of the account is below the barrier
barrier <- Inf
#Withdrawal penalty applied in case the insured surrenders the contract
#It is a constant penalty in this case
penalty <- penalty_class$new(type = 1, 0.01)
#Sets up the contract with GMAB guarantee
contract <- GMAB$new(rollup, t0 = begin, t = end, age = age, fee = fee,
barrier = barrier, penalty = penalty)

#Interest rate
r <- constant_parameters$new(0.03)
#Initial value of the underlying fund
spot <- 100
#Volatility
vol <- constant_parameters$new(0.2)
#Dividend rate
div <- constant_parameters$new(0.0)
#Gatherer for the MC point estimates
the_gatherer <- mc_gatherer$new()
#Number of paths to simulate
no_of_paths <- 1e2

#Sets up the pricing engine specifying the va_contract, the interest rate
#the parameters of the Weibull intensity of mortality, the initial fund
#value, the volatility and dividends rate
engine <- va_bs_engine$new(contract, r, c1=90.43, c2=10.36, spot,
volatility=vol, dividends=div)

#Estimates the contract value by means of the static approach.

engine$do_static(the_gatherer, no_of_paths)
the_gatherer$get_results()

#Estimates the contract value by means of the mixed approach.
#To compare with the static approach we won't simulate the underlying
#fund paths again.

the_gatherer_2 <- mc_gatherer$new()

engine$do_mixed(the_gatherer_2, no_of_paths, degree = 3,
freq = "3m", simulate = FALSE)
the_gatherer_2$get_results()

valuer documentation built on May 2, 2019, 3:43 p.m.