Pythonでインプライド・ボラティリティの計算方法

本記事の目的と対象

本記事の目的は、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^*\)が、インプライド・ボラティリティである。



オプションの市場価格は、一つの行使価格に対して一つの値で取引されているため、インプライド・ボラティリティは設定された行使価格の数だけ計算することが出来る。

インプライド・ボラティリティの計算コード例

等式\( C(\sigma)=\bar{C}_M\)の解\( \sigma^*\)はよく知られた関数の組み合わせで表現することは出来ない。

そこで、この方程式を解くためには、数値解法を用いる必要がある。

方程式を解く方法(求根アルゴリズム)には、ニュートン法や二分法が知られている。

本記事では、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\)を与えておく。
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\)に一致するか確かめる。
>>> BS_Call(S0, IV ,r,q,T,K)
array([ 20.])
\( \bar{C}_M=20\)に一致していることが確認できた。

まとめ

本記事ではインプライド・ボラティリティの定義を述べ、Pythonによる計算方法を示した。

インプライド・ボラティリティを求めることは、モデルから定まるオプション価格式とオプション市場価格からなる方程式を解くことに他ならない。

その方法はニュートン法や二分法などがあるが、本記事ではPythonのSciPy.Optimizeモジュールを用いた。