Python
Python Numpy FFT數組大小限制?
我正在嘗試根據二項式模型中的 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
then
u**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