mod constantoptionletvol;
pub use constantoptionletvol::ConstantOptionletVolatility;
use crate::errors::QlResult;
use crate::termstructures::volatility::{VolatilityTermStructure, VolatilityType};
use crate::time::date::Date;
use crate::time::period::Period;
use crate::types::{Rate, Real, Time, Volatility};
pub trait OptionletVolatilityStructure: VolatilityTermStructure {
fn volatility_impl(&self, option_time: Time, strike: Rate) -> QlResult<Volatility>;
fn volatility_type(&self) -> VolatilityType {
VolatilityType::ShiftedLognormal
}
fn displacement(&self) -> Real {
0.0
}
fn volatility_date(
&self,
option_date: Date,
strike: Rate,
extrapolate: bool,
) -> QlResult<Volatility> {
self.check_range_date(option_date, extrapolate)?;
self.check_strike(strike, extrapolate)?;
let t = self.time_from_reference(option_date)?;
self.volatility_impl(t, strike)
}
fn volatility(
&self,
option_time: Time,
strike: Rate,
extrapolate: bool,
) -> QlResult<Volatility> {
self.check_range_time(option_time, extrapolate)?;
self.check_strike(strike, extrapolate)?;
self.volatility_impl(option_time, strike)
}
fn volatility_tenor(
&self,
option_tenor: Period,
strike: Rate,
extrapolate: bool,
) -> QlResult<Volatility> {
let option_date = self.option_date_from_tenor(option_tenor)?;
self.volatility_date(option_date, strike, extrapolate)
}
fn black_variance_date(
&self,
option_date: Date,
strike: Rate,
extrapolate: bool,
) -> QlResult<Real> {
let v = self.volatility_date(option_date, strike, extrapolate)?;
let t = self.time_from_reference(option_date)?;
Ok(v * v * t)
}
fn black_variance(&self, option_time: Time, strike: Rate, extrapolate: bool) -> QlResult<Real> {
let v = self.volatility(option_time, strike, extrapolate)?;
Ok(v * v * option_time)
}
fn black_variance_tenor(
&self,
option_tenor: Period,
strike: Rate,
extrapolate: bool,
) -> QlResult<Real> {
let option_date = self.option_date_from_tenor(option_tenor)?;
self.black_variance_date(option_date, strike, extrapolate)
}
}