Rでオプション・プレミアムの計算(ブラック・ショールズ式による解析解)

本記事の目的と対象

本記事の目的は、オプションの価格を計算する公式であるブラック・ショールズ式を、Rを用いてコーディングする方法について述べることである。

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

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

目次

ブラック・ショールズ式(ブラック・ショールズモデル)とは

ブラック・ショールズモデルとは、株価の変動に対数正規分布を仮定した数理モデルのことであり、そのモデルから導出されるオプション価格の公式を、ブラック・ショールズ式(以下BS式)という。

ブラック・ショールズモデルにおいては、オプションの価格はいくつかのパラメタとよく知られた関数の組み合わせ、すなわち解析解(かいせき-かい)で表現することが可能であり、その解析解のことをBS式と呼ぶ。

原資産が配当を生む場合のBS式を修正BS式といい、以下の公式で与えられる[1]。
\[ \begin{split} C&=S_0e^{-qT}N(d_1)-Ke^{-rT}N(d_2)\\ P&=Ke^{-rT}N(-d_2)-S_0e^{-qT}N(-d_1) \end{split} \] ただし
\[ \begin{split} d_1&=\frac{log(S_0/K)+(r-q+\frac{1}{2}\sigma^2)T}{\sigma \sqrt{T}}\\ d_2&=\frac{log(S_0/K)+(r-q-\frac{1}{2}\sigma^2)T}{\sigma \sqrt{T}} \end{split} \]
以下では修正BS式を簡潔にRで記述する方法を示す。

BS式(解析解)のRでのコード例

修正BS式をRで表現するためにはBS式通りにコーディングすればよい。

RStudioの新規Scriptもしくは適当なテキストエディタで、以下のコードを入力し、Rのコンソールにコピー・アンド・ペーストする。

関数の引数として、株価\( S_0\)、ボラティリティ\( \sigma\)、無リスク金利\( r\)、配当率\( q\)、満期\(T \)、権利行使価格\( K\)を指定する。

Rでは変数の型の宣言などは必ずしも必要ない。

また、正規分布の累積密度関数\( N(\cdot)\)は、pnorm()という関数がすでに用意されているため、これを使う。
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)
}

計算結果

以下のインプットで、オプション価格を計算する。
S = 100
K = 100
T = 1
r = 5 / 100
q = 0 / 100
sigma = 30 / 100

結果は次の通り。
> BS_call(S, K, r, q, sigma, T)
[1] 14.23125

BS式による価格と本源的価値

原資産価格\( S\)と権利行使価格\( K\)の差\( S-K\)と\( 0\)の大きい方の値を、コールオプションの本源的価値と呼ぶ。

つまりコールオプションの本源的価値\( C_I\)は、 \[ \begin{split} C_I=max(S-K,0) \end{split} \] と表せる。

BS式によるオプション価格は、本源的価値を下回ることはない。

なぜならオプションの価値には、本源的価値に加え、満期までの間に原資産価格が上がり利益を増やす可能性による価値(時間的価値)が含まれるからである。

BS式によるオプション価格が本源的価値を上回ることを、図で確かめてみよう。

まず、将来の原資産価格が、\( 0\)円から\( 200\)円まで\( 5\)円刻みの値のいずれかをとると考えて、これを配列で表そう。
S_series = seq(0,200,5)

次に各原資産価格に対応する本源的価値を表す配列を用意し、各要素に\( max(S-K,0)\)を格納する。
IntrinsicValue=array(1:length(S_series))
for(i in 1:length(S_series)){
  IntrinsicValue[i]=max(S_series[i]-K,0)
}

BS式によるオプション価格の配列も用意しておく。

既に定義したBS式にS_seriesを代入することで、各要素に対応したオプション価格を要素に持つ配列を作成することが出来る。
BS=BS_call(S_series, K, r, q, sigma, T)

最後に、作成した本源的価値の配列IntrinsicValueとBS式によるオプション価格BSを図示してみよう。

配列を図示するにはplot()を用いる。

引数として、曲線で表示させることを示すtype="l"、縦軸を\( 0\)から\( 100\)で固定するためのylim=c(0,100)、軸ラベルを表示させないためのann=Fを追加する。

また、BS式によるオプション価格の曲線を赤くするためcol="red"を追加し、二つのplot()を一つの図に重ねるためにpar(new=T)を間に挟む。
plot(BS,type="l",col="red",ylim=c(0,100),ann=F)
par(new=T) 
plot(IntrinsicValue,type="l",ylim=c(0,100),ann=F)
図から分かる通り、BS式によるオプション価格(赤いライン)は常に、本源的価値(黒いライン)の上方にある。

まとめ

本記事では、BS式をRで実装するソースコード例を提供し、インプットデータを与え実際に価格の計算を行った。

また、その関数を用いて、BS式によるオプションの価格が常に本源的価値を上回ることをグラフによって確かめた。

参考文献

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

スポンサードリンク