Поместите NaN в цикл for для каждого столбца (Longstaff Schwartz Monte Carlo) - PullRequest
0 голосов
/ 22 января 2019

Я постараюсь объяснить мою проблему.Таким образом, у меня есть два DataFrames, 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 голосов
/ 23 января 2019

Я попробовал это

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 Monte Carlo для оценки американских опционов.

Но в статье Лонгстаффа Шварца они получают немного другой результат

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

(Page120)

Они получают 0,114.Но я не вижу своей ошибки

...