Description

Additive duals by comparing all tangents.

Usage

 1 AddDual(path, subsim, weight, value, Scrap) 

Arguments

 path 3-D array representing sample paths. Entry [i,,j] represents the state at time j for sample path i. subsim 5-D array containing the subsimulation disturbance matrices. Matrix [,,i,j,t] represents the disturbance used in subsimulation i on sample path j at time t. weight Array specifying the probability weights of the subsimulation disturbance matrices. value 4-D array tangent approximation of the value function, where the intercept [i,1,p,t] and slope [i,-1,p,t] describes a tangent of the value function at grid point i for position p at time t. Scrap User supplied function to represent the scrap function. The function should take in the following argument: n \times d matrix representing the n d-dimensional states. The function should output the following: Matrix with dimensions n \times p) representing the scraps, where p is the number of positions. The [i,p]-th entry corresponds to the scrap at the p-th position for the i-th state.

Value

3-D array where entry [i,p,t] represents the martingale increment at time t for position p on sample path i.

Jeremy Yee

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 ## Bermuda put option grid <- as.matrix(cbind(rep(1, 81), c(seq(20, 60, length = 81)))) disturb <- array(0, dim = c(2, 2, 100)) disturb[1, 1,] <- 1 quantile <- qnorm(seq(0, 1, length = (100 + 2))[c(-1, -(100 + 2))]) disturb[2, 2,] <- exp((0.06 - 0.5 * 0.2^2) * 0.02 + 0.2 * sqrt(0.02) * quantile) weight <- rep(1 / 100, 100) control <- matrix(c(c(1, 2),c(1, 1)), nrow = 2) reward <- array(data = 0, dim = c(81, 2, 2, 2, 50)) in_money <- grid[, 2] <= 40 reward[in_money, 1, 2, 2,] <- 40 reward[in_money, 2, 2, 2,] <- -1 for (tt in 1:50){ reward[,,2,2,tt] <- exp(-0.06 * 0.02 * (tt - 1)) * reward[,,2,2,tt] } scrap <- array(data = 0, dim = c(81, 2, 2)) scrap[in_money, 1, 2] <- 40 scrap[in_money, 2, 2] <- -1 scrap[,,2] <- exp(-0.06 * 0.02 * 50) * scrap[,,2] r_index <- matrix(c(2, 2), ncol = 2) bellman <- FastBellman(grid, reward, scrap, control, disturb, weight, r_index) suppressWarnings(RNGversion("3.5.0")) set.seed(12345) start <- c(1, 36) ## starting state path_disturb <- array(0, dim = c(2, 2, 100, 50)) path_disturb[1, 1,,] <- 1 rand1 <- rnorm(100 * 50 / 2) rand1 <- as.vector(rbind(rand1, -rand1)) ## anti-thetic disturbances path_disturb[2, 2,,] <- exp((0.06 - 0.5 * 0.2^2) * 0.02 + 0.2 * sqrt(0.02) * rand1) path <- PathDisturb(start, path_disturb) ## Reward function RewardFunc <- function(state, time) { output <- array(data = 0, dim = c(nrow(state), 2, 2)) output[,2, 2] <- exp(-0.06 * 0.02 * (time - 1)) * pmax(40 - state[,2], 0) return(output) } policy <- FastPathPolicy(path, grid, control, RewardFunc, bellman$expected) ## Scrap function ScrapFunc <- function(state) { output <- array(data = 0, dim = c(nrow(state), 2)) output[,2] <- exp(-0.06 * 0.02 * 50) * pmax(40 - state[,2], 0) return(output) } ## Subsimulation disturbances subsim <- array(0, dim = c(2, 2, 100, 100, 50)) subsim[1,1,,,] <- 1 rand2 <- rnorm(100 * 100 * 50 / 2) rand2 <- as.vector(rbind(rand2, -rand2)) subsim[2,2,,,] <- exp((0.06 - 0.5 * 0.2^2) * 0.02 + 0.2 * sqrt(0.02) * rand2) subsim_weight <- rep(1 / 100, 100) ## Additive duals mart <- AddDual(path, subsim, subsim_weight, bellman$value, ScrapFunc) 

rcss documentation built on May 1, 2019, 10:13 p.m.