次回より『ヒデログ』とご検索ください

【Python/VBAソースコード】ブラックショールズモデルのオプション価格

blackscholes

ブラックショールズモデルのPythonとExcel VBAでの算出コード(計算方法)を紹介します。そのままコピペで使えるので見て行ってください。

ブラックショールズモデルに必要なもの

使いやすいように先物ベースで計算します。理由は後述します。

必要なデータ

  • 先物価格
  • 権利行使価格
  • ボラティリティ
  • 満期までの期間
  • 金利

事前にこれらのデータが必要になります。

オプション価格計算のソースコード

変数定義

  • X:権利行使価格
  • sigma:ボラティリティ
  • T:満期までの期間
    1=1年で計算、満期まで3日なら3/365(日数ベース) or 3/250(営業日ベース)
  • r:金利、現状0でもよい

Python

from math import sqrt,exp,log
# 累積分布関数
from scipy.stats import norm 

# コールオプション
def call_option(F,X,sigma,T,r):
    d1=(log(F/X)+(sigma**2/2)*T)/(sigma*sqrt(T))
    d2=d1-sigma*sqrt(T)
    
    FNd1=F*norm.cdf(d1)
    XNd2=X*norm.cdf(d2)
    
    return exp(-r*T)*(FNd1-XNd2)
# プットオプション    
def put_option(F,X,sigma,T,r):
    d1=(log(F/X)+(sigma**2/2)*T)/(sigma*sqrt(T))
    d2=d1-sigma*sqrt(T)
    
    FNd1=F*norm.cdf(-d1)
    XNd2=X*norm.cdf(-d2)

    return exp(-r*T)*(XNd2-FNd1) 

VBA

'F:先物価格、円単位なのでlong
'コールオプション
Function call_option(F As Long, X As Long, sigma As Double, T As Double, r As Double) As Double

    Dim d1 As Double
    Dim d2 As Double
    d1 = (Log(F / X) + (sigma ^ 2 / 2) * T) / (sigma * Sqr(T))
    d2 = d1 - sigma * Sqr(T)
    
    Dim FNd1 As Double
    Dim XNd2 As Double
    FNd1 = F * Application.WorksheetFunction.NormSDist(d1)
    XNd2 = X * Application.WorksheetFunction.NormSDist(d2)

    call_option = Exp(-r * T) * (FNd1 - XNd2)

End Function

'プットオプション
Function put_option(F As Long, X As Long, sigma As Double, T As Double, r As Double) As Double

    Dim d1 As Double
    Dim d2 As Double
    d1 = (Log(F / X) + (sigma ^ 2 / 2) * T) / (sigma * Sqr(T))
    d2 = d1 - sigma * Sqr(T)
    
    Dim FNd1 As Double
    Dim XNd2 As Double
    FNd1 = F * Application.WorksheetFunction.NormSDist(-d1)
    XNd2 = X * Application.WorksheetFunction.NormSDist(-d2)

    put_option = Exp(-r * T) * (XNd2 - FNd1)
   
End Function

ブラックショールズの公式

上記、VBAのソースコードの元となる「先物」に対するオプション価格を算出するブラックショールズの公式(正確にはブラックモデル又はブラック76と言います)です。

ブラックショールズモデルの公式は、いろいろなパターンがあり、現物に対するものが一般的にネット等になっているので間違いで自分が何を原資産にしているか考えて使用しましょう。

ブラックモデルの公式

$$c=e^{-rT}[FN(d_1)-XN(d_2)]$$$$p=e^{-rT}[XN(-d_2)-FN(-d_1)]$$$$N()は累積分布関数の値$$
ただし、$$d_1=\frac{\ln{(F/X)}+({\sigma}^2/2)T}{\sigma\sqrt{T}}$$$$d_2=\frac{\ln{(F/X)}-({\sigma}^2/2)T}{\sigma\sqrt{T}}=d_1-\sigma\sqrt{T}$$

なぜ先物から算出したの?

今回は先物から算出する方法を紹介しました。

なぜ、先物を原資産にしたブラックショールズを使用したかというと、現実世界で考えれば、日経225オプションを取引している人がこのページを見てると思いまして、実践的な方法で紹介しました。

なぜなら、日経平均株価から計算もできますが、日経平均株価から計算ですと、配当率を計算しなければならず複雑になるからです。先物なら同じ満期日の先物は必ずある(ウィークリーオプションは別)のでこちらの方が使いやすいです。

他のンブラックショールズモデルの公式

数式だけですが、他のブラックショールズモデルの公式を紹介します。

配当なしの株を原資産にする

$$c=SN(d_1)-Xe^{-rT}N(d_2)$$$$p=Xe^{-rT}N(-d_2)-SN(-d_1)$$
ただし、
$$d_1=\frac{\ln{(S/X)}+({r+\sigma}^2/2)T}{\sigma\sqrt{T}}$$$$d_2=\frac{\ln{(S/X)}-({r-\sigma}^2/2)T}{\sigma\sqrt{T}}=d_1-\sigma\sqrt{T}$$

配当ありの株を原資産にする

$$c=Se^{-qT}N(d_1)-Xe^{-rT}N(d_2)$$$$p=Xe^{-rT}N(-d_2)-Se^{-qT}N(-d_1)$$
ただし、
$$d_1=\frac{\ln{(S/X)}+({r-q+\sigma}^2/2)T}{\sigma\sqrt{T}}$$$$d_2=\frac{\ln{(S/X)}-({r-q-\sigma}^2/2)T}{\sigma\sqrt{T}}=d_1-\sigma\sqrt{T}$$$$q:配当率$$

まとめ

ブラックショールズのPythonとVBAでの計算式を紹介しました。コピペで使えるので使ってみてください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です