use crate::credit::survival_curve::SurvivalCurve;
use crate::traits::FloatExt;
pub fn expected_credit_loss<T: FloatExt>(curve: &SurvivalCurve<T>, t: T, lgd: T, exposure: T) -> T {
let q = curve.survival_probability(t);
(T::one() - q) * lgd * exposure
}
pub fn probability_of_default_before<T: FloatExt>(curve: &SurvivalCurve<T>, t: T) -> T {
T::one() - curve.survival_probability(t)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::credit::survival_curve::HazardInterpolation;
#[test]
fn ecl_grows_with_horizon() {
use ndarray::Array1;
let times = Array1::from(vec![1.0_f64, 5.0]);
let hazards = Array1::from(vec![0.01_f64, 0.01]);
let curve = SurvivalCurve::<f64>::from_hazard_rates(
×,
&hazards,
HazardInterpolation::PiecewiseConstantHazard,
);
let ecl_short = expected_credit_loss(&curve, 1.0, 0.6, 1_000.0);
let ecl_long = expected_credit_loss(&curve, 5.0, 0.6, 1_000.0);
assert!(ecl_long > ecl_short);
}
}