本記事の目的と対象
本記事の目的は、プレーンなコールオプションの価格を、Rを用いたモンテカルロ法により計算する方法を提供することである。
対象者は以下の条件を満たす読者である。
- Rを使う環境が整っている人
- オプションとは何かを理解している人
- Rを用いてオプションのモンテカルロ・シミュレーションを実施したい人
本記事の内容は下記書籍の内容を参考にしているため、合わせて参照してほしい。
目次
モンテカルロ・シミュレーションによるオプション評価の概要
モンテカルロ法によって、将来の株価を乱数を用いてシミュレーションすることが出来る。したがって、将来の株価に依存してキャッシュフローが変化する金融派生商品の価格もまた、モンテカルロ・シミュレーションにより計算することが出来る。
オプションの権利行使日を\( T\)、権利行使価格を\( K\)とし、時点\( t\)における株価を\( S_t\)とすれば、
\[ \begin{split} Call~Value&=Max(S_T-K,0)\\ Put~Value&=Max(K-S_T,0) \end{split} \] と表現できるから、将来株価\( S_T\)がシミュレーションできれば、オプション価格もまた、計算できることになる。
ブラック・ショールズモデルにおける株価過程
\[ \begin{split} dS_t=\mu S_tdt+\sigma S_tdW_t \end{split} \] に「伊藤の公式」を適用することにより、時点\( T\)における株価は
\[ \begin{split} S_T=S_0e^{(\mu-\frac{1}{2}\sigma^2)T+\sigma W_T} \end{split} \] とかける。
\[ \begin{split} dS_t=\mu S_tdt+\sigma S_tdW_t \end{split} \] に「伊藤の公式」を適用することにより、時点\( T\)における株価は
\[ \begin{split} S_T=S_0e^{(\mu-\frac{1}{2}\sigma^2)T+\sigma W_T} \end{split} \] とかける。
離散形で表せば
\[ \begin{split} S_T=S_0e^{(\mu-\frac{1}{2}\sigma^2)T+ \sigma\epsilon\sqrt{T}} \end{split} \] である。
この式における\( \epsilon\)に対応する乱数を多数発生させ、将来株価\( S_T\)を何通りも計算させることで、各\( S_T\)に対応したオプション価格を求め、その平均を計算することがモンテカルロ法によるオプション計算の手順である。
なお、実際にはリスク中立過程と呼ばれる修正した株価過程が用いられ、将来価格を現在価格に割り引く作業が必要である。詳細はリファレンス[1], [2]を参照のこと。
実際のプログラムに使用するコ-ルオプションの計算式は次のとおりである([2](2.4)式)。
\[ \begin{split} Call~Value\approx\frac{1}{N}\sum_{j=1}^{N}Max(S_{T,j}-K,0) \end{split} \]
ブラック・ショールズモデルにおけるオプション価格のRでのシミュレーションコード例その1
まず、インプットデータを定義する。S=100 K=100 r=5/100 q=0.0 sigma=0.3 T=1
次に、Rでモンテカルロ・シミュレーションを実施するに当たり、乱数を用いる必要がある。正規分布に従う確率変数は
rnorm
で生成できる。これを用いて、モンテカルロ法によりオプション価格を計算する関数を、シミュレーション回数Sample
を引数にして定義すると、以下のようになる。Call_MC<-function(sample) { Call<-0 for(i in 1:sample) { Call<-Call+max(S*exp((r-q-sigma^2/2)*T+sigma*sqrt(T)*rnorm(1))-K,0) } Call<-exp(-r*T)*Call/sample return(Call) }
\( N=100,000\)で実際に計算させた結果は、以下の通りである。
> Call_MC(100000) [1] 14.2462インプットデータはこちらの記事に合わせてあるので、結論もほぼ一致している。
乱数を用いたシミュレーションであるから、計算結果は毎回違うことに注意してほしい。
ブラック・ショールズモデルにおけるオプション価格のRでのシミュレーションコード例その2
Rはベクトルによる計算が高速に行われるように作られたプログラミング言語である一方、for文などの繰り返し計算があまり高速でないという欠点がある。
この点を考慮し、コード例その1の繰り返し計算を、ベクトル演算で置き換えるように修正したコード例を示す。
具体的には、コードその1でfor文の中において一つずつ生成していた正規乱数
この点を考慮し、コード例その1の繰り返し計算を、ベクトル演算で置き換えるように修正したコード例を示す。
具体的には、コードその1でfor文の中において一つずつ生成していた正規乱数
rnotm
を、ベクトルとしてまとめて生成し(rnorm(sample)
)、これをコールオプションの式にまるごと代入して、計算する。Call_MC2<-function(sample) { x<-rnorm(sample) y<-S*exp((r-q-sigma^2/2)*T+sigma*sqrt(T)*x)-K Call<-exp(-r*T)*sum(y[y>0])/sample #y(Call価値)の正の部分のみを足す return(Call) }
計算結果は次の通り。
> Call_MC2(100000) [1] 14.25079
コードその1とその2の計算時間の違いを見てみよう。
system.time
関数を使うことで、処理の時間を計測することが出来る。
> system.time(Call_MC(100000)) ユーザ システム 経過 1.317 0.021 1.355 > system.time(Call_MC2(100000)) ユーザ システム 経過 0.018 0.002 0.021
このように、ベクトル計算を行ったコードその2の方が、60倍もの測度で計算できることがわかる。
まとめ
本記事では、株価が対数正規分布に従うブラック・ショールズモデルのもと、プレーンバニラオプションの価格をモンテカルロ・シミュレーションによって求めた。
Rには乱数生成のための関数が予め定義されており、簡単にモンテカルロ・シミュレーションを行うことが出来る。
また、繰り返し文とベクトル演算の二種類のコード例を挙げ、その計算速度の差を測定し、ベクトル演算の高速さを確かめた。
Rには乱数生成のための関数が予め定義されており、簡単にモンテカルロ・シミュレーションを行うことが出来る。
また、繰り返し文とベクトル演算の二種類のコード例を挙げ、その計算速度の差を測定し、ベクトル演算の高速さを確かめた。
参考文献
[1]大野 薫, 2012, モンテカルロ法によるリアル・オプション分析―事業計画の戦略的評価, きんざい[2]森平 爽一郎, モンテカルロ法によるオプション価格決定, オペレーションズ・リサーチ学会
[3]http://hiratake55.hatenadiary.jp/entry/20081118/1226994807
[4]大崎 秀一, 吉川 大介, 2013, ファイナンスのためのRプログラミング ―証券投資理論の実践に向けて―, 共立出版
スポンサードリンク
0 件のコメント :
コメントを投稿