今週も特にありません

進捗どうですか?

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

RでVasicekモデルの債券価格とイールドで、金利モデル関連のRパッケージがない…と書いたが、SMFI5というパッケージで一応、VasicekモデルCIRモデルの債券価格を求めたりできるようだ

Statistical Methods for Financial Engineering」の5章に関してまとめパッケージとなっている。本を読んでいないので、なぜ5章だけなのかは分からない

このパッケージでも債券オプションについては入っていないので、前回に続き、Vasicekモデルにおける債券オプション価格について

# zero coupon bond option price under Vasicek 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 
#
VasicekZCBOption <- function(kappa, mu, sigma, r0, t, T, S, K, L) {
  sp <- sigma / kappa * (1 - exp(-kappa * (S - T))) * 
        sqrt((1 - exp(-2 * kappa * (T - t))) / (2 * kappa))
  PT <- VasicekZCBond(kappa, mu, sigma, r0, t, T)$price
  PS <- VasicekZCBond(kappa, mu, sigma, r0, t, S)$price
  d1 <- log(L * PS / (K * PT)) / sp + sp / 2
  d2 <- d1 - sp
  M  <- K * PT / (L * PS)
  CP <- L * PS * pnorm(d1) - K * PT * pnorm(d2)
  PP <- K * PT * pnorm(-d2) - L * PS * pnorm(-d1)
  data.frame(moneyness = M, callprice = CP, putprice = PP)
}

関数の中でVasicekモデルの債券価格関数を使っているので、読み込んでおく。前回と同様のモデルのパラメータをセット

kappa <- 0.2
mu <- 0.015
sigma <- 0.003
r0 <- -0.001
t <- 0
T <- 1/12
S <- 3
K <- 0.98
L <- 1
df <- VasicekZCBOption(kappa, mu, sigma, r0, t, T, S, K, L)

オプション価格は次のようになる

> df
  moneyness  callprice     putprice
1 0.9888111 0.01108998 4.579769e-13

プットコールパリティが成立することを確認

> L * VasicekZCBond(kappa, mu, sigma, r0, t, S)$price + df$putprice
[1] 0.9911608
> K * VasicekZCBond(kappa, mu, sigma, r0, t, T)$price + df$callprice
[1] 0.9911608

マネネスが1となるあたりでオプション価格変化をプロット

library(dplyr)
library(tidyr)
library(ggplot2)
library(ggthemes)

K <- seq(0.975, 1.0075, by = 0.001)
df <- VasicekZCBOption(kappa, mu, sigma, r0, t, T, S, K, L)
df %>% gather(type, price, -moneyness) %>% 
  ggplot(aes(x = moneyness, y = price, colour = type)) + 
  geom_line(size = 1.2) + theme_economist() + ggtitle("option price") +
  scale_x_continuous(breaks = seq(0.98, 1.02, by = 0.01))

f:id:masaqol:20150130141031p:plain

エコノミスト誌風な色が付けられるscale_colour_economistもあったが2本のみだと良い感じではなかったので使用しなかった

ゼロクーポン債に対するヨーロピアンオプションで、1ファクターVasicekモデルでの評価なんて実際には使われていないだろうけれども、これを基本にしてスワップションなどのより複雑なデリバティブを考えていくにはよい勉強になる