期權

使用 Feynman-Kac 為歐洲電話定價

  • November 27, 2019

我正在嘗試使用 Feynman-Kac (FK) 公式計算 Black-Scholes (BS) 方程的解,以進行簡單的歐洲呼叫。根據 FK,BS 的解決方案是過程的貼現平均值,S(T)其中 $ S $ 遵循幾何布朗運動。

我在 Python 中實現的 BS 方程的解析解:

from math import *

#first define these 2 functions
def d1(S,X,T,r,sigma):
   return (log(S/X)+(r+sigma*sigma/2.)*T)/(sigma*sqrt(T))

def d2(S,X,T,r,sigma):
   return d1(S,X,T,r,sigma)-sigma*sqrt(T)

#define the call option price function
def bs_call(S,X,T,r,sigma):
    return S*CND(d1(S,X,T,r,sigma))-X*exp(-r*T)*CND(d2(S,X,T,r,sigma))

#define cumulative standard normal distribution
def CND(X):
    (a1,a2,a3,a4,a5)=(0.31938153,-0.356563782,1.781477937,-1.821255978,1.330274429)
    L = abs(X)
    K=1.0/(1.0+0.2316419*L)
    w=1.0-1.0/sqrt(2*pi)*exp(-L*L/2.)*(a1*K+a2*K*K+a3*pow(K,3)+a4*pow(K,4)+a5*pow(K,5))
    if X<0:
       w=1.0-w
    return w

我使用這些參數(無風險回報 $ r $ , 波動性 $ \sigma $ , 成熟度 $ K $ , 到期時間ttm和標的股票價格 $ S $ :

r = 0.05
sigma = 0.003
K = 25
S = 30
ttm = 3
bs_call(S, K, ttm, r, sigma)

這給出了8.48. 我現在嘗試使用 FK:

def X_T(r, S0, sigma, T, n):
   dt = T / n
   X = S0
   for i in range(n):
       dx = r*X*dt + sigma*X*np.random.normal(0, np.sqrt(dt))
       X = X + dx
   return X

ave = 0
N = 1000
for i in range(N):
   ave += np.max([X_T(r, S, sigma, 10, 1000) - K, 0])
print(ave*np.exp(-r*3) / N)

哪個給出21.05,哪個沒有給出 BS 結果(我已經採取 $ T=10 $ ).

差異在哪裡出現?

首先,你寧願模擬 $ \log(X) $ 而不是 $ X $ ; 因此,您的離散化方案中沒有級別依賴性,使其更加準確。 $$ Z_t = \log(S_t) $$ $$ dZ_t = \left(r - \frac{\sigma^2}{2}\right)dt + \sigma dW_t $$ 您甚至可以執行一個時間步長,您的最終價格分佈仍然是準確的!

其次,不同的成熟時間(3 vs 10)當然解釋了很大一部分差異:)

第三,我建議您利用矢量化而不是使用循環。

我的建議總結在以下程式碼中:

Z_T = np.log(S0) + (r - 0.5 * sigma**2)*ttm + sigma*np.random.normal(0, np.sqrt(ttm), N)
S_T = np.exp(Z_T)
payoff = np.maximum(S_T - K, 0)
price = np.exp(-r*ttm)*np.average(payoff)
price

這也產生了 8.48。

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