Rでオプション・プレミアムの価格計算(二項モデル(CRRモデル)による近似解)

本記事の目的と対象

本記事の目的は、オプションの価格を計算するためのモデルである二項モデルを、Rを用いてコーディングする方法について述べることである。

対象者は以下の条件を満たす読者である。
  • 二項モデル(CRRモデル)とはなにかを知っている人
  • Rを使う環境が整っている人
  • Rで二項モデルによるオプション価格の計算をしたい人
なお、以下の記事の内容を前提とする。

本記事の内容は下記書籍の内容を参考にしているため、合わせて参照してほしい。

目次

二項モデル(CRRモデル)のRでのコード例

まずインプットを定義しておく。

必要な情報は、現在の原資産価格\( S_0\)、権利行使価格\( K\)、無リスク金利\( r\)、配当率\( q\)、ボラティリティ\( \sigma\)、そして満期までの期間\( T\)である。
S0   <- 100                  #現在の原資産価格
K    <- 100                  #権利行使価格
r    <- 0.05                 #無リスク金利
q    <- 0.00                 #配当率
sigma<- 0.3                  #ボラティリティ
T    <- 1.0                  #満期


二項モデルによる計算プロセスは、満期までの期間の分割数Stepを引数とした関数として定義する。

関数の中で、原資産とオプションの価格を格納する配列を定義し、各ステップの時間を計算する。

また、原資産の上昇率と下落率、そしてリスク中立確率を計算しておく。

これらを用いて、まず原資産のツリーを構築し、満期におけるコールオプションの価値を計算した後、これを現在に向かって割引く計算を繰り返す。コード例は以下のとおりである。
binomial<-function(Step){
  Delta.t =T/Step                    #1Step当たりの期間
  u    <- exp(sigma*sqrt(Delta.t))       #上昇率
  d    <- exp(-sigma*sqrt(Delta.t))      #下落率
  p    <-(exp((r-q)*Delta.t)-d)/(u-d)    #リスク中立確率

  myMax=function(x)
  {
    myMax=max(x,0)
    return(myMax)
  }
  j=0:Step
  C0=sum(as.numeric(lapply(u^j*d^(Step-j)*S0-K,myMax))*choose(Step,j)*p^j*(1-p)^(Step-j))/(1+r)^T
  return( C0 )
}


計算結果

満期までの時間を\( 1000\)ステップに区切った場合の、二項モデルによるオプション価格は、次のようになる。
binomial(1000)
[1] 14.24553
この結果は、ブラック・ショールズ式による計算結果とほぼ一致する。

計算ステップと価格の関係

本節では、ステップ数が増加するに従いオプション価格はどのように変化するかを確かめる。

二項モデル(CRRモデル)に用いられる仮定は、ブラック・ショールズモデルと同一のものであると解釈できる。

従って、ステップ数が増加すれば(つまり現資産価格の変化が連続に近づくほど)、二項モデルによる計算結果はブラック・ショールズ式によるオプション価格に近づく。

これを確かめよう。

まずブラック・ショールズ式を定義(こちらの記事を参照)する。
BS_call <- function(S, K, r, q, sigma, T)
{
  d1 <- ( log(S/K) + (r - q + sigma^2/2)*T)/( sigma* sqrt(T))
  d2 <- ( log(S/K) + (r - q - sigma^2/2)*T)/( sigma* sqrt(T))
  C0 <- exp(-q*T)*S * pnorm(d1) - exp(-r*T)*K*pnorm(d2)
  return(C0)
}

既に定義したインプットのもとで計算すると、以下のような結果が得られる。
(BS<-BS_call(S0,K,r,q,sigma,T))
[1] 14.23125

続いて、ステップ数を\( 1\)から\( 100\)まで変化させた場合の、各ステップ数のもとでの二項モデルによるオプション価格を計算する。

Rには、配列xの各要素に関数fを適用した配列を返す関数lapply(x,f)が用意されている。

これを用いて、配列\( 1:100\)の各数字を、それぞれbinomial関数に代入した場合のオプション価格を得ることが出来る。

結果をプロットしてみよう。
 
二項モデルの計算結果をまず表示させ、そのグラフに上書きする形で(par(new=T))ブラック・ショールズ式による計算結果を描出する。

その際、グラフの種類は線(type="l")とし、縦軸の範囲は\( 13\)から\( 17\)(ylim=c(13,17))、軸ラベルをなし(ann=F)に設定する。

ブラック・ショールズ式の結果はステップ数によらないので、\( 1:100\)のどの値に対しても上で計算したBS(\(=14.23125\))を表示させ、水平なグラフになるようにする。
plot(1:100,binomial_series,type="l",ylim=c(13,17),ann=F)
par(new=T)
plot(1:100,rep(BS,100),col="red",type="l",ylim=c(13,17),ann=F)
このグラフから分かる通り、二項モデルにおける計算は、ステップ数が小さいときはブラック・ショールズ式による価格との誤差が大きいが、ステップ数を増すごとに上下に振動しながら収束していくことがわかる。

100ステップの段階での誤差は
> binomial(100)-BS
[1] -0.02942413
である。

まとめ

本記事では、二項モデル(CRRモデル)によるオプション価格の計算を、Rを用いて実行した。
また、二項モデルによる計算結果が、ブラック・ショールズ式による計算結果と近似することを確かめた。

参考文献

[1]大崎他(2013), ファイナンスのためのRプログラミング, 共立出版 [2]ジョン ハル (2016), フィナンシャルエンジニアリング〔第9版〕 ―デリバティブ取引とリスク管理の総体系, きんざい

スポンサードリンク