use std::fmt::Debug;
#[derive(Debug, Clone)]
pub enum StochasticProcess {
GeometricBrownian {
mu: f64,
sigma: f64,
},
VarianceGamma {
theta: f64,
sigma: f64,
nu: f64,
},
NormalInverseGaussian {
alpha: f64,
beta: f64,
delta: f64,
mu: f64,
},
CGMY {
c: f64,
g: f64,
m: f64,
y: f64,
},
MertonJumpDiffusion {
mu: f64,
sigma: f64,
lambda: f64,
mu_jump: f64,
sigma_jump: f64,
},
}
pub enum JumpProcess {
Poisson {
lambda: f64,
mu_jump: f64,
sigma_jump: f64,
},
DoubleExponential {
lambda: f64,
p: f64,
eta_up: f64,
eta_down: f64,
},
CompoundPoissonNormal {
lambda: f64,
mu: f64,
sigma_squared: f64,
},
TimeVaryingIntensity {
intensity_fn: Box<dyn Fn(f64) -> f64 + Send + Sync>,
mu_jump: f64,
sigma_jump: f64,
},
}
impl Debug for JumpProcess {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
JumpProcess::Poisson {
lambda,
mu_jump,
sigma_jump,
} => f
.debug_struct("Poisson")
.field("lambda", lambda)
.field("mu_jump", mu_jump)
.field("sigma_jump", sigma_jump)
.finish(),
JumpProcess::DoubleExponential {
lambda,
p,
eta_up,
eta_down,
} => f
.debug_struct("DoubleExponential")
.field("lambda", lambda)
.field("p", p)
.field("eta_up", eta_up)
.field("eta_down", eta_down)
.finish(),
JumpProcess::CompoundPoissonNormal {
lambda,
mu,
sigma_squared,
} => f
.debug_struct("CompoundPoissonNormal")
.field("lambda", lambda)
.field("mu", mu)
.field("sigma_squared", sigma_squared)
.finish(),
JumpProcess::TimeVaryingIntensity {
mu_jump,
sigma_jump,
..
} => f
.debug_struct("TimeVaryingIntensity")
.field("intensity_fn", &"<function>")
.field("mu_jump", mu_jump)
.field("sigma_jump", sigma_jump)
.finish(),
}
}
}
impl Clone for JumpProcess {
fn clone(&self) -> Self {
match self {
JumpProcess::Poisson {
lambda,
mu_jump,
sigma_jump,
} => JumpProcess::Poisson {
lambda: *lambda,
mu_jump: *mu_jump,
sigma_jump: *sigma_jump,
},
JumpProcess::DoubleExponential {
lambda,
p,
eta_up,
eta_down,
} => JumpProcess::DoubleExponential {
lambda: *lambda,
p: *p,
eta_up: *eta_up,
eta_down: *eta_down,
},
JumpProcess::CompoundPoissonNormal {
lambda,
mu,
sigma_squared,
} => JumpProcess::CompoundPoissonNormal {
lambda: *lambda,
mu: *mu,
sigma_squared: *sigma_squared,
},
JumpProcess::TimeVaryingIntensity {
intensity_fn: _,
mu_jump,
sigma_jump,
} => {
let constant_intensity = 0.1; JumpProcess::Poisson {
lambda: constant_intensity,
mu_jump: *mu_jump,
sigma_jump: *sigma_jump,
}
}
}
}
}