2 votos

Calibración de Heston versión de CIR

Me gustaría calibrar una variante de Heston modelo para las tasas de interés que se describen por este par de SDE

\begin{aligned}dr_t&=a(b-r_t)+\sqrt{r_t}\sigma_t dW_t^1 \\ d\sigma_t&=k(\theta-\sigma_t)+\sqrt{\sigma_t}\zeta dW_t^2 \end{aligned}

con los mercados reales de los datos.

Primero de todo quiero discretizar las ecuaciones llegar

\begin{aligned}r_t-r_{t-1}&=a(b-r_t)+\sqrt{r_{t-1}}\sigma_t \varepsilon_t \\ \sigma_t-\sigma_{t-1}&=k(\theta-\sigma_t)+\sqrt{\sigma_{t-1}}\zeta \epsilon_t \end{aligned}

Y ahora no sé exactamente cómo proceder. Tengo algunas ideas:

  • Intentar aplicar un VAR (Vectores Autorregresivos) modelo: rearraing la discretizan las ecuaciones que debo conseguir

\begin{aligned} \frac{r_t}{\sqrt{r_{t-1}}}&=ab+(a-1)\sqrt{r_{t-1}}+\sigma_t \varepsilon_t \\ \frac{\sigma_t}{\sqrt{\sigma_{t-1}}}&=k\theta+(k-1)\sqrt{\sigma_{t-1}}+\zeta \epsilon_t \end{aligned} o \begin{aligned} \frac{r_t-r_{t-1}}{\sqrt{r_{t-1}}}&=\frac{a(b-r_t)}{\sqrt{r_{t-1}}}+\sigma_t \varepsilon_t \\ \frac{\sigma_t-\sigma_{t-1}}{\sqrt{\sigma_{t-1}}}&=\frac{k(\theta-\sigma_t)}{\sqrt{\sigma_{t-1}}}+\zeta\epsilon_t \end{aligned} pero no sé si esta opción es adecuada y que de estas dos propuestas es el mejor porque de la raíz cuadrada, y debido a que los lados izquierdos de las ecuaciones son una transformación de los

  • Aplicar MCO a la $\sigma_t$ ecuación, conecte los resultados en la $r_t$ ecuación y el correr de nuevo OLS o ML. La primera parte no debería ser un problema ya que la volatilidad es constante, $\zeta$, y la OPERACIÓN debe ser bueno rearraning de esta manera

$$\frac{\sigma_t-\sigma_{t-1}}{\sqrt{\sigma_t}}=\frac{k(\theta-\sigma_t)}{\sqrt{\sigma_t}}+\zeta\varepsilon_t $$ En la segunda ecuación de ($r_t$ con $\sigma_t$ conectado) no creo OLS son una buena opción debido a que el modelo es heteroskedastic y $\varepsilon_t$ e $\epsilon_t$ puede estar correlacionada a priori.

¿Tiene alguna sugerencia para la elección de la técnica de calibración? Por otra parte, ¿cómo puedo implementar esta práctica de calibración? Puedo usar MatLab, Stata y Python (lo cual sería mi elección óptima si es posible).

1voto

sfuqua Puntos 1796

Adjunto a continuación una implementación de Python de la CIR paso de calibración por MLL. Después de esto ha sido la ejecución puede continuar para estimar el $\mu$ (a la deriva) y $\rho$ (correlación entre Browniano movimiento).

# CIR Calibration Script
import numpy as np
from numpy import abs, r_, var, ones, sqrt, exp,log, real, mean
from numpy.linalg import solve
from scipy.optimize import fmin
from scipy.special import ive

# Parameters
t_ = len(data) # Length time series
p = (1 / t_) * ones((1, t_))  # Probabilities
t_obs = 252 * [...]  # Years
delta_t = [...]  # Time-step


def CIR_LOGLIK(parameters, dt, data, p):
    kappa = parameters[0]
    s2 = parameters[1]
    eta = parameters[2]
    c = (2 * kappa) / ((eta ** 2) * (1 - exp(-kappa * dt)))
    q = ((2 * kappa * s2) / (eta ** 2)) - 1
    u = c * exp(-kappa * dt) * data[:-1]
    v = c * data[1:]

    maxll = np.sum(- p[1:] * log(c) + p[1:] * (u + v) - p[1:] * log(v / u) * q / 2 - p[1:] * log(
        ive(q, 2 * sqrt(u * v)))
                 - p[1:] * abs(real(2 * sqrt(u * v))))
    return maxll


def FitCIR(data, dt, parameters=None, p=None):
    if parameters is None:
        x = r_[ones((1, t_ - 1)), data[np.newaxis, :t_ - 1]]
        ols = solve(x @ x.T, x @ data[1:t_].T)
        m = mean(data)
        v = var(data, ddof=1)
        parameters = r_[-log(ols[1]) / dt, m, sqrt(2 * ols[1] * v / m)]

    CIRparams, fevals = fmin(CIR_LOGLIK, parameters, args=(dt, data, p[0]), maxfun=1000, xtol=1e-8, ftol=1e-8,
                                disp=False, retall=True)
    return CIRparams


par_CIR = FitCIR(y[0, -t_obs:], delta_t, None, p)
kappa = par_CIR[0]
y_ = par_CIR[1]
eta = par_CIR[2]

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