🎓 レベル:標準 | 重要度:A(必須)
📎 前提:ブラックショールズ公式と解釈 | 関連:BS方程式の導出(デルタヘッジ)
要点(BLUF)
- グリークスはオプション価格の感応度(偏微分)です。デルタ 、ガンマ 、ベガ 、セータ 、ロー 。
- 使い分け:デルタ=ヘッジに必要な株数、ガンマ=デルタの動きやすさ(再ヘッジ頻度)、ベガ=ボラ感応、セータ=時間減衰、ロー=金利感応。
- 解析式は数値微分(差分)と一致します。デルタは ATM 付近で急に立ち上がり、ガンマは ATM で最大——ここがヘッジが最も難しい場所です。
1. グリークスとは
オプション価格は など複数の入力で動きます。それぞれに対する感応度(偏微分)がグリークスで、リスク管理の言語です。「いま株が動いたら/ボラが動いたら/1日経ったら、ポジションの価値はどう変わるか」を1つずつ数値化します。
2. 各グリークスの式と意味(コール)
を標準正規 CDF、 をその密度として、
意味は次のとおり。
- デルタ :株価が1動くと価格がいくら動くか。(コール)。BS方程式の導出 のヘッジ株数そのもの。
- ガンマ :デルタの変化率。大きいほど株価が動くたびにデルタが変わり、頻繁な再ヘッジが要ります。ATM・満期近くで最大。
- ベガ :ボラが1(=100%)動くと価格がいくら動くか。実務では1%あたりに直して を使います。
- セータ :時間が経つと価格がいくら減るか(時間減衰)。ふつう負。年あたりなので、1日あたりは 。
- ロー :金利が1動くと価格がいくら動くか。1%あたりは 。
3. 解析式と数値微分の一致
解析式が正しいか、価格関数を直接差分して検算します(偏微分の定義に戻る)。
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)
def bs_greeks_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)
delta = norm.cdf(d1)
gamma = norm.pdf(d1)/(S*sigma*np.sqrt(T))
vega = S*norm.pdf(d1)*np.sqrt(T)
theta = -(S*norm.pdf(d1)*sigma)/(2*np.sqrt(T)) - r*K*np.exp(-r*T)*norm.cdf(d2)
rho = K*T*np.exp(-r*T)*norm.cdf(d2)
return delta, gamma, vega, theta, rho
S, K, r, sigma, T = 100.0, 100.0, 0.05, 0.2, 1.0
delta, gamma, vega, theta, rho = bs_greeks_call(S, K, r, sigma, T)
h = 1e-4 # 数値微分(中心差分)で検算
delta_fd = (bs_price(S+h, K, r, sigma, T) - bs_price(S-h, K, r, sigma, T))/(2*h)
gamma_fd = (bs_price(S+h, K, r, sigma, T) - 2*bs_price(S, K, r, sigma, T)
+ bs_price(S-h, K, r, sigma, T))/h**2
vega_fd = (bs_price(S, K, r, sigma+h, T) - bs_price(S, K, r, sigma-h, T))/(2*h)
theta_fd = -(bs_price(S, K, r, sigma, T) - bs_price(S, K, r, sigma, T-h))/h
rho_fd = (bs_price(S, K, r+h, sigma, T) - bs_price(S, K, r-h, sigma, T))/(2*h)
print(f"デルタ Δ : 解析 {delta:.5f} / 数値 {delta_fd:.5f}")
print(f"ガンマ Γ : 解析 {gamma:.5f} / 数値 {gamma_fd:.5f}")
print(f"ベガ ν : 解析 {vega:.5f} / 数値 {vega_fd:.5f}")
print(f"セータθ : 解析 {theta:.5f} / 数値 {theta_fd:.5f}")
print(f"ロー ρ : 解析 {rho:.5f} / 数値 {rho_fd:.5f}")
出力:
デルタ Δ : 解析 0.63683 / 数値 0.63683
ガンマ Γ : 解析 0.01876 / 数値 0.01876
ベガ ν : 解析 37.52403 / 数値 37.52403
セータθ : 解析 -6.41403 / 数値 -6.41413
ロー ρ : 解析 53.23248 / 数値 53.23248
出力の意味:解析式と数値微分が小数4桁まで一致し、グリークスの式が正しいことを確認できました(セータの僅差は片側差分の誤差)。読み方の例:デルタ 0.637 は「株が1上がるとコールは約 0.64 上がる」。ベガ 37.52 は「ボラが100%上がると37.52上がる」=1%あたり 0.375。セータ /年は「1日あたり約 の時間減衰」。ロー 53.23 は「金利が1%上がると約 0.53 上がる」。価格1つでは見えないリスクを、グリークスは方向ごとに分解します。
4. デルタとガンマの形
デルタとガンマが株価とともにどう変わるかを見ると、ヘッジの難所が分かります。
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from scipy.stats import norm
K, r, sigma, T = 100.0, 0.05, 0.2, 1.0
S = np.linspace(60, 140, 200)
d1 = (np.log(S/K) + (r + 0.5*sigma**2)*T)/(sigma*np.sqrt(T))
delta = norm.cdf(d1)
gamma = norm.pdf(d1)/(S*sigma*np.sqrt(T))
fig, ax = plt.subplots(1, 2, figsize=(11, 4))
ax[0].plot(S, delta); ax[0].axvline(K, color="gray", ls=":")
ax[0].set_title("デルタ(株価感応度)"); ax[0].set_xlabel("株価 S"); ax[0].set_ylabel("Δ")
ax[1].plot(S, gamma, color="crimson"); ax[1].axvline(K, color="gray", ls=":")
ax[1].set_title("ガンマ(デルタの変化率)"); ax[1].set_xlabel("株価 S"); ax[1].set_ylabel("Γ")
plt.tight_layout(); plt.show()
出力の意味:デルタは深い OTM で0、深い ITM で1に近づき、ATM()付近で急に立ち上がる S 字。ガンマはその傾きなので、ATM で鋭いピークを持ちます。ガンマが大きいほどデルタが激しく動くので、ATM・満期間際のオプションは再ヘッジが頻繁に必要で、取引コストもかさみます。BS方程式の導出 でデルタヘッジ後にわずかに残ったリスクは、このガンマが正体——1日の株価変動でデルタがずれるぶんです。オプションの売り手は「セータで稼ぎ、ガンマで損する」構図になります。
⚠️ よくある誤解
- グリークスの単位に注意:ベガ・ローは「1.0(=100%)変化あたり」、セータは「1年あたり」が素の定義です。実務では1%あたり・1日あたりに直して使うので、桁を取り違えないこと。
- デルタは「行使確率」ではない:デルタ と行使確率 は別物( なのでデルタの方が大きい)。近い値ですが意味が違います。
- ガンマとセータは表裏:BS 方程式 が示すように、大きな正のガンマは大きな負のセータと釣り合います。「変動から得る利益(ガンマ)」と「時間で失う価値(セータ)」は同じコインの裏表です。
関連ノート
- 第5章 ブラック–ショールズ 目次
- ブラックショールズ公式と解釈 — 前提:価格の閉形式
- BS方程式の導出 — デルタヘッジとガンマ・リスク
- インプライドボラティリティ — 次のトピック:ベガと市場ボラの逆算
- 金融工学テキスト 全体目次