将NaN放入每个列的for循环中(Longstaff Schwartz Monte Carlo)

时间:2019-01-22 20:55:45

标签: python pandas dataframe montecarlo

我将尝试解释我的问题。所以我有两个DataFrame,Df1和Df2。 它们每个都有3列和4行。 我将使用np.polyfit解决二次函数。

M=3 

for t in range(M-1,0,-1):

  regs = np.polyfit(Df1[:,t],Df2[:,t+1],2)

  C = np.polyval(regs,Df1[:,t])

但是我只想使用小于1.1的值

 Df1[Df1 < 1.1] 

现在我有类似的东西

   [1. , 1.09, 1.08, NaN]
   [1. , 1., 1.07, 1.04]
   [1. , NaN, 1.01, NaN]
   [1. , 0.78, NaN,0.95]

我的Df2看起来像

    [0.1 , 0., 0.08, 0.]
    [0.1 , 0.11, 0., 0.09]
    [0.1 , 0.33, 0.22, 0.]
    [0.1 , 0.09, 0.108, 0.]

所以我要对Df1中的每一列进行操作,如果Df1具有NaN 那我就不想计算了。

这就是我要解释的内容:

  X =[1.08,1.07,1.01]
  Y =[0.,0.09,0]

1 个答案:

答案 0 :(得分:0)

我尝试了这个

S = [[1.,1.09,1.08,1.34],[1.,1.16,1.26,1.54],[1.,1.22,1.07,1.03],[1.,0.93,0.97,0.92],[1.,1.11,1.56,1.52],
[1.,0.76,0.77,0.9],[1.,0.92,0.84,1.01],[1.,0.88,1.22,1.34]]

K= 1.1

Sn = np.asarray(S)

r = 0.06
T=1
M=3

dt = T/M
h= np.maximum(K-Sn,0)
V = np.copy(h)
disk = np.exp(-r*dt)


for i in range(M-1,0,-1):

   reg = np.polyfit(Sn[:,i],V[:,i+1]*disk,2)
   C = np.polyval(reg,Sn[:,i])

   V[:,i] = np.where(C > h[:,i],V[:,i+1]*disk,h[:,i])

C0 = disk* 1/8 * np.sum(V[:,1])

我的C0结果是0.11973。.

这是Longstaff Schwartz蒙特卡洛算法,用于为美式期权定价。

但是在Longstaff Schwartz的论文中,他们得到了一些不同的结果

https://people.math.ethz.ch/~hjfurrer/teaching/LongstaffSchwartzAmericanOptionsLeastSquareMonteCarlo.pdf

(第120页)

他们得到0.114。但是我看不到我的错误