Python

有限差分錯誤 + 隱式方案 + Black & Scholes

  • February 13, 2019

我正在使用有限差分和隱式方案解決歐洲期權的經典 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} $ .

引用自:https://quant.stackexchange.com/questions/44009