期權定價
使用離散傅立葉變換的期權定價(python)
我正在嘗試實施 Ales Cerny 的論文“金融中的快速傅立葉變換簡介”中給出的歐洲(看漲)期權的定價公式(論文可以在此處找到),如下所示:
我下面的 python 程式碼沒有返回正確的答案,特別是如果我顯著增加步驟數,那麼我會得到一個更大的答案。我哪裡出錯了?
import numpy as np from numpy.fft import fft, ifft def price_vanilla_option(s: float, k: float, r: float, ro: float, t: float) -> float: """ price vanilla option using Fast Fourier Transform """ steps = 1023 # 2^n - 1 for efficient fft d_t = t / steps discount = 1/(1 + r * d_t) # use CRR probabilities u = np.exp(ro * np.sqrt(d_t)) d = np.exp(-ro * np.sqrt(d_t)) p = (np.exp(r * d_t) - d)/(u - d) # set up terminal vector and prob vector c_n = np.zeros(steps + 1) c_n[0] = s * (d ** steps) for i in range(1, steps + 1): c_n[i] = c_n[i - 1] * u / d c_n = np.maximum(c_n - k, 0) p_vec = np.pad([p, 1 - p], (0, steps - 1)) # fast fourier transform c_0 = fft(ifft(c_n) * np.power(fft(p_vec) * discount, steps)) return np.real(c_0[0])
如果這對遇到此問題的其他人有用,問題是我以錯誤的方式設置了終端值向量(即從最小到最大而不是從最大到最小)。設置終端向量的程式碼應如下所示:
# set up terminal vector and prob vector c_n = np.zeros(steps + 1) c_n[0] = s * (u ** steps) for i in range(1, steps + 1): c_n[i] = c_n[i - 1] * d / u c_n = np.maximum(c_n - k, 0)
通過此更改,程式碼將產生預期的結果。