1 votos

Precios de opciones utilizando la transformada de Fourier discreta (python)

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:

introduce aquí la descripción de la imagen

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.

1voto

armerc Puntos 1

En caso de que sea útil para alguien más que se encuentre con este problema, la cuestión era que había configurado mi vector de valores terminales en el orden incorrecto (es decir, de menor a mayor en lugar de de mayor a menor). El código para configurar el vector terminal debe leerse de la siguiente manera:

# configurar vector terminal y vector de probabilidad
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)

Con este cambio, el código luego produce los resultados esperados.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X