From 145d2350910eb5decf9285a6eed088848bdae788 Mon Sep 17 00:00:00 2001 From: Luigi Ballabio Date: Mon, 23 Sep 2024 15:19:20 +0200 Subject: [PATCH] Add method for last fixing date to YoY inflation index --- ql/indexes/inflationindex.cpp | 11 +++++++++++ ql/indexes/inflationindex.hpp | 1 + test-suite/inflation.cpp | 14 ++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/ql/indexes/inflationindex.cpp b/ql/indexes/inflationindex.cpp index 6f54bd5b6f..66d1c5c54a 100644 --- a/ql/indexes/inflationindex.cpp +++ b/ql/indexes/inflationindex.cpp @@ -275,6 +275,17 @@ namespace QuantLib { } } + Date YoYInflationIndex::lastFixingDate() const { + if (ratio()) { + return underlyingIndex_->lastFixingDate(); + } else { + const auto& fixings = timeSeries(); + QL_REQUIRE(!fixings.empty(), "no fixings stored for " << name()); + // attribute fixing to first day of the underlying period + return inflationPeriod(fixings.lastDate(), frequency_).first; + } + } + bool YoYInflationIndex::needsForecast(const Date& fixingDate) const { Date today = Settings::instance().evaluationDate(); diff --git a/ql/indexes/inflationindex.hpp b/ql/indexes/inflationindex.hpp index 114e8274f5..aa938966aa 100644 --- a/ql/indexes/inflationindex.hpp +++ b/ql/indexes/inflationindex.hpp @@ -228,6 +228,7 @@ namespace QuantLib { //! \name Other methods //@{ + Date lastFixingDate() const; bool interpolated() const; bool ratio() const; ext::shared_ptr underlyingIndex() const; diff --git a/test-suite/inflation.cpp b/test-suite/inflation.cpp index 4401bde222..a2d4086429 100644 --- a/test-suite/inflation.cpp +++ b/test-suite/inflation.cpp @@ -868,6 +868,9 @@ BOOST_AUTO_TEST_CASE(testQuotedYYIndexFutureFixing) { quoted_flat.addFixing({1,January,2024}, 100.1); quoted_flat.addFixing({1,February,2024}, 100.2); + BOOST_CHECK_EQUAL(quoted_flat.lastFixingDate(), Date(1,February,2024)); + BOOST_CHECK_EQUAL(quoted_linear.lastFixingDate(), Date(1,February,2024)); + // mid-January fixing: ok for both flat and interpolated BOOST_CHECK_NO_THROW(quoted_flat.fixing({15,January,2024})); BOOST_CHECK_NO_THROW(quoted_linear.fixing({15,January,2024})); @@ -883,6 +886,10 @@ BOOST_AUTO_TEST_CASE(testQuotedYYIndexFutureFixing) { // both ok after March is published: quoted_flat.addFixing({1,March,2024}, 100.3); + + BOOST_CHECK_EQUAL(quoted_flat.lastFixingDate(), Date(1,March,2024)); + BOOST_CHECK_EQUAL(quoted_linear.lastFixingDate(), Date(1,March,2024)); + BOOST_CHECK_NO_THROW(quoted_flat.fixing({15,February,2024})); BOOST_CHECK_NO_THROW(quoted_linear.fixing({15,February,2024})); @@ -1034,6 +1041,9 @@ BOOST_AUTO_TEST_CASE(testRatioYYIndexFutureFixing) { euhicp->addFixing({1,January,2024}, 100.1); euhicp->addFixing({1,February,2024}, 100.2); + BOOST_CHECK_EQUAL(ratio_flat.lastFixingDate(), Date(1,February,2024)); + BOOST_CHECK_EQUAL(ratio_linear.lastFixingDate(), Date(1,February,2024)); + // mid-January fixing: ok for both flat and interpolated BOOST_CHECK_NO_THROW(ratio_flat.fixing({15,January,2024})); BOOST_CHECK_NO_THROW(ratio_linear.fixing({15,January,2024})); @@ -1049,6 +1059,10 @@ BOOST_AUTO_TEST_CASE(testRatioYYIndexFutureFixing) { // both ok after March is published: euhicp->addFixing({1,March,2024}, 100.3); + + BOOST_CHECK_EQUAL(ratio_flat.lastFixingDate(), Date(1,March,2024)); + BOOST_CHECK_EQUAL(ratio_linear.lastFixingDate(), Date(1,March,2024)); + BOOST_CHECK_NO_THROW(ratio_flat.fixing({15,February,2024})); BOOST_CHECK_NO_THROW(ratio_linear.fixing({15,February,2024}));