vasicek <- function(T, t=0, r=0.05, a=0.2, b=0.1, sigma=0.02) {
  sharpe = 0
  rbar = b + sigma*sharpe/a - 0.5*sigma^2/a^2
  
  A <- function(t, T) {
    exp(rbar*(B(t,T) + t - T) - B(t,T)^2*sigma^2/(4*a))
  }
  
  B <- function(t, T) {
    (1 - exp(-a*(T-t)))/a
  }
  
  P <- function(t, T, r) {
    A(t,T) * exp(-B(t,T) * r)
  }
  
  -log(P(t, T, r))/(T-t) # implied yield
}

cir <- function(T, t=0, r=0.05, a=0.2, b=0.1, sigma=0.02) {
  sigma = sigma/sqrt(r)
  barSharpe = 0
  gamma = sqrt((a + barSharpe)^2 + 2*sigma^2)
  
  A <- function(t, T) {
    ((2*gamma*exp( (a + barSharpe + gamma) * (T- t) / 2) )/
      ( (a + barSharpe + gamma) * (exp(gamma*(T-t))- 1) + 2*gamma ))^(2*a*b/(sigma^2))
  }
  
  B <- function(t, T) {
    2*(exp(gamma*(T-t)) - 1)/
      ((a + barSharpe + gamma) * (exp(gamma*(T-t)) - 1) + 2*gamma)
  }

  P <- function(t, T, r) {
    A(t,T) * exp(-B(t,T) * r) 
  }
  
  -log(P(t, T, r))/(T-t) # implied yield
  #P(t,T,r)
}

t = seq(0, 25, by=0.1)
sigmas = c(0.02, 0.10)

# Vasicek Model vs CIR Model
for(i in 1:length(sigmas)) {
  r1 <- numeric(0)
  r2 <- numeric(0)
  for(num in t) {
    r1 = c(r1, vasicek(num, sigma=sigmas[i])) # vasicek
    r2 = c(r2, cir(num, sigma=sigmas[i])) # cir
  }
  if(i==1) {
    plot(t, r1, type='l', lty=3,col='black', ylim=c(0.045, 0.10), ylab="r", xlab="T", main=paste0("Vasicek vs CIR, sigma = ", sigmas[i]))
    lines(t, r2, type='l', col='black')
    legend(1, 0.095, c("Vasicek", "CIR"), lty=1:2)
  } else {
    plot(t, r1, type='l', lty=3,col='black', ylim=c(0,0.09), ylab="r", xlab="T", main=paste0("Vasicek vs CIR, sigma = ", sigmas[i]))
    lines(t, r2, type='l', col='black')
    legend(1, 0.08, c("Vasicek", "CIR"), lty=1:2)
  }
}

plot of chunk unnamed-chunk-1plot of chunk unnamed-chunk-1