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

本記事の目的と対象

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

対象者は以下の条件を満たす読者である。
  • オプションとはなにかを知っている人
  • Pythonを使う環境が整っている人(環境設定の方法はこちら
  • Pythonを使ってオプションの価格を計算したい人
本記事で示すコードはGithubで公開されている。

MonteCarloNote/python-option-premium-BS.py

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



目次

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

ブラック・ショールズ式(以下BS式)とはヨーロピアン・オプションのプレミアム(価格)を求める公式であり、 F. ブラックとM. ショールズの1973年の論文[1]で発表された。

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

原資産が配当を生む場合のBS式を修正BS式といい、コール・オプションの価格\( C\)とプット・オプションの価格\( P\)は、以下の公式で与えられる[2]。
\[ \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)T}{\sigma \sqrt{T}}+\frac{1}{2}\sigma\sqrt{T}\\ d_2&=\frac{log(S_0/K)+(r-q)T}{\sigma \sqrt{T}}-\frac{1}{2}\sigma\sqrt{T} \end{split} \]である。

以下では修正BS式をPythonで記述する方法を示す。


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

修正BS式をPythonで表現するためには、いくつかのモジュールをインポートする必要があるが、基本的には上記の数式を素直にコーディングすればよい。

BS_Callがコールオプションの式、BS_Putがプットオプションの式を示している。

#修正BS式

#正規分布の確率分布関数をインポート
from scipy.stats import norm
#指数関数、対数関数、二乗根関数をインポート
from math import exp,log,sqrt

#コール・オプションの価格関数を定義
def BS_Call(S0, sigma ,r,q,T,K):
    d1 = (log(S0 / K) + (r - q ) * T) / (sigma * sqrt(T))+sigma*sqrt(T)/ 2
    d2 = (log(S0 / K) + (r - q ) * T) / (sigma * sqrt(T))-sigma*sqrt(T)/ 2
    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

#プット・オプションの価格関数を定義
def BS_Put(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_Put = K * exp(-r * T) * norm.cdf(x=-d2, loc=0, scale=1)\
    -S0 * exp(-q * T) * norm.cdf(x=-d1, loc=0, scale=1)
    return BS_Put

計算結果

以下のインプットで計算する。
S0=100
sigma=30/100
r=5/100
q=0/100
T=1
K=100


計算結果は以下の通り。
>>>BS_Call(S0, sigma ,r,q,T,K)
14.231254785985819
>>>BS_Put(S0, sigma ,r,q,T,K)
9.3541972360572316


検算(WolframAlphaとプット・コール・パリティ)

  1. Wolfram alpha[3]で計算

  2. WolframAlphaというオンラインの数値計算エンジンを使う。

    option pricingで検索をして、前述のインプットデータを入力し、計算する。
    以下は計算結果のとおりであり、Pythonでの計算と一致している。

  3. Put Call Parity(プット・コール・パリティ)による確認

  4. コールオプション価格\( C\)、プットオプション価格\( P\)、原資産価格\( S_0\)、および権利行使価格\( K\)の間には、以下の関係(プット・コール・パリティ)が成り立つ。
    \[ \begin{split} C+Ke^{-rT}=P+Se^{-qT}\end{split} \]
    左辺と右辺の差を計算して確かめると、ほぼ\( 0\)であることがわかる。
    >>>BS_Call(S0, sigma ,r,q,T,K)+K*exp(-r*T)\
        -BS_Put(S0, sigma ,r,q,T,K)-S0*exp(-q*T)
    -1.4210854715202004e-14
    

まとめ

本記事では、BS式をPythonで実装する際の実際のソースコード例を提供し、インプットデータを与え実際に価格の計算を行った。その結果は、外部の計算エンジンWolframAlphaの結果に一致し、またブラック・ショールズモデルが満たすべき性質であるプット・コール・パリティが成立することを確かめた。

ブラック・ショールズモデルはオプション価格計算の基礎的なモデルであり、
より発展的内容へと進む最初の一歩である。

参考文献

[1]Black, Fischer; Scholes, Myron (1973), “The Pricing of Options and Corporate Liabilities”, Journal of Political Economy 81 (3): 637-654,
[2]ジョン ハル (2016), フィナンシャルエンジニアリング〔第9版〕 ―デリバティブ取引とリスク管理の総体系, きんざい
[3]WolframAlpha