🎓 レベル:標準 | 重要度:B(標準)
📎 前提:モンテカルロ法によるオプション価格 | 関連:大数の法則(弱法則・強法則)(統計)
要点(BLUF)
- 分散減少法は、サンプル数を増やさずにモンテカルロ推定の分散(標準誤差)を下げる技法。 の遅さを実効的に補います。
- 対称変数法(antithetic):乱数 と をペアにして負の相関を作り、平均のばらつきを抑えます。
- 制御変量法(control variate):期待値が既知の量(割引した は )との相関を使って推定を補正します。相関が強いほど効きます。
1. なぜ分散減少か
モンテカルロの標準誤差は (モンテカルロ法によるオプション価格)。精度を1桁上げるのにサンプル100倍は重い。そこで、分子の そのものを賢く減らすのが分散減少法です。推定値(期待値)は変えずに、ばらつきだけを下げます。
2. 対称変数法
標準正規 から作ったサンプルと、符号を反転した から作ったサンプルをペアにし、その平均を取ります。 で価格が高く出れば では低く出る——負の相関が平均のばらつきを打ち消します。
3. 制御変量法
ペイオフ と相関し、かつ期待値が分かっている量 (制御変量)を使います。リスク中立では割引した満期価格 の期待値は で既知。これを使って補正します。
最適係数 のとき、分散は に縮みます( は の相関)。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 の近くで不偏)。とくに制御変量は、割引 がペイオフと強く相関するため効果が大きい。標準誤差を 0.0465→0.0177 に下げるのを素朴なモンテカルロでやろうとすると、サンプルを 倍にする必要があります。頭を使えば計算を7倍節約できる——これが分散減少法の価値です。
4. まとめ:手法の選択
- 対称変数:実装が最も簡単で、ペイオフが単調なら確実に効きます。まず試す価値あり。
- 制御変量:期待値が既知で、かつペイオフと相関する量を見つけられれば強力。BS に解析解があるよく似たオプションを制御変量にする手もあります。
- その他:層化抽出・重点サンプリング(稀なテールイベントの価格づけに有効)・準モンテカルロ(低食い違い列)など。問題に応じて組み合わせます(要最新確認)。
これで第6章の数値計算——モンテカルロ・二項木・有限差分と、その効率化——が揃いました。解析解の BS(第5章)と、解析解が無い場合の数値計算(第6章)を両輪に、より複雑なモデルへ進む準備ができました。
⚠️ よくある誤解
- 分散減少は推定値を変えない:減らすのは分散(ばらつき)だけで、期待値(価格)は不偏のまま。バイアスを入れる手法ではありません(重点サンプリングは重みで補正)。
- 対称変数が常に効くわけではない:ペイオフが について非単調だと、 と の負相関が弱まり効果が薄れます。万能ではありません。
- 制御変量の は推定値:同じサンプルから を推定すると微小なバイアスが入り得ます。厳密には別サンプルで を推定するか、バイアスが無視できる大標本で使います。
関連ノート
- 第6章 数値計算 目次
- モンテカルロ法によるオプション価格 — 前提:素朴なモンテカルロと 収束
- 有限差分法 — 確率誤差のない別アプローチ
- 大数の法則(弱法則・強法則)(統計)— モンテカルロの理論的土台
- 金融工学テキスト 全体目次