期權
使用 Feynman-Kac 為歐洲電話定價
我正在嘗試使用 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。