Python

Python Numpy FFT數組大小限制?

  • May 17, 2019

我正在嘗試根據二項式模型中的 fft 技術找到一個選項的價格,它工作正常,直到 N>40000 我開始得到負值和奇怪的收斂,我不確定這是否是編碼問題,限制numpy 中的數組或來自 N 的計算錯誤太大。這是我在時間 0 確定看漲期權價格的函式。

def FFTBinCall(S0,R,sigma,K,T,N):
   pQ = 0.5
   qQ = 1- pQ
   Dt=T/N
   #Initialize Vectors of Proper Dimensions
   C_T=np.zeros(N+1)
   S_T=np.zeros(N+1)

   u=1+R*Dt+sigma*math.sqrt(Dt)
   d=1+R*Dt-sigma*math.sqrt(Dt)
   D=math.exp(-R*Dt)

   for i in (range(0,N+1)):
       S_T[i]=S0*u**(N-i)*d**(i)
       C_T[i]=max(S_T[i]-K,0)

   QDistr=np.concatenate([[pQ,qQ], np.zeros(N-1)])
   Discounted_QDistr=QDistr*D

   C_0=np.fft.fft(np.fft.ifft(C_T)*np.fft.fft(Discounted_QDistr)**N).real
   return C_0[0]

我會冒險猜測你的問題是u**(N-i)。眾所周知,大指數表現不佳,我會首先考慮重組程式碼的這方面,然後再隔離其他表現不佳的部分。

例如,您可能會觀察到:

S_T[i] = S0 * u**(N-i) * d**(i)

相當於:

S_T[i] = S0 * u**N * (d/u)**i

thenu**N可以作為常量從循環中提取出來,剩下的就是一個迭代器:

S[0] = 1
for i in range(1, N+1):
   S_T[i] = S_T[i-1] * (d/u)
S *= S0 * u**N

64 位浮點數的機器容差大致在 1e-15 左右。假設(d/u)=0.999在這種情況下,在精度失去之前可以執行的乘法數(您的指數)是:

(d/u)**x = 1e-15
x = log(1e-15) / log(d/u)
x = 34521  

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