diff --git a/crates/RustQuant_instruments/src/options/option_models.rs b/crates/RustQuant_instruments/src/options/option_models.rs index 391d541b..8c38508b 100644 --- a/crates/RustQuant_instruments/src/options/option_models.rs +++ b/crates/RustQuant_instruments/src/options/option_models.rs @@ -1086,8 +1086,8 @@ mod bachelier { sum1 += v * eta.powi(k as i32); } - // for k in 1..=B.len() { - for (k, v) in B.iter().enumerate().skip(1) { + // for k in 0..B.len() { + for (k, v) in B.iter().enumerate() { sum2 += v * eta.powi(k as i32); } @@ -1390,3 +1390,27 @@ mod tests_sabr { assert!((sabr.nu - 0.4).abs() < 1e-10); } } + +#[cfg(test)] +mod tests_bachelier { + use super::*; + + #[test] + fn test_bachelier_put_call_iv_symmetry() { + let f = 100.0; + let r = 0.0; + let v = 20.0; + let k = 95.0; + let t = 1.0; + + let model = Bachelier::new(f, r, v); + + let call_price = model.price(k, t, TypeFlag::Call); + let call_iv = model.iv(call_price, k, t, TypeFlag::Call); + + let put_price = model.price(k, t, TypeFlag::Put); + let put_iv = model.iv(put_price, k, t, TypeFlag::Put); + + assert!((put_iv - call_iv).abs() < 1e-10); + } +}