Monte-Carlo

Neural Network Estimator 的 Least-Squares-Monte-Carlo 用於定價美式期權 Python

  • June 4, 2019

首先我做了 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/

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