3 votos

Simulación del proceso Heston Quantlib-Python

Me pregunto si existe algún método que permita simular trayectorias de muestra para el modelo de Heston en Quantlib-Python. Actualmente estoy trabajando en un proyecto que requiere simulaciones con el esquema Quadratic Exponental con corrección martingala, como parámetros calibrados severamente viola la Estado de los hongos . He tratado de implementar el esquema QE codificándolo yo mismo, sin embargo, con un éxito limitado. También he probado la instalación de PyQL pero no han podido hacerlo funcionar.

He visto que se puede utilizar el ql.GaussianMultiPathGenerator para simular otros escenarios multidimensionales. ¿Es posible utilizar este método para simular un CIR y un proceso OU y correlacionarlos de alguna manera? ¿Hay alguna otra manera?

4voto

Marc Puntos 892

Los siguientes fragmentos generarán rutas de puntos y vol de QuantLib HestonProcess y generar los gráficos mostrados.

Obsérvese que en el histograma de vol, vemos un pico que aparece en el cubo 0 - debido a que Feller no está bien satisfecho, estamos viendo muchos vols aterrizando en 0 y permaneciendo durante mucho tiempo

Example Heston Spot and Vol Paths

Fragmento para generar las rutas:

import QuantLib as ql
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Utility function to pull out spot and vol paths as Pandas dataframes
def generate_multi_paths_df(sequence, num_paths):
    spot_paths = []
    vol_paths = []

    for i in range(num_paths):
        sample_path = seq.next()
        values = sample_path.value()

        spot, vol = values

        spot_paths.append([x for x in spot])
        vol_paths.append([x for x in vol])

    df_spot = pd.DataFrame(spot_paths, columns=[spot.time(x) for x in range(len(spot))])
    df_vol = pd.DataFrame(vol_paths, columns=[spot.time(x) for x in range(len(spot))])

    return df_spot, df_vol

today = ql.Date(1, 7, 2020)
v0 = 0.01; kappa = 1.0; theta = 0.04; rho = -0.3; sigma = 0.4; spot = 100; rate = 0.0

# Set up the flat risk-free curves
riskFreeCurve = ql.FlatForward(today, rate, ql.Actual365Fixed())
flat_ts = ql.YieldTermStructureHandle(riskFreeCurve)
dividend_ts = ql.YieldTermStructureHandle(riskFreeCurve)

heston_process = ql.HestonProcess(flat_ts, dividend_ts, ql.QuoteHandle(ql.SimpleQuote(spot)), v0, kappa, theta, sigma, rho)

timestep = 8
length = 2
times = ql.TimeGrid(length, timestep)
dimension = heston_process.factors()

rng = ql.GaussianRandomSequenceGenerator(ql.UniformRandomSequenceGenerator(dimension * timestep, ql.UniformRandomGenerator()))
seq = ql.GaussianMultiPathGenerator(heston_process, list(times), rng, False)

df_spot, df_vol = generate_multi_paths_df(seq, 10000)
df_spot.head()

Fragmento para generar los gráficos:

# Plot the first ten paths for spot and vol, and the distribution of the final path step across all paths
plt.figure(figsize=(20, 10))

plt.subplot(2, 2, 1)
plt.plot(df_spot.iloc[0:10].transpose())
plt.title("Sample Spot Paths")

plt.subplot(2, 2, 2)
plt.hist(df_spot[2.0], bins=np.linspace(0, 250, 51))
plt.title("Spot, t=2Y")

plt.subplot(2, 2, 3)
plt.plot(np.sqrt(df_vol.iloc[0:10]).transpose())
plt.title("Sample Vol Paths")

plt.subplot(2, 2, 4)
plt.hist(np.sqrt(df_vol[2.0]), bins=np.linspace(0, 0.8, 17))
plt.title("Instantaneous Vol, t=2Y")

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