Approximation (Milstein Scheme) of the Cox-Ingersoll-Ross process
January 16, 2023
The CIR process is given by the SDE:
(1)
(cf. Glasserman, p. 108); where W(t) is a Brownian motion. Take α=0.2, σ=0.02, b=0.05, and r(0) = 0.044.
By application of the first-order Milstein scheme to the CIR model, we have:
(2)
where Z~N(0, 1), so the Monte Carlo simulation could be:
f <- function(non_par){ alpha = 0.2 sigma = 0.02 b = 0.05 r0 = 0.044 q0 = 1 s0 = 0 m = 1000 dt = 5 / m p = 1 Z = rnorm(m, mean = 0, sd = 1) r <- as.numeric(list()) r[1] = r0 + alpha*(b-r0)*dt + sigma*sqrt(r0)*sqrt(dt)*Z[1] + 1/4*sigma**2*dt*(Z[1]**2 - 1) for(i in 2:m){ r[i] = r[i-1] + alpha*(b-r[i-1])*dt + sigma*sqrt(r[i-1])*sqrt(dt)*Z[i] + 1/4*sigma**2*dt*(Z[i]**2 - 1) } q <- as.numeric(list()) q[1] = q0 + q0*r0*dt for(i in 2:m){ q[i] = q[i-1] + q[i-1]*r[i-1]*dt } s <- as.numeric(list()) s[1] = s0 + (p + s0*r0)*dt for(i in 2:m){ s[i] = s[i-1] + (p + s[i-1]*r[i-1])*dt } return(c(s[m], q[m])) } num <- 1000 test <- c(1:num) Y <- data.frame(lapply(test, f)); sum_s = 0 sum_q = 0 for (i in 1:num){ sum_s <- sum_s + Y[[i]][1] sum_q <- sum_q + Y[[i]][2] } p <- sum_q / sum_s p
The simulation part is stored in {r(t)}, while other parts are used for (Asmussen and Glynn, p. 291, Problem 4.1).