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