Source code for awt_quant.forecast.stochastic.stochastic_likelihoods
"""
Negative Log-Likelihood Functions for Stochastic Models
This module provides:
- neg_log_likelihood_ou: Log-likelihood for Ornstein-Uhlenbeck (OU) process.
- neg_log_likelihood_cir: Log-likelihood for Cox-Ingersoll-Ross (CIR) process.
"""
import numpy as np
from scipy.special import iv
[docs]
def neg_log_likelihood_ou(params, data, dt):
"""
Computes the negative log-likelihood for the Ornstein-Uhlenbeck (OU) process.
Args:
params (tuple): (mu, kappa, sigma) parameters.
data (np.ndarray): Log-returns data.
dt (float): Time step.
Returns:
float: Negative log-likelihood value.
"""
mu, kappa, sigma = params
psi = (2 * kappa * np.exp(kappa * dt)) / (2 * kappa - (1 + np.exp(-kappa * dt)) * (2 * kappa * np.exp(kappa * dt) - 2 * kappa))
density = (1 / (sigma * np.sqrt(2 * np.pi * dt * psi * (1 - np.exp(-2 * kappa * dt)))))
density *= np.exp(
-((data[1:] - data[:-1] * np.exp(-kappa * dt) - mu * (1 - np.exp(-kappa * dt))) ** 2) /
(2 * sigma ** 2 * dt * psi * (1 - np.exp(-2 * kappa * dt)))
)
return -np.log(density).sum()
[docs]
def neg_log_likelihood_cir(params, data, dt):
"""
Computes the negative log-likelihood for the Cox-Ingersoll-Ross (CIR) process.
Args:
params (tuple): (kappa, theta, sigma) parameters.
data (np.ndarray): Volatility data.
dt (float): Time step.
Returns:
float: Negative log-likelihood value.
"""
kappa, theta, sigma = params
c = 2 * kappa / ((1 - np.exp(-kappa * dt)) * sigma ** 2)
q = 2 * kappa * theta / sigma ** 2 - 1
u = c * data[:-1] * np.exp(-kappa * dt)
v = c * data[1:]
density = c * np.exp(-u - v) * (v / u) ** (q / 2) * iv(q, 2 * np.sqrt(u * v))
return -np.log(density).sum()