Mímisbrunnr知恵の泉

← 金融工学 一覧

🎓 レベル:標準 | 重要度:B(標準)

📎 前提:モンテカルロ法によるオプション価格 | 関連:大数の法則(弱法則・強法則)(統計)

要点(BLUF)

1. なぜ分散減少か

モンテカルロの標準誤差は σpayoff/M\sigma_{\text{payoff}}/\sqrt{M}モンテカルロ法によるオプション価格)。精度を1桁上げるのにサンプル100倍は重い。そこで、分子の σpayoff\sigma_{\text{payoff}} そのものを賢く減らすのが分散減少法です。推定値(期待値)は変えずに、ばらつきだけを下げます。

2. 対称変数法

標準正規 ZZ から作ったサンプルと、符号を反転した Z-Z から作ったサンプルをペアにし、その平均を取ります。ZZ で価格が高く出れば Z-Z では低く出る——負の相関が平均のばらつきを打ち消します。

θ^anti=1M/2m=1M/2f(Zm)+f(Zm)2\hat\theta_{\text{anti}} = \frac1{M/2}\sum_{m=1}^{M/2}\frac{f(Z_m)+f(-Z_m)}{2}

3. 制御変量法

ペイオフ ff と相関し、かつ期待値が分かっているgg(制御変量)を使います。リスク中立では割引した満期価格 erTSTe^{-rT}S_T の期待値は S0S_0 で既知。これを使って補正します。

θ^cv=fβ(gE[g]),β=Cov(f,g)Var(g)\hat\theta_{\text{cv}} = f - \beta\,(g - \mathbb{E}[g]), \qquad \beta^{\ast} = \frac{\mathrm{Cov}(f,g)}{\mathrm{Var}(g)}

最適係数 β\beta^\ast のとき、分散は Var(f)(1ρ2)\mathrm{Var}(f)(1-\rho^2) に縮みます(ρ\rhof,gf,g の相関)。3手法を同じ問題で比べます。

import numpy as np
from scipy.stats import norm

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, sigma, T = 100.0, 100.0, 0.05, 0.2, 1.0
M = 100000

# 素朴なモンテカルロ
rng = np.random.default_rng(3)
Z = rng.normal(size=M)
ST = S0*np.exp((r-0.5*sigma**2)*T + sigma*np.sqrt(T)*Z)
plain = np.exp(-r*T)*np.maximum(ST-K, 0)
se_plain = plain.std(ddof=1)/np.sqrt(M)

# 対称変数法:Z と -Z をペアにする
rng = np.random.default_rng(3)
Zh = rng.normal(size=M//2)
ST1 = S0*np.exp((r-0.5*sigma**2)*T + sigma*np.sqrt(T)*Zh)
ST2 = S0*np.exp((r-0.5*sigma**2)*T - sigma*np.sqrt(T)*Zh)
anti = 0.5*(np.exp(-r*T)*np.maximum(ST1-K, 0) + np.exp(-r*T)*np.maximum(ST2-K, 0))
se_anti = anti.std(ddof=1)/np.sqrt(M//2)

# 制御変量法:割引した ST は期待値 S0 が既知
rng = np.random.default_rng(3)
Z = rng.normal(size=M)
ST = S0*np.exp((r-0.5*sigma**2)*T + sigma*np.sqrt(T)*Z)
payoff = np.exp(-r*T)*np.maximum(ST-K, 0)
control = np.exp(-r*T)*ST                       # E[control] = S0(既知)
beta = np.cov(payoff, control)[0, 1]/np.var(control)
cv = payoff - beta*(control - S0)
se_cv = cv.std(ddof=1)/np.sqrt(M)

print(f"素朴MC    : 価格 {plain.mean():.4f}, 標準誤差 {se_plain:.4f}")
print(f"対称変数  : 価格 {anti.mean():.4f}, 標準誤差 {se_anti:.4f}  (削減 {1-se_anti/se_plain:.1%})")
print(f"制御変量  : 価格 {cv.mean():.4f}, 標準誤差 {se_cv:.4f}  (削減 {1-se_cv/se_plain:.1%})")
print(f"BS厳密値  : {bs_call(S0, K, r, sigma, T):.4f}")

出力:

素朴MC    : 価格 10.4551, 標準誤差 0.0465
対称変数  : 価格 10.4212, 標準誤差 0.0326  (削減 29.8%)
制御変量  : 価格 10.4475, 標準誤差 0.0177  (削減 61.9%)
BS厳密値  : 10.4506

出力の意味:同じ10万サンプルでも、対称変数法は標準誤差を 約30%、制御変量法は 約62% 削減しました(どれも価格は厳密値 10.4506 の近くで不偏)。とくに制御変量は、割引 STS_T がペイオフと強く相関するため効果が大きい。標準誤差を 0.0465→0.0177 に下げるのを素朴なモンテカルロでやろうとすると、サンプルを (0.0465/0.0177)26.9(0.0465/0.0177)^2\approx6.9 倍にする必要があります。頭を使えば計算を7倍節約できる——これが分散減少法の価値です。

4. まとめ:手法の選択

これで第6章の数値計算——モンテカルロ・二項木・有限差分と、その効率化——が揃いました。解析解の BS(第5章)と、解析解が無い場合の数値計算(第6章)を両輪に、より複雑なモデルへ進む準備ができました。

⚠️ よくある誤解

関連ノート