Neural Network Estimator 的 Least-Squares-Monte-Carlo 用於定價美式期權 Python
首先我做了 LSM (Longstaff-Schwartz) 來了解它是如何為美式期權定價的。
標準正常的程式碼
def gen_sn(M,I,anti_paths=True,mo_match=True): if anti_paths is True: sn= npr.standard_normal((M+1,np.int(I/2) )) sn= np.concatenate((sn,-sn),axis=1) else: sn=npr.standard_normal((M+1,I)) if mo_match is True: sn = (sn-sn.mean())/sn.std() return sn
然後,對於模擬和定價
def amer(K,S0,r,sigma,T,M,I): dt = T/M df = np.exp(-r*dt) S=np.zeros((M+1 ,I)) S[0]=S0 sn= gen_sn(M,I) for t in range(1,M+1): S[t] = S[t-1] * np.exp((r-0.5*sigma**2)*dt + sigma * np.sqrt(dt) * sn[t]) #brown h = np.maximum(K-S,0) #LSM Algo V=np.copy(h) for t in range(M-1,0,-1): #von 12 bis 0 in -1 schritten -> 12,11,10,9,..,0 reg = np.polyfit(S[t], V[t+1] * df, 3) #least-squares-polynomial-fit /sum(Y-X)^2 C = np.polyval(reg,S[t]) V[t] = np.where(C > h[t], V[t+1]* df, h[t]) #MCS estimator C0 = df * 1/I *np.sum(V[1]) return C0
所以我使用這個參數並得到這個估計價格
amer(90.,100,0.05,0.25,1.0,12,2000) -> 3.6793077
我認為這段程式碼沒問題
所以現在我將使用 Keras 庫進行神經網路回歸估計我的結果對我來說毫無意義,我現在很困惑
def amer(K,S0,r,sigma,T,M,I): dt = T/M df = np.exp(-r*dt) S=np.zeros((M+1 ,I)) S[0]=S0 sn= gen_sn(M,I) for t in range(1,M+1): S[t] = S[t-1] * np.exp((r-0.5*sigma**2)*dt + sigma * np.sqrt(dt) * sn[t]) h = np.maximum(K-S,0) V = np.copy(h) num_features=13 model=Sequential() init_w= RandomUniform(minval=-1.0, maxval=1.0) #weight init_b = Constant(value=0.0) #bias for t in range(M-1,0,-1): model.add(Dense(4, kernel_initializer=init_w, bias_initializer=init_b, input_shape=(num_features,))) model.add(Activation("sigmoid")) model.add(Dense(2, kernel_initializer=init_w, bias_initializer=init_b)) model.summary() lr = 0.005 optimizer = Adam(lr=lr) model.compile(loss="mse", optimizer=optimizer, metrics=['accuracy']) X= V[t+1] * df x_train=X[:1000] x_test = X[1000:2000] y= S[t] y_train = y[:1000] y_test = y[1000:2000] model.fit(x=x_train, y=y_train, verbose=1, epochs=100, validation_data=[x_test,y_test]) score = model.evaluate(,y) return score
在非 nn 情況下,您的程式碼沒有實現 longstaff-schwartz 算法,所以我不確定是什麼讓您認為它確實如此。Longstaff-Schwartz 是一種蒙地卡羅方法,您似乎正在實施一些落後的定價方案,所以這對我來說根本沒有多大意義。
Longstaff-Schwartz 有 2 個階段:1 個反向定價步驟來校準持續價值估計器,以及一個正常的 MC 正向定價步驟來實際定價期權。
您似乎已經測試過,對於輸入的某些值,您的過程會返回一些雙精度值,但這遠非測試您的過程是否正確!您應該將您的程式碼與歐洲和美國收益的已知結果進行基準測試,以便對您的程式碼的“ok-ness”做出任何類型的結論。
所以總的來說,在使用 NN 作為延續值的替代擬合算法之前,您應該花更多時間檢查您的定價算法是否真的有意義。甚至不清楚您在這裡要達到什麼目標,因為美國人的持續價值並不是非線性的,以至於可以證明使用 NN 算法來擬合它是合理的,因此甚至不清楚您的動機是什麼。
注意:您的 keras 程序似乎甚至沒有意義,因為您似乎將延續值用作“X”,將現場值用作“Y”,因此根本不清楚您在這裡要做什麼。甚至沒有任何定價邏輯。
此外,您似乎遇到了一個錯誤,即基本輸入數組的形狀不適合您的 keras 適合工作,因為您要求 13 個功能,但提供單維數組作為 X 的輸入,因此您必須錯誤地設置基本輸入. 因此,在詢問如何在某種美式期權定價算法中使用它之前,您可能想進行一些基本測試,以了解如何使用此擬合器。
好的,對不起,但我不明白你在嘗試什麼。這是一篇論文,我認為它對你有幫助。但是有一個問題我不清楚。特徵矩陣 X (“feature_matrix_from_current_state),他使用了 4 次切比雪夫多項式。所以如果你想使用神經網路,我想你必須改變這個特徵矩陣,但我不知道你該怎麼做 。https:// ipythonquant.wordpress.com/2018/06/01/pricing-bermudan-options-in-tensorflow-learning-an-optimal-early-exercise-strategy/