use super::SVJParams;
use crate::CalibrationLossScore;
use crate::LossMetric;
#[derive(Clone, Debug)]
pub struct SVJCalibrationResult {
pub v0: f64,
pub kappa: f64,
pub theta: f64,
pub sigma_v: f64,
pub rho: f64,
pub lambda: f64,
pub mu_j: f64,
pub sigma_j: f64,
pub loss: CalibrationLossScore,
pub converged: bool,
}
impl crate::traits::ToModel for SVJCalibrationResult {
type Model = crate::pricing::fourier::BatesFourier;
fn to_model(&self, r: f64, q: f64) -> Self::Model {
SVJCalibrationResult::to_model(self, r, q)
}
}
impl SVJCalibrationResult {
pub fn to_model(&self, r: f64, q: f64) -> crate::pricing::fourier::BatesFourier {
crate::pricing::fourier::BatesFourier {
v0: self.v0,
kappa: self.kappa,
theta: self.theta,
sigma_v: self.sigma_v,
rho: self.rho,
lambda: self.lambda,
mu_j: self.mu_j,
sigma_j: self.sigma_j,
r,
q,
}
}
}
impl crate::traits::CalibrationResult for SVJCalibrationResult {
type Params = SVJParams;
fn rmse(&self) -> f64 {
self.loss.get(LossMetric::Rmse)
}
fn converged(&self) -> bool {
self.converged
}
fn params(&self) -> Self::Params {
SVJParams {
v0: self.v0,
kappa: self.kappa,
theta: self.theta,
sigma_v: self.sigma_v,
rho: self.rho,
lambda: self.lambda,
mu_j: self.mu_j,
sigma_j: self.sigma_j,
}
}
fn loss_score(&self) -> Option<&CalibrationLossScore> {
Some(&self.loss)
}
}