Estoy tratando de implementar la fórmula de precios para una opción europea (call) que se encuentra en el documento de Ales Cerny "Introducción a la Transformada Rápida de Fourier en Finanzas" (el documento se puede encontrar aquí), de la siguiente manera:
Mi código de python a continuación no devuelve la respuesta correcta, y en particular si aumento significativamente el número de pasos entonces obtengo una respuesta mucho más grande. ¿Dónde me equivoqué?
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])
0 votos
¡Hola y bienvenido! No creo que eso esté causando el problema aquí, ¿pero acaso no deberías multiplicar por el descuento en la segunda a última línea de tu código?
0 votos
... y otra pregunta: ¿estás seguro de que tus funciones en la penúltima línea pueden manejar números complejos?
0 votos
Gracias muchas @Kermittfrog - tienes completamente razón con respecto al descuento, lo he actualizado en consecuencia. En cuanto a tu segundo punto, creo que pueden hacerlo - he probado tanto fft como ifft para ejemplos simples con números complejos y parecen dar el resultado esperado.
0 votos
Ok, incluso la función numpy.power, ¿sí?
0 votos
Buen punto @Kermittfrog - de hecho no había verificado eso, pero lo he hecho ahora y np.power() también devuelve el resultado esperado para matrices de números complejos