From 911d1f9620ed7940585098f6c287d201d1a8859a Mon Sep 17 00:00:00 2001 From: Sai Asish Y Date: Thu, 18 Jun 2026 11:45:07 -0700 Subject: [PATCH] Fix Bachelier put implied volatility to sum the full B polynomial Signed-off-by: Sai Asish Y --- .../src/options/option_models.rs | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) 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); + } +}