From 3a044ac11eca4819cce94f1244fb6edc7d252b44 Mon Sep 17 00:00:00 2001 From: wegamekinglc Date: Mon, 1 Jan 2024 17:47:00 +0800 Subject: [PATCH 1/2] added china calendar for the year 2024 --- ql/time/calendars/china.cpp | 21 ++++++++++++++++++--- test-suite/calendars.cpp | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/ql/time/calendars/china.cpp b/ql/time/calendars/china.cpp index fbe5947ad49..6de2a69ade6 100644 --- a/ql/time/calendars/china.cpp +++ b/ql/time/calendars/china.cpp @@ -95,6 +95,7 @@ namespace QuantLib { || (y == 2021 && (d == 11 || d == 12 || d == 15 || d == 16 || d == 17) && m == February) || (y == 2022 && ((d == 31 && m == January) || (d <= 4 && m == February))) || (y == 2023 && d >= 23 && d <= 27 && m == January) + || (y == 2024 && (d == 9 || (d >= 12 && d <= 16)) && m == February) // Ching Ming Festival || (y <= 2008 && d == 4 && m == April) || (y == 2009 && d == 6 && m == April) @@ -112,6 +113,7 @@ namespace QuantLib { || (y == 2021 && d == 5 && m == April) || (y == 2022 && d >= 4 && d <= 5 && m == April) || (y == 2023 && d == 5 && m == April) + || (y == 2024 && d >= 4 && d <= 5 && m == April) // Labor Day || (y <= 2007 && d >= 1 && d <= 7 && m == May) || (y == 2008 && d >= 1 && d <= 2 && m == May) @@ -132,6 +134,7 @@ namespace QuantLib { || (y == 2021 && (d == 3 || d == 4 || d == 5) && m == May) || (y == 2022 && d >= 2 && d <= 4 && m == May) || (y == 2023 && d >= 1 && d <= 3 && m == May) + || (y == 2024 && d >= 1 && d <= 3 && m == May) // Tuen Ng Festival || (y <= 2008 && d == 9 && m == June) || (y == 2009 && (d == 28 || d == 29) && m == May) @@ -149,6 +152,7 @@ namespace QuantLib { || (y == 2021 && d == 14 && m == June) || (y == 2022 && d == 3 && m == June) || (y == 2023 && d >= 22 && d <= 23 && m == June) + || (y == 2024 && d == 10 && m == June) // Mid-Autumn Festival || (y <= 2008 && d == 15 && m == September) || (y == 2010 && d >= 22 && d <= 24 && m == September) @@ -163,6 +167,7 @@ namespace QuantLib { || (y == 2021 && (d == 20 || d == 21) && m == September) || (y == 2022 && d == 12 && m == September) || (y == 2023 && d == 29 && m == September) + || (y == 2024 && d >= 16 && d <= 17 && m == September) // National Day || (y <= 2007 && d >= 1 && d <= 7 && m == October) || (y == 2008 && ((d >= 29 && m == September) || @@ -183,6 +188,7 @@ namespace QuantLib { || (y == 2021 && (d == 1 || d == 4 || d == 5 || d == 6 || d == 7) && m == October) || (y == 2022 && d >= 3 && d <= 7 && m == October) || (y == 2023 && d >= 2 && d <= 6 && m == October) + || (y == 2024 && ((d >= 1 && d <= 4) || d == 7) && m == October) // 70th anniversary of the victory of anti-Japaneses war || (y == 2015 && d >= 3 && d <= 4 && m == September) ) @@ -338,10 +344,19 @@ namespace QuantLib { Date(6, May, 2023), Date(25, June, 2023), Date(7, October, 2023), - Date(8, October, 2023) + Date(8, October, 2023), + // 2024 + Date(4, Feb, 2024), + Date(9, Feb, 2024), + Date(18, Feb, 2024), + Date(7, Apr, 2024), + Date(28, Apr, 2024), + Date(11, May, 2024), + Date(14, Sep, 2024), + Date(29, Sep, 2024), + Date(12, October, 2024) }; - static const Size n = - sizeof(working_weekends)/sizeof(working_weekends[0]); + static const Size n = sizeof(working_weekends) / sizeof(working_weekends[0]); static const std::set workingWeekends(working_weekends+0, working_weekends+n); diff --git a/test-suite/calendars.cpp b/test-suite/calendars.cpp index 52ff7b0d1af..db33b286f56 100644 --- a/test-suite/calendars.cpp +++ b/test-suite/calendars.cpp @@ -3177,8 +3177,30 @@ BOOST_AUTO_TEST_CASE(testChinaSSE) { expectedHol.emplace_back(5, October, 2023); expectedHol.emplace_back(6, October, 2023); + // China Shanghai Securities Exchange holiday list in the year 2024 + expectedHol.emplace_back(1, Jan, 2024); + expectedHol.emplace_back(9, Feb, 2024); + expectedHol.emplace_back(12, Feb, 2024); + expectedHol.emplace_back(13, Feb, 2024); + expectedHol.emplace_back(14, Feb, 2024); + expectedHol.emplace_back(15, Feb, 2024); + expectedHol.emplace_back(16, Feb, 2024); + expectedHol.emplace_back(4, April, 2024); + expectedHol.emplace_back(5, April, 2024); + expectedHol.emplace_back(1, May, 2024); + expectedHol.emplace_back(2, May, 2024); + expectedHol.emplace_back(3, May, 2024); + expectedHol.emplace_back(10, Jun, 2024); + expectedHol.emplace_back(16, Sep, 2024); + expectedHol.emplace_back(17, Sep, 2024); + expectedHol.emplace_back(1, Oct, 2024); + expectedHol.emplace_back(2, Oct, 2024); + expectedHol.emplace_back(3, Oct, 2024); + expectedHol.emplace_back(4, Oct, 2024); + expectedHol.emplace_back(7, Oct, 2024); + Calendar c = China(China::SSE); - std::vector hol = c.holidayList(Date(1, January, 2014), Date(31, December, 2023)); + std::vector hol = c.holidayList(Date(1, January, 2014), Date(31, December, 2024)); for (Size i = 0; i < std::min(hol.size(), expectedHol.size()); i++) { if (hol[i] != expectedHol[i]) @@ -3276,9 +3298,19 @@ BOOST_AUTO_TEST_CASE(testChinaIB) { expectedWorkingWeekEnds.emplace_back(7, October, 2023); expectedWorkingWeekEnds.emplace_back(8, October, 2023); + // China Inter Bank working weekends list in the year 2024 + expectedWorkingWeekEnds.emplace_back(4, Feb, 2024); + expectedWorkingWeekEnds.emplace_back(18, Feb, 2024); + expectedWorkingWeekEnds.emplace_back(7, April, 2024); + expectedWorkingWeekEnds.emplace_back(28, April, 2024); + expectedWorkingWeekEnds.emplace_back(11, May, 2024); + expectedWorkingWeekEnds.emplace_back(14, Sep, 2024); + expectedWorkingWeekEnds.emplace_back(29, Sep, 2024); + expectedWorkingWeekEnds.emplace_back(12, October, 2024); + Calendar c = China(China::IB); Date start(1, Jan, 2014); - Date end(31, Dec, 2023); + Date end(31, Dec, 2024); Size k = 0; From 07a972a10e09e91d1553b0eb5ed39cd7e9409fff Mon Sep 17 00:00:00 2001 From: Luigi Ballabio Date: Thu, 4 Jan 2024 10:35:14 +0100 Subject: [PATCH 2/2] std::set can be initialized directly --- ql/time/calendars/china.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ql/time/calendars/china.cpp b/ql/time/calendars/china.cpp index 6de2a69ade6..30ff5bab390 100644 --- a/ql/time/calendars/china.cpp +++ b/ql/time/calendars/china.cpp @@ -201,7 +201,7 @@ namespace QuantLib { } bool China::IbImpl::isBusinessDay(const Date& date) const { - static const Date working_weekends[] = { + static const std::set workingWeekends = { // 2005 Date(5, February, 2005), Date(6, February, 2005), @@ -356,9 +356,6 @@ namespace QuantLib { Date(29, Sep, 2024), Date(12, October, 2024) }; - static const Size n = sizeof(working_weekends) / sizeof(working_weekends[0]); - static const std::set workingWeekends(working_weekends+0, - working_weekends+n); // If it is already a SSE business day, it must be a IB business day return sseImpl->isBusinessDay(date) ||