🎓 レベル:標準 | 重要度:A(必須)
📎 前提:ブラックショールズ公式と解釈・グリークス(ベガ) | 関連:ブラウン運動と幾何ブラウン運動(GBMの仮定)
要点(BLUF)
- インプライドボラティリティ(IV)は、市場のオプション価格をブラック–ショールズ公式に逆算して得る 。市場が織り込む将来ボラそのものです。
- BS 価格はボラの単調増加関数(ベガ )なので、価格から を一意に逆算できます(
scipy.optimize.brentq)。 - 現実には IV が行使価格や満期で変わります(ボラティリティ・スマイル/スキュー)。これは BS の「ボラ一定」仮定が破れている——リターンが正規でない(テールが厚い)——証拠です。
1. インプライドボラティリティとは
BS 公式の入力 は観測できますが、(満期までの将来ボラ)だけは観測できません。発想を逆転させます——市場が付けたオプション価格を「正しい」とみなし、その価格を再現する を逆算する。これがインプライドボラティリティです。
過去の値動きから測る実現ボラ(幾何ブラウン運動による資産価格モデル のキャリブレーション)が「振り返り」なのに対し、IV は市場の将来予想。オプション市場は「ボラの市場」とも呼ばれ、トレーダーは価格ではなく IV で会話します。
2. 逆算:価格からボラへ
グリークス のベガが常に正、つまり BS 価格は について単調増加なので、解はちょうど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()の IV が 20% で最も低く、両側に離れるほど 24% まで上がる——逆算で設定どおりのスマイルが復元されました。もし BS が完璧なら、この線は灰色の点線(一定 20%)に重なるはず。スマイルがあるという事実そのものが、BS の「ボラ一定・対数正規」が現実と合っていない証拠です。市場は、極端な値動き(テールイベント)を BS の正規分布より高く見積もり、OTM オプションに割増の値段を付けています。
4. スマイルが意味すること
スマイルは、リターンが BS の仮定する正規分布より裾が厚く・非対称だという市場の認識を映します。
- テールの厚さ:暴落・暴騰が正規分布の予想より頻繁。OTM プット(暴落保険)が割高になり、スキューを生みます。
- モデルの限界:単一の で全行使価格を説明できない以上、BS は出発点であって終着点ではありません。
- 拡張モデル:ボラ自体を確率過程にする確率ボラティリティ(Heston)、急変を入れるジャンプ拡散などがスマイルを再現します(第9章・要最新確認)。
それでも BS と IV は共通言語として使われ続けます。市場価格を IV に翻訳して比較し、スマイルからのズレで割安・割高を判断する——BS は「間違っているが有用」なモデルの典型です。
⚠️ よくある誤解
- 「IV は将来ボラの正しい予測」ではない:IV は市場の織り込みで、リスクプレミアムや需給も混じります。実現ボラより系統的に高め(ボラ・リスクプレミアム)になることが知られています(要最新確認)。
- 「スマイルは BS が間違っている証拠」だが BS を捨てる理由ではない:BS は価格を IV という1次元に圧縮する変換器として有用です。スマイルは「その変換の歪み」を見る道具になります。
- 逆算には価格の無裁定範囲が要る:市場価格が本質価値を下回るなど無裁定を破る入力だと、IV は存在しません(
brentqが根を挟めず失敗)。データのクレンジングが前提です。
関連ノート
- 第5章 ブラック–ショールズ 目次
- ブラックショールズ公式と解釈 — 前提:順方向の価格づけ
- グリークス — ベガ(逆算が一意になる根拠)
- ブラウン運動と幾何ブラウン運動 — スマイルが破る「対数正規」の仮定
- 金融工学テキスト 全体目次 — 第6章 数値計算へ続く