本記事の目的と対象
本記事の目的は、Pythonでインプライド・ボラティリティを計算するためのコード例を示すことにある。対象者は以下の条件を満たす読者である。
- Pythonを書ける環境が整っている人
- オプションとはなにかを理解している人
- Pythonでインプライド・ボラティリティを計算する方法を知りたい人
なお、本記事の内容は下記書籍の内容を参考にしているため、合わせて参照してほしい。
目次
インプライド・ボラティリティとはなにか
インプライド・ボラティリティとは、あるオプション価格計算モデルと現実のオプション価格から逆算されるボラティリティのことである。
例として、ブラック・ショールズモデルによるインプライド・ボラティリティを考えよう。
現在の株価を\( S_0\)、権利行使価格を\( K\)、無リスク金利を\( r\)、配当率を\( q\)、ボラティリティを\( \sigma\)、満期を\( T\)として、ブラック・ショールズ式によるのコールオプションの価格を\( C_{BS}(S_0,K,r,q,\sigma,T)\)とする。
また、コールオプションの市場価格を\( \bar{C}_M\)とする。
このとき、ブラック・ショールズ式のオプション価格を、ボラティリティ\( \sigma\)の関数と見て、\( C(\sigma)=C_{BS}(S_0,K,r,q,\sigma,T)\)と書けば、等式\( C(\sigma)=\bar{C}_M\)は\( \sigma\)に関する方程式となる。
この方程式を\( \sigma\)について解いたときの解\( \sigma^*\)が、インプライド・ボラティリティである。
現在の株価を\( S_0\)、権利行使価格を\( K\)、無リスク金利を\( r\)、配当率を\( q\)、ボラティリティを\( \sigma\)、満期を\( T\)として、ブラック・ショールズ式によるのコールオプションの価格を\( C_{BS}(S_0,K,r,q,\sigma,T)\)とする。
また、コールオプションの市場価格を\( \bar{C}_M\)とする。
このとき、ブラック・ショールズ式のオプション価格を、ボラティリティ\( \sigma\)の関数と見て、\( C(\sigma)=C_{BS}(S_0,K,r,q,\sigma,T)\)と書けば、等式\( C(\sigma)=\bar{C}_M\)は\( \sigma\)に関する方程式となる。
この方程式を\( \sigma\)について解いたときの解\( \sigma^*\)が、インプライド・ボラティリティである。
インプライド・ボラティリティの計算コード例
等式\( C(\sigma)=\bar{C}_M\)の解\( \sigma^*\)はよく知られた関数の組み合わせで表現することは出来ない。
そこで、この方程式を解くためには、数値解法を用いる必要がある。
方程式を解く方法(求根アルゴリズム)には、ニュートン法や二分法が知られている。
本記事では、Pythonのモジュールの一つSciPyに含まれる
まず必要なモジュールをインポートする。
次にブラック・ショールズ式を定義する。
この式とオプションの市場価格から、ボラティリティを逆算する。
そこで、この方程式を解くためには、数値解法を用いる必要がある。
方程式を解く方法(求根アルゴリズム)には、ニュートン法や二分法が知られている。
本記事では、Pythonのモジュールの一つSciPyに含まれる
optimize
というモジュールを用いて方程式を解き、インプライド・ボラティリティを求める。まず必要なモジュールをインポートする。
scipy
から方程式を解くのに用いるoptimize
と必要な関数を、またscipy.stats
から正規分布の累積分布関数の計算に必要なnorm
モジュールをインポートする。from scipy import optimize, exp,log,sqrt from scipy.stats import norm
この式とオプションの市場価格から、ボラティリティを逆算する。
def BS_Call(S0, sigma ,r,q,T,K): d1 = (log(S0 / K) + (r-q + sigma**2 / 2) * T) / (sigma * sqrt(T)) d2 = d1 - sigma * sqrt(T) BS_Call = S0 * exp(-q * T)* norm.cdf(x=d1, loc=0, scale=1) \ - K * exp(-r * T) * norm.cdf(x=d2, loc=0, scale=1) return BS_Call
最後に方程式を組み立てる。
ブラック・ショールズ式とオプション市場価格\( \bar{C}_M\)の差を\( h(\sigma)\)とおき、これが\( 0\)に等しいという方程式を解くことになる。
def h(sigma): h=BS_Call(S0, sigma ,r,q,T,K)-C_M return h
必要なインプットを用意する。
逆算して求める\( \sigma\)は定義せず、オプションの市場価格\( \bar{C}_M=20\)を与えておく。
逆算して求める\( \sigma\)は定義せず、オプションの市場価格\( \bar{C}_M=20\)を与えておく。
S0=100 r=0.05 q=0.0 T=1 K=100 C_M=20
optimize
モジュールのfsolve
関数を用いると、与えた関数が\( 0\)になるような変数の値を求めることが出来る。fsolve
関数の第二引数は、解の探索の開始値であり、解に近い数値を予想し入力しておく。IV=optimize.fsolve(h,0.2) #解の探索開始値をsigma=20%に設定 >>> IV array([ 0.45234036])
\( \sigma^*=0.45234036\)というインプライド・ボラティリティが求まった。
確認のため、これをブラック・ショールズ式に代入して、オプション市場価格\( \bar{C}_M=20\)に一致するか確かめる。
確認のため、これをブラック・ショールズ式に代入して、オプション市場価格\( \bar{C}_M=20\)に一致するか確かめる。
>>> BS_Call(S0, IV ,r,q,T,K) array([ 20.])\( \bar{C}_M=20\)に一致していることが確認できた。
まとめ
本記事ではインプライド・ボラティリティの定義を述べ、Pythonによる計算方法を示した。
インプライド・ボラティリティを求めることは、モデルから定まるオプション価格式とオプション市場価格からなる方程式を解くことに他ならない。
その方法はニュートン法や二分法などがあるが、本記事ではPythonのSciPy.Optimizeモジュールを用いた。
インプライド・ボラティリティを求めることは、モデルから定まるオプション価格式とオプション市場価格からなる方程式を解くことに他ならない。
その方法はニュートン法や二分法などがあるが、本記事ではPythonのSciPy.Optimizeモジュールを用いた。
0 件のコメント :
コメントを投稿