期權定價

使用離散傅立葉變換的期權定價(python)

  • February 3, 2021

我正在嘗試實施 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)

通過此更改,程式碼將產生預期的結果。

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