Mímisbrunnr知恵の泉

← 金融工学 一覧

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

📎 前提:ブラックショールズ公式と解釈グリークス(ベガ) | 関連:ブラウン運動と幾何ブラウン運動(GBMの仮定)

要点(BLUF)

1. インプライドボラティリティとは

BS 公式の入力 S0,K,r,TS_0, K, r, T は観測できますが、σ\sigma(満期までの将来ボラ)だけは観測できません。発想を逆転させます——市場が付けたオプション価格を「正しい」とみなし、その価格を再現する σ\sigma を逆算する。これがインプライドボラティリティです。

CBS(σIV)=C市場を満たす σIV を求めるC_{\text{BS}}(\sigma_{\text{IV}}) = C_{\text{市場}} \quad\text{を満たす}\ \sigma_{\text{IV}}\ \text{を求める}

過去の値動きから測る実現ボラ(幾何ブラウン運動による資産価格モデル のキャリブレーション)が「振り返り」なのに対し、IV は市場の将来予想。オプション市場は「ボラの市場」とも呼ばれ、トレーダーは価格ではなく IV で会話します。

2. 逆算:価格からボラへ

グリークス のベガが常に正、つまり BS 価格は σ\sigma について単調増加なので、解はちょうど1つ。区間を挟む brentq で確実に求まります。

import numpy as np
from scipy.stats import norm
from scipy.optimize import brentq

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

S0, K, r, T = 100.0, 100.0, 0.05, 1.0
market_price = 10.4506

# BS価格はσの単調増加 → brentq で一意に逆算
iv = brentq(lambda s: bs_call(S0, K, r, s, T) - market_price, 1e-6, 5.0)
print(f"市場価格 {market_price} → インプライドボラ = {iv:.4f}")

出力:

市場価格 10.4506 → インプライドボラ = 0.2000

出力の意味:価格 10.4506 から逆算した IV は 0.2000——ブラックショールズ公式と解釈 でこの価格を生んだボラ 0.20 がぴたり復元されます。順方向(ボラ→価格)と逆方向(価格→ボラ)が表裏一体なのです。実務ではこの逆算を全銘柄・全行使価格・全満期に対して行い、市場のボラ観をマップ化します。

3. ボラティリティ・スマイル

BS が完全に正しければ、同じ原資産・満期ならどの行使価格でも IV は同じ(ボラ一定)はずです。ところが実際の市場では、行使価格ごとに IV が変わります。ATM から離れる(深い ITM/OTM)ほど IV が高くなる U 字をボラティリティ・スマイル、株式で典型的な「下方ほど高い」非対称をスキューと呼びます。市場がスマイル状に価格を付けている状況を作り、各行使価格から IV を逆算して可視化します。

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

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

S0, r, T = 100.0, 0.05, 1.0
strikes = np.array([80, 90, 100, 110, 120])

# 市場が下に凸のIVを付けている状況を作る(説明用の合成)
true_iv = 0.20 + 0.0010*(strikes - 100)**2/10
mkt_prices = np.array([bs_call(S0, k, r, v, T) for k, v in zip(strikes, true_iv)])

# 各行使価格の市場価格からIVを逆算
recovered = np.array([brentq(lambda s, k=k, p=p: bs_call(S0, k, r, s, T) - p, 1e-6, 5.0)
                      for k, p in zip(strikes, mkt_prices)])
print("行使価格   :", strikes)
print("市場IV(設定):", np.round(true_iv, 4))
print("逆算したIV :", np.round(recovered, 4))

plt.figure(figsize=(7, 4))
plt.plot(strikes, recovered*100, "o-", lw=2, label="インプライドボラ")
plt.axhline(20, color="gray", ls=":", label="BSの仮定(ボラ一定 20%)")
plt.xlabel("行使価格 K"); plt.ylabel("インプライドボラ (%)")
plt.title("ボラティリティ・スマイル")
plt.legend(); plt.grid(alpha=0.3); plt.tight_layout(); plt.show()

出力:

行使価格   : [ 80  90 100 110 120]
市場IV(設定): [0.24 0.21 0.2  0.21 0.24]
逆算したIV : [0.24 0.21 0.2  0.21 0.24]

出力の意味:ATM(K=100K=100)の IV が 20% で最も低く、両側に離れるほど 24% まで上がる——逆算で設定どおりのスマイルが復元されました。もし BS が完璧なら、この線は灰色の点線(一定 20%)に重なるはず。スマイルがあるという事実そのものが、BS の「ボラ一定・対数正規」が現実と合っていない証拠です。市場は、極端な値動き(テールイベント)を BS の正規分布より高く見積もり、OTM オプションに割増の値段を付けています。

4. スマイルが意味すること

スマイルは、リターンが BS の仮定する正規分布より裾が厚く・非対称だという市場の認識を映します。

それでも BS と IV は共通言語として使われ続けます。市場価格を IV に翻訳して比較し、スマイルからのズレで割安・割高を判断する——BS は「間違っているが有用」なモデルの典型です。

⚠️ よくある誤解

関連ノート