技術メモ

役に立てる技術的な何か、時々自分用の覚書。幅広く色々なことに興味があります。

ブラックショールズモデルを解説してみる(ブラックモデル編)

前回は株価モデルを中心に、株価の値動きの前提になっている条件からそれをシミュレーションに落とし込むまでの流れを解説した。
今回は前回の株価モデルの話をもとにしてブラック・ショールズ方程式の概念的な解説をしていく。
まずそもそもブラック・ショールズ方程式というのは何を求めるためのものなのかを解説した後、
数式で言われている結果がシミュレーションの結果と相違ないことを確認していく。

↓前回の記事
swdrsker.hatenablog.com

ブラックショールズ方程式は何を求めるものなのか?

ブラックショールズ方程式は何を求めているのかを説明する前にまずオプション取引について紹介しなければいけない。

オプション取引とは

オプション取引とは「T年後にK円で買う権利」や「T年後にK円で売る権利」を売り買いすること。
(売買の対象は株・通貨・国債金利などさまざま。)
例えば、

2年後にドルを1ドル140円で10万ドル買う権利をあげますよ

というのがオプションだ
2年後に今のように1ドル145円になっていればその時点では50万円分の価値があることになる。
逆に再びリーマンショックが起こって1ドル80円になってたとしても、権利を行使せずに買わなければ良いだけなのでその時点での価値は0円ということだ。

T時点での1ドル価格を S_Tして数式で表すと
\displaystyle 
V_T = \mathrm{max}(S_T - K, 0)
T時点の価格より行使価格が高ければその差額だけ儲かることになるし、T時点の価格が行使価格を下回れば権利を手放すので価値はゼロになる。

T時点のことを「満期日」あるいは「権利行使日」、K円のことを「行使価格」と呼ぶ。
また買う権利のことを「コールオプション」と呼び、売る権利のことを「プットオプション」と呼ぶ。
ここではわかりやすいようにコールオプションを前提として説明する。

オプション取引の価格は?

ここで問題になるのがこの取引の値段だ。
オプションの値段*1がいくらなら買う側も売る側も納得できるか?
これを理論的に導いたのがブラックショールズ方程式ということである。

もう少し詳しく

ブラックショールズ方程式のエッセンスを簡単に紹介する。

T年後に株をK円で買う権利

というコールオプションを考えよう。
現時点から見た権利行使日における株価の値段xの確率分布をf(x)とすると
権利行使日時点の価値はこのように表せる。
\displaystyle
\int^{\infty}_{0}\mathrm{max}(x - K, 0)f(x)dx = \int^{\infty}_{K}(x - K)f(x)dx
これを現時点での価値で表す。
株価モデル編で説明したように、資産は持っているだけで利息が付くもので、これをリスクフリーレートと呼んだ。
オプションの価値もそれと同じようにリスクフリーレートで利息が付く。
権利行使日時点のオプション価値は利息が付いた後の価格と考えられるので、現時点の価値を考えるにはその分だけ割り引く必要がある。
前回の最後に解説した連続金利の考え方を用いると、
現時点でV_0円の価値のあるものはT年後には e^{rT}V_0 円の価値になる。
裏を返せばT年後にV_T円の価値があるものは現時点では e^{-rT}V_T 円の価値ということである。
オプションの価格も同様に、現時点での価値は
\displaystyle
e^{-rT}\int^{\infty}_{K}(x - K)f(x)dx
となる。
f(x)は不明であるが、ここで示したようなオプションの現在価値を株価モデルの仮定のもとに理論的に計算したのがブラック・ショールズ方程式になる。

シミュレーションによる確認

それではここまでの話をシミュレーションで確認してみる。
株価モデルについては前回のものを用いる。

↓前回の株価モデルのコード

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import seaborn
seaborn.set_style("whitegrid")

size_t = 1200 #1200日
dw = np.random.randn(size_t)
price = np.zeros(size_t)
rf_rate = 0.01 #リスクフリーレート(年利1%)
sigma = 0.12 #ボラティリティ(12%)
price[0] = 100 #初期値
for i in range(1, size_t):
    price[i] = price[i-1] * (1 + rf_rate / 360 + sigma * dw[i] / np.sqrt(360)) 

plt.plot(price)
plt.show()


方針

ここで

今100円の株を3年後1株100円で買う権利の値段

を考える。

最終的な株価S_Tがわかっている時、
そのオプションの価値V_T
\displaystyle 
V_T = \mathrm{max}(S_T - K, 0)
であった。
これを現在価値PVに戻すと
\displaystyle 
PV = e^{-rT}\mathrm{max}(S_T - K, 0)
となる。
シミュレーションを繰り返し、このPVの平均を取ることでオプションの現在価値を割り出してみる。

実装

では早速実装してみる。

import math
import numpy as np
import matplotlib.pyplot as plt
from statistics import mean
import seaborn
seaborn.set_style("whitegrid")

# リスクフリーレート
rf_rate = 0.01
# ボラティリティ
sigma = 0.12
# 初期株価
init_price = 100
# 権利行使価格
strike_price = 100
# 満期日
maturity_duration = 365 * 3

# 株価モデルのパス生成
def generate_path(days, rf_rate, sigma, init_price):
    size_t = days
    dw = np.random.randn(size_t)
    price = np.zeros(size_t)
    price[0] = init_price
    for i in range(1, size_t):
        price[i] = price[i-1] * (1 + rf_rate / 365 + sigma * dw[i] / np.sqrt(365)) 
    return price

# 現在価値の計算
def present_value(final_price, days, rf_rate):
    return np.exp(-rf_rate * days/365) * max(final_price - strike_price, 0)

N = 3000 # シミュレーション回数
x = range(0, N, 10)
y = []
result = []
for i in range(N):
    final_price = generate_path(maturity_duration, rf_rate, sigma, init_price)[-1]
    pv = present_value(final_price, maturity_duration, rf_rate)
    result.append(pv)
    if i % 10 == 0:
        y.append(mean(result))
print(f"present value: {y[-1]}")        
plt.xlabel("Simulation Num")
plt.ylabel("Present Value of Call Option")
plt.plot(x,y)
plt.show()

実行結果

present value: 9.683538793313692

3000回のシミュレーションではオプションの現在価値は9.68円となった。

検証

それでは、実際のブラック・ショールズ方程式の解析解で検証してみる。
解説しだすと長ったらしくなるのであえて解説はしないが、
ブラックモデルの解析解は以下のようになる。
swdrsker.hatenablog.com

import numpy as np
from scipy import stats
def bs_model(S,x,r,sigma,T):
    d1 = (np.log(S/x) + (r + 0.5 * sigma ** 2)*T)/(sigma*pow(T, 1/2))
    d2 = (np.log(S/x) + (r - 0.5 * sigma ** 2)*T)/(sigma*pow(T, 1/2))
    call = S * stats.norm.cdf(d1) - x * np.exp(-r*T) * stats.norm.cdf(d2)
    return call

print(bs_model(100, 100, 0.01, 0.12, 3))

実行結果

9.716855499608009

シミュレーションの結果と概ね一致している事が検証できた。

まとめ

ここではブラック・ショールズ方程式が何をしたいのか。なにを目指した方程式なのかという解説をした。
一言で言えば「オプションのプライシング」ということになるが、
それが具体的にどういうことなのかをシミュレーションで実験し検証した。


suzuri.jp

*1:オプションプレミアムという