有限差分錯誤 + 隱式方案 + Black & Scholes
我正在使用有限差分和隱式方案解決歐洲期權的經典 Black & Scholes (BS) PDE。換句話說,我正在嘗試解決
$ \displaystyle\frac{\partial V}{\partial t} + \frac 12\sigma^2\frac{\partial^2V}{\partial x^2} + \mu\frac{\partial V}{\partial x} - rV = 0 $
有邊界條件 $ V(T,x) = \Phi(e^x) = \max{e^x - K, 0} $ . 漂移參數和往常一樣 $ \mu = r - y - \frac 12 \sigma^2 $ .
問題是當我的 $ x $ 網格太窄,我的期權價格偏離了 BS。具體來說,我正在解決 ATM 案例,
S0 = K = 2775
如果我將[np.log(2675), np.log(2875)]
其用作邊界點,則該解決方案有一個巨大的錯誤(~400)。但是,當我使用更寬的 grid[np.log(1775), np.log(3775)]
時,它就像一個魅力。我認為隱式方案在數值上足夠穩定,不會表現出這種行為,所以我應該假設我的 Python 程式碼有問題嗎?
我的其他參數是
r, y, T, sigma = (0.0278, 0.0189, 1, 0.15)
.def buildDs(nx): D1 = np.diag(np.ones(nx), 1) - np.diag(np.ones(nx), -1) D2 = np.diag(np.ones(nx), 1) + np.diag(np.ones(nx), -1) - 2 * np.eye(nx + 1) D1[0, 2] = -1 D1[0, 1] = 4 D1[0, 0] = -3 D1[-1, -1] = 3 D1[-1, -2] = -4 D1[-1, -3] = 1 D2[0, 2] = 1 D2[0, 1] = -2 D2[0, 0] = 1 D2[-1, -1] = 1 D2[-1, -2] = -2 D2[-1, -3] = 1 return csc_matrix(D1), csc_matrix(D2) def pxFD(Phi, r, mu, sigma, xs, ts, nx = 2000, nt = 10000): dx = (xs[1] - xs[0]) / nx dt = (ts[1] - ts[0]) / nt xs = np.linspace(xs[0], xs[1], num = nx + 1, endpoint = True) ts = np.linspace(ts[0], ts[1], num = nt + 1, endpoint = True) V = np.zeros((nt + 1, nx + 1)) I = identity(nx + 1) D1, D2 = buildDs(nx) L = 1 / 2 * (sigma / dx) ** 2 * D2 + mu / (2 * dx) * D1 - r * I P = I - dt * L V[-1] = Phi(xs) for j in reversed(range(nt)): V[j] = spsolve(P, V[j + 1]) return V, xs, ts def pxFDGBM(Phi, r, y, sigma, Ss, ts, nx = 2000, nt = 10000): mu = r - y - 1 / 2 * sigma ** 2 xs = np.log(Ss) Philog = lambda x: Phi(np.exp(x)) Vs, xs, ts = pxFD(Phi = Philog, r = r, mu = mu, sigma = sigma, xs = xs, ts = ts, nx = nx, nt = nt) return Vs, np.exp(xs), ts
PDE 定義為 $ x \in ]-\infty, +\infty[ $ 但有限差分格式需要截斷域 $ [x_{\min}, x_{\max}] $ , 和的選擇 $ x_{\min} $ 和 $ x_{\max} $ 無論方案是顯式的、隱式的還是混合的,都會影響結果的質量。
一個好的經驗法則是選擇截斷 $ [x_{\min}, x_{\max}] $ 這樣的機率 $ X_t < x_{\min} $ 或者 $ X_t > x_{\max} $ 在原始 SDE 下非常低,因為這些狀態不會對期權價值產生太大影響。
在 BS 的情況下,截斷在 $ \pm 5 $ 標準差通常是一個不錯的選擇。在你的例子中,那將是 $ x_{\min} = \ln(S_0) - 5 \sigma \sqrt{T} \approx \ln(1311) $ 和 $ x_{\max} = \ln(S_0) + 5 \sigma \sqrt{T} \approx \ln(5875) $ .
可以提高準確性的另一件事是邊界條件的選擇 $ x_{\min} $ 和 $ x_{\max} $ .