🎓 レベル:標準 | 重要度:A(必須)
📎 前提:BS方程式の導出 | 数理:正規分布(標準正規・標準化)(統計)・関連:プットコールパリティ
要点(BLUF)
- ブラック–ショールズ方程式を満期ペイオフのもとで解くと閉形式が出ます。コールは 、プットはパリティから。
- はリスク中立世界で満期に ITM になる確率 、 はデルタ(株価感応度)。 はこの2つを決める標準化得点です。
- 価格はリスク中立期待値 に等しい。だから閉形式・モンテカルロ・二項木はすべて同じ値を返します。
1. ブラック–ショールズ公式
配当のないヨーロピアン・オプションについて、BS 方程式の解は次の閉形式です。
ここで は標準正規分布の累積分布関数(正規分布(標準正規・標準化)(統計))。入力は5つ——現在株価 、行使価格 、金利 、ボラティリティ 、満期 。期待リターン は入りません(BS方程式の導出)。
2. d1・d2・N(d) の解釈
公式の各部分には明確な意味があります。
- :リスク中立測度のもとで、満期にオプションが行使される確率 。GBM では が正規分布なので、 となる確率がちょうど になります。
- :コールのデルタ 。株価が1動いたときオプション価格がどれだけ動くか(グリークス)。〜 の値を取り、深い ITM で1に近づきます。
- 公式全体は「行使したとき手に入る株の現在価値()から、払う行使価格の現在価値()を引いたもの」と読めます。
第2項の は「確率 で を払う」現在価値、第1項は「その状態で受け取る株」の現在価値です。
3. リスク中立期待値としての価格
二項モデルとリスク中立評価 の精神どおり、BS 価格はリスク中立期待値に等しくなります。
ドリフトが ではなく になっているのがリスク中立の証。これをモンテカルロで計算し、閉形式と一致するか確かめます。
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. 価格はボラティリティとともに上がる
オプション価格はボラティリティ の増加関数です。ボラが高いほど「大きく 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 とほぼ比例して増えます。オプションはボラティリティの「商品」——買い手は変動の大きさに賭け、売り手は静けさに賭けます。図では価格曲線(なめらか)が満期ペイオフ(折れ線)の上にあり、その差が時間価値。満期に近づくほど、また満期から遠い株価ほど、時間価値は薄くなります。この への感応度(ベガ)と、価格・ペイオフの差を生む曲がり(ガンマ)が、次の グリークス の主題です。
⚠️ よくある誤解
- 「 は現実に行使される確率」ではない: はリスク中立確率 での ITM 確率で、実世界の確率 ではありません。実世界では が効くので別の値になります。価格づけ用の確率と現実の確率は別物(二項モデルとリスク中立評価)。
- 公式は配当なし・ヨーロピアンが前提:配当 があれば と置き換えます。アメリカン型(早期行使)は閉形式が無く、二項木や有限差分(第6章)で解きます。
- は将来のボラ:公式に入れるのは満期までの将来ボラで、過去の実現ボラとは限りません。市場が織り込む将来ボラを逆算したのがインプライドボラ(インプライドボラティリティ)です。
関連ノート
- 第5章 ブラック–ショールズ 目次
- BS方程式の導出 — 前提:この公式が解く方程式
- グリークス — 次のトピック:価格の感応度
- プットコールパリティ — コールとプットを結ぶ関係
- モンテカルロ法によるオプション価格 — 同じリスク中立期待値を数値で
- 金融工学テキスト 全体目次