Mímisbrunnr知恵の泉

← 金融工学 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:BS方程式の導出 | 数理:正規分布(標準正規・標準化)(統計)・関連:プットコールパリティ

要点(BLUF)

1. ブラック–ショールズ公式

配当のないヨーロピアン・オプションについて、BS 方程式の解は次の閉形式です。

C=S0N(d1)KerTN(d2),P=KerTN(d2)S0N(d1)C = S_0\,N(d_1) - K e^{-rT}\,N(d_2), \qquad P = K e^{-rT}\,N(-d_2) - S_0\,N(-d_1) d1=ln(S0/K)+(r+12σ2)TσT,d2=d1σTd_1 = \frac{\ln(S_0/K) + (r + \tfrac12\sigma^2)T}{\sigma\sqrt{T}}, \qquad d_2 = d_1 - \sigma\sqrt{T}

ここで N()N(\cdot) は標準正規分布の累積分布関数(正規分布(標準正規・標準化)(統計))。入力は5つ——現在株価 S0S_0、行使価格 KK、金利 rr、ボラティリティ σ\sigma、満期 TT期待リターン μ\mu は入りませんBS方程式の導出)。

2. d1・d2・N(d) の解釈

公式の各部分には明確な意味があります。

第2項の KerTN(d2)K e^{-rT}N(d_2) は「確率 N(d2)N(d_2)KK を払う」現在価値、第1項は「その状態で受け取る株」の現在価値です。

3. リスク中立期待値としての価格

二項モデルとリスク中立評価 の精神どおり、BS 価格はリスク中立期待値に等しくなります。

C=erTEQ ⁣[max(STK, 0)],ST=S0exp ⁣((r12σ2)T+σTZ), ZN(0,1)C = e^{-rT}\,\mathbb{E}_Q\!\left[\max(S_T - K,\ 0)\right], \qquad S_T = S_0\exp\!\left((r-\tfrac12\sigma^2)T + \sigma\sqrt{T}\,Z\right),\ Z\sim\mathcal N(0,1)

ドリフトが μ\mu ではなく rr になっているのがリスク中立の証。これをモンテカルロで計算し、閉形式と一致するか確かめます。

import numpy as np
from scipy.stats import norm

def bs_price(S, K, r, sigma, T, kind="call"):
    d1 = (np.log(S/K) + (r + 0.5*sigma**2)*T)/(sigma*np.sqrt(T))
    d2 = d1 - sigma*np.sqrt(T)
    if kind == "call":
        return S*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2)
    return K*np.exp(-r*T)*norm.cdf(-d2) - S*norm.cdf(-d1)

S0, K, r, sigma, T = 100.0, 100.0, 0.05, 0.2, 1.0
print(f"BS公式 コール = {bs_price(S0, K, r, sigma, T):.4f}")
print(f"BS公式 プット = {bs_price(S0, K, r, sigma, T, 'put'):.4f}")

# リスク中立モンテカルロ:ドリフトを r にした GBM で満期ペイオフを平均
rng = np.random.default_rng(1)
M = 2000000
Z = rng.normal(size=M)
ST = S0*np.exp((r - 0.5*sigma**2)*T + sigma*np.sqrt(T)*Z)
mc_call = np.exp(-r*T)*np.maximum(ST - K, 0).mean()
print(f"リスク中立MC コール = {mc_call:.4f}")

出力:

BS公式 コール = 10.4506
BS公式 プット = 5.5735
リスク中立MC コール = 10.4475

出力の意味:閉形式のコール 10.4506 と、200万本のリスク中立モンテカルロ 10.4475 が小数2桁まで一致します(残差はサンプリング誤差)。公式は「リスク中立世界で満期ペイオフを平均して割り引く」操作の解析解にすぎません。だからこそ、解析解が無い複雑なオプションでもモンテカルロ(第6章 モンテカルロ法によるオプション価格)で同じ枠組みのまま価格づけできます。プット 5.5735 は プットコールパリティ とも整合します。

4. 価格はボラティリティとともに上がる

オプション価格はボラティリティ σ\sigma の増加関数です。ボラが高いほど「大きく ITM になる」可能性が増え、下振れは行使しなければよい(損失限定)ので、期待ペイオフが増えるからです。

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from scipy.stats import norm

def bs_price(S, K, r, sigma, T, kind="call"):
    d1 = (np.log(S/K) + (r + 0.5*sigma**2)*T)/(sigma*np.sqrt(T))
    d2 = d1 - sigma*np.sqrt(T)
    if kind == "call":
        return S*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2)
    return K*np.exp(-r*T)*norm.cdf(-d2) - S*norm.cdf(-d1)

# ボラを変えたときのコール価格(ATM)
for sig in [0.1, 0.2, 0.3, 0.4]:
    print(f"σ={sig}: コール = {bs_price(100, 100, 0.05, sig, 1.0):.4f}")

# 価格曲線と満期ペイオフ(時間価値=両者の差)
K, r, sigma, T = 100.0, 0.05, 0.2, 1.0
S = np.linspace(60, 140, 200)
plt.figure(figsize=(7, 5))
plt.plot(S, bs_price(S, K, r, sigma, T), lw=2, label="コール価格 C(S)")
plt.plot(S, np.maximum(S - K, 0), "k--", lw=1.5, label="満期ペイオフ max(S-K,0)")
plt.xlabel("現在の株価 S"); plt.ylabel("コール価格")
plt.title("ブラック–ショールズのコール価格と満期ペイオフ")
plt.legend(); plt.grid(alpha=0.3); plt.tight_layout(); plt.show()

出力:

σ=0.1: コール = 6.8050
σ=0.2: コール = 10.4506
σ=0.3: コール = 14.2313
σ=0.4: コール = 18.0230

出力の意味:ボラが 0.1→0.4 と上がると、ATM コール価格は 6.81→18.02 とほぼ比例して増えます。オプションはボラティリティの「商品」——買い手は変動の大きさに賭け、売り手は静けさに賭けます。図では価格曲線(なめらか)が満期ペイオフ(折れ線)の上にあり、その差が時間価値。満期に近づくほど、また満期から遠い株価ほど、時間価値は薄くなります。この σ\sigma への感応度(ベガ)と、価格・ペイオフの差を生む曲がり(ガンマ)が、次の グリークス の主題です。

⚠️ よくある誤解

関連ノート