From 490046dd6bee7f37afa9fca29e1b486bc5695b36 Mon Sep 17 00:00:00 2001 From: paolodelia99 Date: Sun, 12 Oct 2025 22:07:03 +0200 Subject: [PATCH 01/11] Added first fx vol utils classes from ORE --- QuantLib.vcxproj | 4 + QuantLib.vcxproj.filters | 12 + ql/CMakeLists.txt | 4 + .../volatility/equityfx/Makefile.am | 4 + .../equityfx/blackvariancecurve.cpp | 18 +- .../equityfx/blackvariancecurve.hpp | 4 +- .../blackvariancetimeextrapolation.hpp | 101 ++++++++ .../equityfx/blackvolsurfacedelta.cpp | 238 ++++++++++++++++++ .../equityfx/blackvolsurfacedelta.hpp | 177 +++++++++++++ .../equityfx/blackvoltermstructure.hpp | 6 + .../volatility/equityfx/fxsmilesection.hpp | 55 ++++ test-suite/CMakeLists.txt | 1 + test-suite/Makefile.am | 1 + test-suite/blackvolsurfacedelta.cpp | 102 ++++++++ test-suite/testsuite.vcxproj | 1 + test-suite/testsuite.vcxproj.filters | 3 + 16 files changed, 724 insertions(+), 7 deletions(-) create mode 100644 ql/termstructures/volatility/equityfx/blackvariancetimeextrapolation.hpp create mode 100644 ql/termstructures/volatility/equityfx/blackvolsurfacedelta.cpp create mode 100644 ql/termstructures/volatility/equityfx/blackvolsurfacedelta.hpp create mode 100644 ql/termstructures/volatility/equityfx/fxsmilesection.hpp create mode 100644 test-suite/blackvolsurfacedelta.cpp diff --git a/QuantLib.vcxproj b/QuantLib.vcxproj index 366c4417e73..3e9f2eb8c5a 100644 --- a/QuantLib.vcxproj +++ b/QuantLib.vcxproj @@ -1727,8 +1727,11 @@ + + + @@ -2753,6 +2756,7 @@ + diff --git a/QuantLib.vcxproj.filters b/QuantLib.vcxproj.filters index 5214b5342da..74839fb564f 100644 --- a/QuantLib.vcxproj.filters +++ b/QuantLib.vcxproj.filters @@ -2049,6 +2049,12 @@ termstructures\volatility\equityfx + + termstructures\volatility\equityfx + + + termstructures\volatility\equityfx + termstructures\volatility\equityfx @@ -4245,6 +4251,9 @@ termstructures\volatility\equityfx + + termstructures\volatility\equityfx + methods\finitedifferences\operators @@ -5600,6 +5609,9 @@ termstructures\volatility\equityfx + + termstructures\volatility\equityfx + termstructures\volatility\equityfx diff --git a/ql/CMakeLists.txt b/ql/CMakeLists.txt index fd644d1f506..469a6d351bb 100644 --- a/ql/CMakeLists.txt +++ b/ql/CMakeLists.txt @@ -835,6 +835,7 @@ set(QL_SOURCES termstructures/volatility/equityfx/andreasenhugevolatilityinterpl.cpp termstructures/volatility/equityfx/blackvariancecurve.cpp termstructures/volatility/equityfx/blackvariancesurface.cpp + termstructures/volatility/equityfx/blackvolsurfacedelta.cpp termstructures/volatility/equityfx/blackvoltermstructure.cpp termstructures/volatility/equityfx/fixedlocalvolsurface.cpp termstructures/volatility/equityfx/gridmodellocalvolsurface.cpp @@ -2103,8 +2104,11 @@ set(QL_HEADERS termstructures/volatility/equityfx/blackconstantvol.hpp termstructures/volatility/equityfx/blackvariancecurve.hpp termstructures/volatility/equityfx/blackvariancesurface.hpp + termstructures/volatility/equityfx/blackvariancetimeextrapolation.hpp + termstructures/volatility/equityfx/blackvolsurfacedelta.hpp termstructures/volatility/equityfx/blackvoltermstructure.hpp termstructures/volatility/equityfx/fixedlocalvolsurface.hpp + termstructures/volatility/equityfx/fxsmilesection.hpp termstructures/volatility/equityfx/gridmodellocalvolsurface.hpp termstructures/volatility/equityfx/hestonblackvolsurface.hpp termstructures/volatility/equityfx/impliedvoltermstructure.hpp diff --git a/ql/termstructures/volatility/equityfx/Makefile.am b/ql/termstructures/volatility/equityfx/Makefile.am index 38dbbf31eb6..997f501732f 100644 --- a/ql/termstructures/volatility/equityfx/Makefile.am +++ b/ql/termstructures/volatility/equityfx/Makefile.am @@ -10,8 +10,11 @@ this_include_HEADERS = \ blackconstantvol.hpp \ blackvariancecurve.hpp \ blackvariancesurface.hpp \ + blackvariancetimeextrapolation.hpp \ + blackvolsurfacedelta.hpp \ blackvoltermstructure.hpp \ fixedlocalvolsurface.hpp \ + fxsmilesection.hpp \ gridmodellocalvolsurface.hpp \ hestonblackvolsurface.hpp \ impliedvoltermstructure.hpp \ @@ -27,6 +30,7 @@ cpp_files = \ andreasenhugevolatilityadapter.cpp \ blackvariancecurve.cpp \ blackvariancesurface.cpp \ + blackvolsurfacedelta.cpp \ blackvoltermstructure.cpp \ fixedlocalvolsurface.cpp \ gridmodellocalvolsurface.cpp \ diff --git a/ql/termstructures/volatility/equityfx/blackvariancecurve.cpp b/ql/termstructures/volatility/equityfx/blackvariancecurve.cpp index 2a2a6847057..0047ab512e3 100644 --- a/ql/termstructures/volatility/equityfx/blackvariancecurve.cpp +++ b/ql/termstructures/volatility/equityfx/blackvariancecurve.cpp @@ -20,6 +20,7 @@ #include #include +#include #include namespace QuantLib { @@ -28,9 +29,10 @@ namespace QuantLib { const std::vector& dates, const std::vector& blackVolCurve, DayCounter dayCounter, - bool forceMonotoneVariance) + bool forceMonotoneVariance, + BlackVolTimeExtrapolation timeExtrapolation) : BlackVarianceTermStructure(referenceDate), dayCounter_(std::move(dayCounter)), - maxDate_(dates.back()) { + maxDate_(dates.back()), timeExtrapolation_(timeExtrapolation) { QL_REQUIRE(dates.size()==blackVolCurve.size(), "mismatch between date vector and black vol vector"); @@ -62,11 +64,15 @@ namespace QuantLib { } Real BlackVarianceCurve::blackVarianceImpl(Time t, Real) const { - if (t<=times_.back()) { - return varianceCurve_(t, true); - } else { + if (t <= times_.back() || timeExtrapolation_ == BlackVolTimeExtrapolation::UseInterpolatorVariance) { + return std::max(varianceCurve_(t, true), 0.0); + } else if (timeExtrapolation_ == BlackVolTimeExtrapolation::FlatVolatility) { // extrapolate with flat vol - return varianceCurve_(times_.back(), true)*t/times_.back(); + return timeExtrapolatationBlackVarianceFlat(t, times_, varianceCurve_); + } else if (timeExtrapolation_ == BlackVolTimeExtrapolation::UseInterpolatorVolatility) { + return timeExtrapolatationBlackVarianceInVolatility(t, times_, varianceCurve_); + } else { + QL_FAIL("Unknown time extrapolation method"); } } diff --git a/ql/termstructures/volatility/equityfx/blackvariancecurve.hpp b/ql/termstructures/volatility/equityfx/blackvariancecurve.hpp index cc34f71c79a..8b2dbf0e02a 100644 --- a/ql/termstructures/volatility/equityfx/blackvariancecurve.hpp +++ b/ql/termstructures/volatility/equityfx/blackvariancecurve.hpp @@ -50,7 +50,8 @@ namespace QuantLib { const std::vector& dates, const std::vector& blackVolCurve, DayCounter dayCounter, - bool forceMonotoneVariance = true); + bool forceMonotoneVariance = true, + BlackVolTimeExtrapolation timeExtrapolation = BlackVolTimeExtrapolation::FlatVolatility); //! \name TermStructure interface //@{ DayCounter dayCounter() const override { return dayCounter_; } @@ -84,6 +85,7 @@ namespace QuantLib { std::vector