diff --git a/LICENSE.TXT b/LICENSE.TXT index 82962f68e8..ee528bd48d 100644 --- a/LICENSE.TXT +++ b/LICENSE.TXT @@ -127,7 +127,7 @@ Copyright (C) 2016 Nicholas Bertocchi Copyright (C) 2016 Stefano Fondi Copyright (C) 2016, 2017 Fabrice Lecuyer Copyright (C) 2016, 2019, 2020 Eisuke Tani -Copyright (C) 2016, 2020, 2022 Quaternion Risk Management Ltd +Copyright (C) 2016, 2019, 2020, 2022 Quaternion Risk Management Ltd Copyright (C) 2017 BN Algorithms Ltd Copyright (C) 2017 Joseph Jeisman @@ -153,11 +153,11 @@ Copyright (C) 2020 Piotr Siejda Copyright (C) 2020, 2021 Jack Gillett Copyright (C) 2020, 2021 Lew Wei Hao Copyright (C) 2020, 2021, 2022, 2023, 2025 Marcin Rybacki +Copyright (C) 2020, 2021, 2022, 2023, 2024 Skandinaviska Enskilda Banken AB (publ) Copyright (C) 2021 Anubhav Pandey Copyright (C) 2021 Magnus Mencke Copyright (C) 2021, 2022, 2023, 2024 Ralf Konrad Eckel -Copyright (C) 2021, 2022, 2023, 2024 Skandinaviska Enskilda Banken AB (publ) Copyright (C) 2022, 2023 Ignacio Anguita Copyright (C) 2022, 2023 Jonghee Lee @@ -171,6 +171,7 @@ Copyright (C) 2023 Paul Xi Cao Copyright (C) 2024 Jacques du Toit Copyright (C) 2024 Jongbong An +Copyright (C) 2025 AcadiaSoft Inc. Copyright (C) 2025 Eugene Toder Copyright (C) 2025 Hiroto Ogawa Copyright (C) 2025 Kareem Fareed diff --git a/QuantLib.vcxproj b/QuantLib.vcxproj index 5d040d7836..e1a989c098 100644 --- a/QuantLib.vcxproj +++ b/QuantLib.vcxproj @@ -1724,7 +1724,9 @@ + + @@ -2753,7 +2755,9 @@ + + diff --git a/QuantLib.vcxproj.filters b/QuantLib.vcxproj.filters index 3e78689eed..2bb4f7a258 100644 --- a/QuantLib.vcxproj.filters +++ b/QuantLib.vcxproj.filters @@ -2052,9 +2052,15 @@ termstructures\volatility\equityfx + + termstructures\volatility\equityfx + termstructures\volatility\equityfx + + termstructures\volatility\equityfx + termstructures\volatility\equityfx @@ -5618,9 +5624,15 @@ termstructures\volatility\equityfx + + termstructures\volatility\equityfx + termstructures\volatility\equityfx + + termstructures\volatility\equityfx + termstructures\volatility\equityfx diff --git a/ql/CMakeLists.txt b/ql/CMakeLists.txt index 1d41f2f1d8..2344065b83 100644 --- a/ql/CMakeLists.txt +++ b/ql/CMakeLists.txt @@ -833,7 +833,9 @@ 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/blackvoltimeextrapolation.cpp termstructures/volatility/equityfx/fixedlocalvolsurface.cpp termstructures/volatility/equityfx/gridmodellocalvolsurface.cpp termstructures/volatility/equityfx/hestonblackvolsurface.cpp @@ -2100,7 +2102,9 @@ set(QL_HEADERS termstructures/volatility/equityfx/blackconstantvol.hpp termstructures/volatility/equityfx/blackvariancecurve.hpp termstructures/volatility/equityfx/blackvariancesurface.hpp + termstructures/volatility/equityfx/blackvolsurfacedelta.hpp termstructures/volatility/equityfx/blackvoltermstructure.hpp + termstructures/volatility/equityfx/blackvoltimeextrapolation.hpp termstructures/volatility/equityfx/fixedlocalvolsurface.hpp termstructures/volatility/equityfx/gridmodellocalvolsurface.hpp termstructures/volatility/equityfx/hestonblackvolsurface.hpp diff --git a/ql/termstructures/volatility/equityfx/Makefile.am b/ql/termstructures/volatility/equityfx/Makefile.am index 1012817aac..89e9c7ed46 100644 --- a/ql/termstructures/volatility/equityfx/Makefile.am +++ b/ql/termstructures/volatility/equityfx/Makefile.am @@ -10,7 +10,9 @@ this_include_HEADERS = \ blackconstantvol.hpp \ blackvariancecurve.hpp \ blackvariancesurface.hpp \ + blackvolsurfacedelta.hpp \ blackvoltermstructure.hpp \ + blackvoltimeextrapolation.hpp \ fixedlocalvolsurface.hpp \ gridmodellocalvolsurface.hpp \ hestonblackvolsurface.hpp \ @@ -28,7 +30,9 @@ cpp_files = \ andreasenhugevolatilityadapter.cpp \ blackvariancecurve.cpp \ blackvariancesurface.cpp \ + blackvolsurfacedelta.cpp \ blackvoltermstructure.cpp \ + blackvoltimeextrapolation.cpp \ fixedlocalvolsurface.cpp \ gridmodellocalvolsurface.cpp \ hestonblackvolsurface.cpp \ diff --git a/ql/termstructures/volatility/equityfx/all.hpp b/ql/termstructures/volatility/equityfx/all.hpp index f3e1d195b2..7a6ae90f87 100644 --- a/ql/termstructures/volatility/equityfx/all.hpp +++ b/ql/termstructures/volatility/equityfx/all.hpp @@ -7,7 +7,9 @@ #include #include #include +#include #include +#include #include #include #include diff --git a/ql/termstructures/volatility/equityfx/blackvariancecurve.cpp b/ql/termstructures/volatility/equityfx/blackvariancecurve.cpp index 2a2a684705..fb131fe97f 100644 --- a/ql/termstructures/volatility/equityfx/blackvariancecurve.cpp +++ b/ql/termstructures/volatility/equityfx/blackvariancecurve.cpp @@ -3,6 +3,7 @@ /* Copyright (C) 2002, 2003, 2004 Ferdinando Ametrano Copyright (C) 2003 StatPro Italia srl + Copyright (C) 2026 Paolo D'Elia This file is part of QuantLib, a free-software/open-source library for financial quantitative analysts and developers - http://quantlib.org/ @@ -28,9 +29,10 @@ namespace QuantLib { const std::vector& dates, const std::vector& blackVolCurve, DayCounter dayCounter, - bool forceMonotoneVariance) + bool forceMonotoneVariance, + BlackVolTimeExtrapolation::Type timeExtrapolationType) : BlackVarianceTermStructure(referenceDate), dayCounter_(std::move(dayCounter)), - maxDate_(dates.back()) { + maxDate_(dates.back()), timeExtrapolationType_(timeExtrapolationType) { QL_REQUIRE(dates.size()==blackVolCurve.size(), "mismatch between date vector and black vol vector"); @@ -62,12 +64,11 @@ namespace QuantLib { } Real BlackVarianceCurve::blackVarianceImpl(Time t, Real) const { - if (t<=times_.back()) { - return varianceCurve_(t, true); - } else { - // extrapolate with flat vol - return varianceCurve_(times_.back(), true)*t/times_.back(); - } + if (t <= times_.back()) + return std::max(varianceCurve_(t, true), 0.0); + else + return BlackVolTimeExtrapolation::extrapolatedVariance(timeExtrapolationType_, t, times_, + [&](Real t){ return varianceCurve_(t, true); }); } } diff --git a/ql/termstructures/volatility/equityfx/blackvariancecurve.hpp b/ql/termstructures/volatility/equityfx/blackvariancecurve.hpp index cc34f71c79..10e86b4612 100644 --- a/ql/termstructures/volatility/equityfx/blackvariancecurve.hpp +++ b/ql/termstructures/volatility/equityfx/blackvariancecurve.hpp @@ -3,6 +3,7 @@ /* Copyright (C) 2002, 2003, 2004 Ferdinando Ametrano Copyright (C) 2003 StatPro Italia srl + Copyright (C) 2026 Paolo D'Elia This file is part of QuantLib, a free-software/open-source library for financial quantitative analysts and developers - http://quantlib.org/ @@ -26,6 +27,7 @@ #define quantlib_black_variance_curve_hpp #include +#include #include namespace QuantLib { @@ -50,7 +52,8 @@ namespace QuantLib { const std::vector& dates, const std::vector& blackVolCurve, DayCounter dayCounter, - bool forceMonotoneVariance = true); + bool forceMonotoneVariance = true, + BlackVolTimeExtrapolation::Type timeExtrapolationType = BlackVolTimeExtrapolation::FlatVolatility); //! \name TermStructure interface //@{ DayCounter dayCounter() const override { return dayCounter_; } @@ -84,6 +87,7 @@ namespace QuantLib { std::vector