今週も特にありません

進捗どうですか?

CIRモデルの債券オプション

Vasicekモデルと同じ流れでCIRの債券オプションについて

モデルの一部が違うだけでも、CIRモデルとVasicekモデルでこのような違いが出てくるのかといった部分を追っていくのも面白い。ただ、プログラミングするのは少し面倒となる

# zero coupon bond option price under Cox-Ingersoll-Ross model
# 
# Args:
#   kappa : speed of reversion
#   mu    : long term mean level
#   sigma : instaneous volatility
#   r0    : current short rate
#   t     : current time
#   T     : bond maturity
#   S     : option maturity
#   K     : strike price
#   L     : face value
#  
# Return:
#   data.frame of moneyness, call and put option prices 
#
CIRZCBOption <- function(kappa, mu, sigma, r0, t, T, S, K, L) {
  tau <- S - T
  g <- sqrt(kappa^2 + 2 * sigma^2)
  A <- ((2 * g * exp((kappa + g) * tau / 2)) / 
       (2 * g + (kappa + g) * (exp(tau * g) - 1)))^(2 * kappa * mu / sigma^2)
  B <- 2 * (exp(tau * g) - 1) / (2 * g + (kappa + g) * (exp(tau * g) - 1))
  ra <- log(L * A / K) / B
  l1 <- 2 * g / (sigma^2 * (exp((T - t) * g) - 1))
  l2 <- (kappa + g) / sigma^2
  d <- 4 * kappa * mu / sigma^2
  ncp1 <- 2 * l1^2 * r0 * exp((T - t) * g) / (l1 + l2 + B)
  ncp2 <- 2 * l1^2 * r0 * exp((T - t) * g) / (l1 + l2)
  q1 <- 2 * ra * (l1 + l2 + B)
  q2 <- 2 * ra * (l1 + l2)
  PT <- CIRZCBond(kappa, mu, sigma, r0, t, T)$price
  PS <- CIRZCBond(kappa, mu, sigma, r0, t, S)$price
  M <- K / (L * PS / PT)
  CP <- L * PS * pchisq(q1, d, ncp1) - K * PT * pchisq(q2, d, ncp2)
  PP <- CP + K * PT - L * PS
  data.frame(moneyness = M, callprice = CP, putprice = PP)
}

パラメータをセットする

kappa <- 0.2
mu <- 0.015
sigma <- 0.05
r0 <- 0.001
t <- 0
T <- 1/4
S <- 3
K <- 0.98
L <- 1

オプション価格を確認する

> CIRZCBOption(kappa, mu, sigma, r0, t, T, S, K, L)
  moneyness  callprice     putprice
1 0.9928814 0.00702689 2.968141e-06

パラメータを調整して、CIRモデルとVasicekモデルを完全に同じ条件で比較することは難しいが、CIRモデルの債券価格の場合と同様にボラティリティの部分を調整することで、確認することができる

オプション満期で債券価格がほぼ同じに評価されるようにパラメータを調整して、債券価格と債券オプション価格を計算してみる

> sigma_v <- sigma * sqrt(mu)

> VasicekZCBond(kappa, mu, sigma_v, r0, t, T)
  maturity     price       yield
1     0.25 0.9996641 0.001343863
> CIRZCBond(kappa, mu, sigma, r0, t, T)
  maturity    price       yield
1     0.25 0.999664 0.001344209

> VasicekZCBOption(kappa, mu, sigma_v, r0, t, T, S, K, L)
  moneyness   callprice     putprice
1  0.992794 0.007500676 0.0003899409
> CIRZCBOption(kappa, mu, sigma, r0, t, T, S, K, L)
  moneyness  callprice     putprice
1 0.9928814 0.00702689 2.968141e-06

基本的に、CIRモデルとVasicekモデルの債券オプション価格を比較した場合には、Vasicekモデルの短期金利がマイナスになるという可能性がある点で違いが出てくる。CIRモデルは非心カイ自乗分布、Vasicekモデルは正規分布短期金利が従うことから、CIRモデルはVasicekモデルに比べて、債券価格を低く評価する傾向がある。そこから、債券オプション価格も権利行使価格が額面価格に近づくにつれて、CIRモデルはVasicekモデルよりも低く評価する傾向にある

権利行使価格を変化させながら、オプション価格を計算する

K <- seq(0.97, 1.01, by = 0.001)
df1 <- VasicekZCBOption(kappa, mu, sigma_v, r0, t, T, S, K, L)
df2 <- CIRZCBOption(kappa, mu, sigma, r0, t, T, S, K, L)
df <- cbind(rbind(df1, df2), model = c(rep("Vasicek", nrow(df1)), rep("CIR", nrow(df2))))

ggplot2でプロットする

library(ggplot2)
library(ggthemes)

ggplot(df, aes(x = moneyness, y = callprice, colour = model)) + 
geom_line(size = 1.2) + theme_economist() + ggtitle("call option price") +
scale_x_continuous(breaks = seq(0.98, 1.02, by = 0.01))

ggplot(df, aes(x = moneyness, y = putprice, colour = model)) + 
geom_line(size = 1.2) + theme_economist() + ggtitle("put option price") +
scale_x_continuous(breaks = seq(0.98, 1.02, by = 0.01))

f:id:masaqol:20150405233900p:plain

f:id:masaqol:20150405233911p:plain

ATM付近でモデルの違いがオプション価格に現れてくることがわかります。初期金利の設定の仕方によっては変わってくる部分もありますが、細かいところを論ずる部分は教科書等を参考にお願いします…