Mímisbrunnr知恵の泉

← 金融工学 一覧

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

📎 前提:ブラックショールズ公式と解釈 | 関連:BS方程式の導出(デルタヘッジ)

要点(BLUF)

1. グリークスとは

オプション価格は S,σ,t,rS, \sigma, t, r など複数の入力で動きます。それぞれに対する感応度(偏微分)がグリークスで、リスク管理の言語です。「いま株が動いたら/ボラが動いたら/1日経ったら、ポジションの価値はどう変わるか」を1つずつ数値化します。

2. 各グリークスの式と意味(コール)

N()N(\cdot) を標準正規 CDF、N()N'(\cdot) をその密度として、

Δ=N(d1),Γ=N(d1)SσT,V=SN(d1)T\Delta = N(d_1), \qquad \Gamma = \frac{N'(d_1)}{S\sigma\sqrt{T}}, \qquad \mathcal{V} = S\,N'(d_1)\sqrt{T} Θ=SN(d1)σ2TrKerTN(d2),ρ=KTerTN(d2)\Theta = -\frac{S\,N'(d_1)\,\sigma}{2\sqrt{T}} - rK e^{-rT}N(d_2), \qquad \rho = K T e^{-rT} N(d_2)

意味は次のとおり。

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。セータ 6.41-6.41/年は「1日あたり約 0.018-0.018 の時間減衰」。ロー 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=K=100S=K=100)付近で急に立ち上がる S 字。ガンマはその傾きなので、ATM で鋭いピークを持ちます。ガンマが大きいほどデルタが激しく動くので、ATM・満期間際のオプションは再ヘッジが頻繁に必要で、取引コストもかさみます。BS方程式の導出 でデルタヘッジ後にわずかに残ったリスクは、このガンマが正体——1日の株価変動でデルタがずれるぶんです。オプションの売り手は「セータで稼ぎ、ガンマで損する」構図になります。

⚠️ よくある誤解

関連ノート