🎓 レベル:発展 | 重要度:B(標準)
要点(BLUF)
- 有限差分法は、ブラック–ショールズ偏微分方程式を株価×時間の格子で離散化し、満期(境界条件)から後ろ向きに解きます。
- 陽解法は、各格子点の値を隣接3点の重み付き和で更新するだけ。実装は簡単ですが、安定条件(時間刻みを十分小さく)を満たさないと発散します。
- 厳密解とよく一致し、格子からデルタ・ガンマも直接読めます。複雑な境界条件(バリア・アメリカン)にも組み込みやすいのが長所。
1. ブラック–ショールズ方程式を格子で解く
BS方程式の導出 の方程式
を、 方向に ()、時間方向に刻んで離散化します。満期 ではペイオフが分かっている()ので、そこを出発点に時間をさかのぼって現在 の価格を求めます。これは熱伝導方程式と同じ後ろ向き拡散の構造です。
2. 陽解法の更新式
微分を差分に置き換えます。 を前進差分、 を中心差分、 を2次中心差分にすると、各点の現在値が「1つ未来の時間ステップの隣接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)
def fd_explicit_call(S0, K, r, sigma, T, Smax, NS, NT):
dS = Smax/NS; dt = T/NT
i = np.arange(NS+1)
V = np.maximum(i*dS - K, 0.0) # 満期ペイオフ(出発点)
a = 0.5*dt*(sigma**2*i**2 - r*i)
b = 1 - dt*(sigma**2*i**2 + r)
c = 0.5*dt*(sigma**2*i**2 + r*i)
for m in range(NT): # 時間を後ろ向きに進める
Vnew = V.copy()
Vnew[1:NS] = a[1:NS]*V[0:NS-1] + b[1:NS]*V[1:NS] + c[1:NS]*V[2:NS+1]
tau = (m+1)*dt
Vnew[0] = 0.0 # 下端境界
Vnew[NS] = Smax - K*np.exp(-r*tau) # 上端境界
V = Vnew
return np.interp(S0, i*dS, V) # S0 での価格を補間
S0, K, r, sigma, T = 100.0, 100.0, 0.05, 0.2, 1.0
# 安定条件:dt <= 1/(σ²·NS²)。NS=300 なら NT を大きく取る
price_fd = fd_explicit_call(S0, K, r, sigma, T, Smax=300, NS=300, NT=20000)
print(f"有限差分(陽解法)コール = {price_fd:.4f}")
print(f"BS厳密値 = {bs_call(S0, K, r, sigma, T):.4f}")
出力:
有限差分(陽解法)コール = 10.4482
BS厳密値 = 10.4506
出力の意味:格子で偏微分方程式を解いた価格 10.4482 は、BS 厳密値 10.4506 と小数2桁で一致します(差は格子の離散化誤差)。モンテカルロ(モンテカルロ法によるオプション価格)が乱数で期待値を近似したのに対し、有限差分は方程式そのものを解いています——確率的な誤差はなく、格子を細かくすれば決定論的に精度が上がります。おまけに、最終格子 V の隣接差分からデルタ()やガンマ()も同時に読み取れます。
4. 長所・短所と陰解法
- 長所:方程式を直接解くので低次元(1〜2資産)では高精度・高速。境界条件が柔軟で、アメリカン型(各ステップで即時行使と比較)・バリアオプションを自然に扱えます。グリークスが格子から直接得られます。
- 短所:資産数が増えると格子の点数が指数的に増える(次元の呪い)。高次元ではモンテカルロに劣ります。陽解法は安定条件のため時間刻みを細かく取らねばならず、計算が増えます。
- 陰解法・クランク–ニコルソン:未来と現在を連立で解く陰解法は無条件安定で、大きな時間刻みが使えます。実装は連立一次方程式(三重対角)を各ステップで解くぶん複雑ですが、実務ではこちらが標準です(要最新確認)。
⚠️ よくある誤解
- 陽解法は安定条件を破ると爆発する: が大きすぎると となり、数値が振動して発散します。「細かくしたのに変な値」が出たら、まず時間刻みを疑います。
- 格子の上端 は十分大きく:上端境界が現在価格 に近すぎると、境界の影響で価格が歪みます。 は の3倍程度以上が目安です。
- 有限差分は高次元で破綻する:1〜2資産では強力ですが、5資産・10資産では格子が爆発します。そこはモンテカルロの独壇場——手法は問題の次元で使い分けます。
関連ノート
- 第6章 数値計算 目次
- BS方程式の導出 — 前提:解く偏微分方程式
- 二項木の実装 — 別の後ろ向き帰納アプローチ
- 分散減少法 — 次のトピック:モンテカルロの効率化
- 金融工学テキスト 全体目次