インプライド・ボラティリティの計算方法
インプライド・ボラティリティに閉形式の解がない理由と、オプション価格から反復計算で逆算する仕組みを説明します。Pythonコードや注意点も紹介します。
インプライド・ボラティリティは、公式ではなく反復計算で求める。オプションの市場価格からボラティリティの数値を直接導く閉形式の式はない。そのためソルバーは、まずボラティリティを仮定し、Black-Scholesモデルでオプション価格を算出する。次に、そのモデル価格を市場価格と比較し、両者が1セント単位で一致するまで計算を繰り返す。以下では、この方法全体を説明する。価格計算関数、標準ライブラリだけを使ったPythonの探索ループ、そして同じ契約について二つのベンダーが異なる数値を公表する理由を取り上げる。
インプライド・ボラティリティに閉形式の公式がない理由
Black-Scholesモデルは、一方向に計算する。現在の株価、行使価格、満期までの期間、金利、ボラティリティを入力すると、理論価格が得られる。この六つの数量のうち、観測可能なのは五つだ。ボラティリティは観測できない。現在から満期までに株価がどれだけ動くかについての仮定だからだ。
トレーダーはこの問題を逆算する。価格は画面に表示され、ボラティリティが未知数になる。インプライド・ボラティリティとは、Black-Scholesモデルの価格をオプションの市場価格と一致させるボラティリティ入力値である。 ボラティリティを表すシグマは、d1とd2の双方で正規分布関数の内部に入り、しかも二度現れる。そのため、式を変形してシグマだけを取り出すことはできない。代数計算はここで行き止まりになる。以降は数値探索を使う。解釈についてはインプライド・ボラティリティが測るもので扱い、このページでは計算の仕組みを説明する。
モデルには、探索を容易にする二つの性質がある。コールのモデル価格は、例外なくボラティリティが上昇するたびに上昇し、その動きは滑らかだ。単調に上昇する数量であれば、その値を挟む範囲を狭めて解に近づけられる。
契約ごとに一度ずつソルバーを実行する
出力は銘柄ごとに一つではなく、契約ごとに一つの数値となる。同じ銘柄で同じ満期期間に属する契約でも、結果は一致しない。2026年6月30日に取引され、残存日数が20日から45日までのApple (AAPL)の全オプションを、株価に対する行使価格の比率で区分した結果は次のとおりである。
各数値の背後にある正確なSQL
WITH toFloat64(strike_price) / toFloat64(underlying_close) AS moneyness
SELECT multiIf(moneyness < 0.90, '0.80-0.90',
moneyness < 0.95, '0.90-0.95',
moneyness < 1.00, '0.95-1.00',
moneyness < 1.05, '1.00-1.05',
moneyness < 1.10, '1.05-1.10',
'1.10-1.20') AS strike_vs_spot,
round(100 * avg(toFloat64(implied_volatility)), 1) AS implied_vol_pct,
count() AS contract_count
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = toDate('2026-06-30')
AND days_to_expiry BETWEEN 20 AND 45
AND iv_converged = 1
AND volume > 0
AND moneyness BETWEEN 0.80 AND 1.20
GROUP BY strike_vs_spot
ORDER BY min(moneyness)行使価格の並びを見ると、0.80-0.90ゾーンは35.5%、0.95-1.00ゾーンは28.1%、1.10-1.20ゾーンは27.3%に収束した。同じ会社、同じ取引日でも、答えは6ある。この曲線の屈曲にはボラティリティ・スキューという名称があり、銘柄ごとに一つのボラティリティを置くだけでは表現できない。
ソルバーが一致させるBlack-Scholes価格
Sは株価、Kは行使価格、Tは満期までの期間(年)、rは無リスク金利、N()は標準正規累積分布関数を表す。これは、標準正規分布からの抽出値が指定した点を下回る確率である。Pythonではこの最後の処理をmath.erfで実行できるため、インタープリターだけで十分である。
apt-get update && apt-get install -y python3
root権限を持たないマシンでは、両方のコマンドの先頭にsudoを付ける。次の内容をiv.pyとして保存する。
import math
def norm_cdf(x):
return 0.5 * (1.0 + math.erf(x / math.sqrt(2.0)))
def bs_call(S, K, T, r, sigma):
if T <= 0.0 or sigma <= 0.0:
return max(S - K, 0.0)
d1 = (math.log(S / K) + (r + 0.5 * sigma * sigma) * T) / (sigma * math.sqrt(T))
d2 = d1 - sigma * math.sqrt(T)
return S * norm_cdf(d1) - K * math.exp(-r * T) * norm_cdf(d2)
これがフォワードモデルの全体である。ボラティリティを入力すると、価格が得られる。
インプライド・ボラティリティの計算方法を段階的に解説
最初に学ぶべき手法は二分法です。発散せず、微積分も必要ありません。
- 答えを0.01(年率1%)から5.0(500%)の範囲に挟みます。取引されるオプションはすべてこの範囲に収まります。
- この範囲の中点でオプション価格を計算します。
- モデル価格が市場の気配値を上回る場合、推定値が高すぎます。範囲の上限を中点まで下げます。下回る場合は、下限を引き上げます。
- モデル価格が気配値の1セント以内に収まったら終了します。
def implied_vol(price, S, K, T, r, lo=0.01, hi=5.0, tol=0.01):
for _ in range(100):
mid = 0.5 * (lo + hi)
diff = bs_call(S, K, T, r, mid) - price
if abs(diff) < tol:
return mid
if diff > 0.0:
hi = mid
else:
lo = mid
return 0.5 * (lo + hi)
# $100 stock, $100 strike, three months, 4% rates, $5.00 on the screen
print(round(implied_vol(5.00, 100.0, 100.0, 0.25, 0.04), 4))
python3 iv.pyを実行します。結果は約0.226となり、この仮想的な気配値に対するインプライド・ボラティリティは年率約22.6%です。反復するたびに範囲は半分になります。幅4.99の範囲を二十回半分にすると0.00001未満になるため、100回という反復上限に達することはありません。
ニュートン・ラフソン法の収束が速い理由と、破綻する場面
二分法は、モデルがすでに持っている情報を捨ててしまう。Vegaは、ボラティリティが一単位変化したときのオプション価格の変化幅であり、Black-Scholesモデルでは閉形式で求められる。ニュートン・ラフソン法はこれを傾きとして扱う。価格の誤差を測り、Vegaで割り、その分だけ推定値を動かす。
def bs_vega(S, K, T, r, sigma):
d1 = (math.log(S / K) + (r + 0.5 * sigma * sigma) * T) / (sigma * math.sqrt(T))
return S * math.sqrt(T) * math.exp(-0.5 * d1 * d1) / math.sqrt(2.0 * math.pi)
def implied_vol_newton(price, S, K, T, r, sigma=0.5):
for _ in range(20):
v = bs_vega(S, K, T, r, sigma)
if v < 1e-8:
return None # 傾きが残っていないため、二分法に戻す
step = (bs_call(S, K, T, r, sigma) - price) / v
sigma -= step
if sigma <= 0.0:
return None # ステップが大きすぎて意味のない領域に入った
if abs(step) < 1e-6:
return sigma
return None
アット・ザ・マネー付近では、二分法が十数回必要なのに対し、三回か四回の反復で収束する。問題は分母にある。行使価格が株価から離れるほど、Vegaは小さくなる。同じAAPLのコントラクトについて、各ゾーンの平均Vegaをアット・ザ・マネーの値に対する割合で示す。
各数値の背後にある正確なSQL
WITH toFloat64(strike_price) / toFloat64(underlying_close) AS moneyness,
(
SELECT avg(toFloat64(vega))
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = toDate('2026-06-30')
AND days_to_expiry BETWEEN 20 AND 45
AND iv_converged = 1
AND volume > 0
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.025
) AS atm_vega
SELECT multiIf(moneyness < 0.90, '0.80-0.90',
moneyness < 0.95, '0.90-0.95',
moneyness < 1.00, '0.95-1.00',
moneyness < 1.05, '1.00-1.05',
moneyness < 1.10, '1.05-1.10',
'1.10-1.20') AS strike_vs_spot,
round(100 * avg(toFloat64(vega)) / atm_vega, 1) AS vega_pct_of_atm,
count() AS contract_count
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = toDate('2026-06-30')
AND days_to_expiry BETWEEN 20 AND 45
AND iv_converged = 1
AND volume > 0
AND moneyness BETWEEN 0.80 AND 1.20
GROUP BY strike_vs_spot
ORDER BY min(moneyness)両端のゾーンでは感応度が低い。アット・ザ・マネーのVegaに対し、33.1%が0.80-0.90ゾーン、31.6%が1.10-1.20ゾーンの値である。これほど小さい数で価格誤差を割ると、ステップが極端に大きくなり、推定値がゼロを下回る可能性がある。その領域では、モデルから得られる情報は残っていない。実運用のソルバーは通常、両手法を組み合わせる。まず区間を設定し、その後ニュートン法で精度を高める。ギリシャ指標そのものについては、Vegaを参照されたい。
なぜ二つの情報源は異なるインプライド・ボラティリティを報告するのか
モデルは公開され、算術計算も確定している。見解の相違は入力値にある。
- ミッドか、最終約定値か。 ソルバーには一つの価格が必要になる。あるコントラクトの気配値が買い気配$2.00、売り気配$2.20なら、ミッドは$2.10となる。一方、最終約定値は90分前の$2.02かもしれない。このようなコントラクトでは、価格の10セントの差がボラティリティの1ポイントを上回る影響を持つ。
- 配当とキャリー。 上記の関数は、配当を支払わない株式のヨーロピアン・コールを価格評価する。満期前に配当が支払われるとフォワード価格は低下する。各トレーディングデスクは、それぞれ異なる調整と金利を適用する。
- アメリカン型の早期行使。 米国の個別株オプションはいつでも行使できる。この権利には価値があるが、ヨーロピアン式にはその価値を組み込む余地がない。これを無視するソルバーは、その差をボラティリティに転嫁する。二項ツリーは行使権を直接価格評価する。
- 古い気配値。 火曜日に最終売買された行使価格に、現在も気配値が表示されていることがある。ソルバーは、渡された値をそのまま正しいものとして扱う。
収束状況を確認すると、最後の二つの問題が明確になる。下のパネルは、2026年6月30日時点の代表的な8銘柄を対象に、残存期間が20~45日の売買コントラクト数を集計し、アット・ザ・マネーのボラティリティと、計算が収束したコントラクトの比率を示している。
各数値の背後にある正確なSQL
WITH abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) AS distance_from_spot
SELECT underlying_symbol AS symbol,
round(100 * avgIf(toFloat64(implied_volatility), iv_converged = 1 AND distance_from_spot < 0.05), 1) AS atm_iv_pct,
round(100 * countIf(iv_converged = 1) / count(), 1) AS solved_pct,
count() AS contract_count
FROM global_markets.options_greeks
WHERE date = toDate('2026-06-30')
AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'TSLA', 'SPY', 'KO', 'JNJ')
AND days_to_expiry BETWEEN 20 AND 45
AND volume > 0
GROUP BY symbol
HAVING countIf(iv_converged = 1 AND distance_from_spot < 0.05) > 0
ORDER BY atm_iv_pct DESCTSLAは、8銘柄の中で47.7%と最も高いアット・ザ・マネーの数値を示した。最も低かったSPYは14.4%だった。TSLAのオプションチェーンでは、売買されたコントラクトの97.8%で収束した解が得られた。残りは、ソルバーに渡された価格が、どのようなボラティリティを使っても再現できない範囲にある行使価格だ。価格が本質的価値を下回っている場合や、気配値が逆転している市場も含まれる。この数値を高いとみなすかどうかは別の問題である。30%のIVは高いのかで取り上げ、予想変動幅ではドルベースのレンジに換算する。
同じコントラクトを、各セッションで再計算
インプライド・ボラティリティの数値が保存されているわけではない。画面に表示された価格を基に、その都度再計算される。以下は、2026年7月17日に満期を迎えるAAPLの最も売買高が多いコントラクトを、6月1日から満期まで追ったものだ。行使価格も満期日も変わっていない。
各数値の背後にある正確なSQL
WITH (
SELECT ticker
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = toDate('2026-06-30')
AND expiration_date = toDate('2026-07-17')
AND iv_converged = 1
AND volume > 0
ORDER BY volume DESC
LIMIT 1
) AS pinned_contract
SELECT date,
round(100 * avg(toFloat64(implied_volatility)), 1) AS implied_vol_pct,
round(avg(days_to_expiry)) AS days_to_expiry
FROM global_markets.options_greeks
WHERE ticker = pinned_contract
AND date BETWEEN toDate('2026-06-01') AND toDate('2026-07-17')
AND iv_converged = 1
AND volume > 0
GROUP BY date
ORDER BY date29セッションにわたり、算出値は、残存日数が46日だった時点の25.1%で始まり、残存日数が4日となった時点の26.6%で終わった。この線上の各ポイントは、そのセッションのクオートに対して上記のループを一回実行した結果である。当社の銘柄別ページでも同じ算出を掲載している。AAPLのインプライド・ボラティリティではチェーン全体について毎日計算しているため、このページのコードを使えば、そこに掲載された数値を再現できる。
インプライド・ボラティリティ計算に関するよくある質問
インプライド・ボラティリティの計算式はありますか?
ありません。Black-Scholesモデルはボラティリティを価格に変換しますが、sigmaが正規分布の中に二度現れるため、この対応関係には初等的な逆関数がありません。ここで示す数値も、それ以外の場所で見るインプライド・ボラティリティも、すべて反復計算によるソルバーで求められています。
計算には何回の反復が必要ですか?
二分法では、反復のたびに探索区間が半分になります。そのため、0.01から5.0の範囲は20回で0.00001未満まで縮小します。気配値を最小刻みまで一致させるには、通常およそ12回かかります。Newton-Raphson法なら、アット・ザ・マネー付近では3〜4回で到達します。ただし、vegaが小さい領域ではステップが不安定になることがあります。
ブローカーとデータベンダーでインプライド・ボラティリティが異なるのはなぜですか?
ソルバーに異なる入力値を使っているためです。主な違いは、仲値と最終約定値のどちらを使うか、金利と配当の前提、そしてモデルがアメリカン・オプションの早期行使を扱うかどうかです。流動性の低い権利行使価格では、古い気配値だけで結果が数ポイント動くことがあります。
同じ権利行使価格のコールとプットは、同じインプライド・ボラティリティになりますか?
理論上は同じです。プット・コール・パリティが、同じ権利行使価格と満期における両者の関係を定めています。実際には、二つの気配値は独立して設定されます。そのため、計算された数値には多少の差が生じます。これも、オプションチェーン全体の平均値がベンダーによって異なる理由の一つです。
市場データなしでインプライド・ボラティリティを計算できますか?
仮想的な価格であれば可能です。上のコードでは、価格、権利行使価格、スポット価格、満期までの期間、金利を手入力します。リアルタイムのベンダー値と一致させることは、より難しい作業です。ベンダーが使ったものと同じ入力値が必要になります。
ここにあるすべてのパネルには、背後で使われているSQLが保存されています。パネルを開き、Strasmore terminalのリアルタイムのオプションチェーンに対して同じ計算を実行してください。