/src/quantlib/ql/time/calendars/southkorea.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 | | |
3 | | /* |
4 | | Copyright (C) 2004 FIMAT Group |
5 | | Copyright (C) 2007, 2011 StatPro Italia srl |
6 | | Copyright (C) 2008, 2011 Charles Chongseok Hyun |
7 | | Copyright (C) 2015 Riccardo Barone |
8 | | Copyright (C) 2015 Paolo Mazzocchi |
9 | | Copyright (C) 2023 Skandinaviska Enskilda Banken AB (publ) |
10 | | Copyright (C) 2023 Jonghee Lee |
11 | | |
12 | | This file is part of QuantLib, a free-software/open-source library |
13 | | for financial quantitative analysts and developers - http://quantlib.org/ |
14 | | |
15 | | QuantLib is free software: you can redistribute it and/or modify it |
16 | | under the terms of the QuantLib license. You should have received a |
17 | | copy of the license along with this program; if not, please email |
18 | | <quantlib-dev@lists.sf.net>. The license is also available online at |
19 | | <http://quantlib.org/license.shtml>. |
20 | | |
21 | | This program is distributed in the hope that it will be useful, but WITHOUT |
22 | | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
23 | | FOR A PARTICULAR PURPOSE. See the license for more details. |
24 | | */ |
25 | | |
26 | | #include <ql/time/calendars/southkorea.hpp> |
27 | | #include <ql/errors.hpp> |
28 | | |
29 | | namespace QuantLib { |
30 | | |
31 | 0 | SouthKorea::SouthKorea(Market market) { |
32 | | // all calendar instances share the same implementation instance |
33 | 0 | static ext::shared_ptr<Calendar::Impl> settlementImpl( |
34 | 0 | new SouthKorea::SettlementImpl); |
35 | 0 | static ext::shared_ptr<Calendar::Impl> krxImpl( |
36 | 0 | new SouthKorea::KrxImpl); |
37 | 0 | switch (market) { |
38 | 0 | case Settlement: |
39 | 0 | impl_ = settlementImpl; |
40 | 0 | break; |
41 | 0 | case KRX: |
42 | 0 | impl_ = krxImpl; |
43 | 0 | break; |
44 | 0 | default: |
45 | 0 | QL_FAIL("unknown market"); |
46 | 0 | } |
47 | 0 | } |
48 | | |
49 | 0 | bool SouthKorea::SettlementImpl::isWeekend(Weekday w) const { |
50 | 0 | return w == Saturday || w == Sunday; |
51 | 0 | } |
52 | | |
53 | 0 | bool SouthKorea::SettlementImpl::isBusinessDay(const Date& date) const { |
54 | 0 | Weekday w = date.weekday(); |
55 | 0 | Day d = date.dayOfMonth(); |
56 | 0 | Month m = date.month(); |
57 | 0 | Year y = date.year(); |
58 | |
|
59 | 0 | if (isWeekend(w) |
60 | | // New Year's Day |
61 | 0 | || (d == 1 && m == January) |
62 | | // Independence Day |
63 | 0 | || (d == 1 && m == March) |
64 | 0 | || (w == Monday && (d == 2 || d == 3) && m == March && y > 2021) |
65 | | // Arbour Day |
66 | 0 | || (d == 5 && m == April && y <= 2005) |
67 | | // Labour Day |
68 | 0 | || (d == 1 && m == May) |
69 | | // Children's Day |
70 | 0 | || (d == 5 && m == May) |
71 | 0 | || (w == Monday && (d == 6 || d == 7) && m == May && y > 2013) |
72 | | // Memorial Day |
73 | 0 | || (d == 6 && m == June) |
74 | | // Constitution Day |
75 | 0 | || (d == 17 && m == July && y <= 2007) |
76 | | // Liberation Day |
77 | 0 | || (d == 15 && m == August) |
78 | 0 | || (w == Monday && (d == 16 || d == 17) && m == August && y > 2020) |
79 | | // National Foundation Day |
80 | 0 | || (d == 3 && m == October) |
81 | 0 | || (w == Monday && (d == 4 || d == 5) && m == October && y > 2020) |
82 | | // Christmas Day |
83 | 0 | || (d == 25 && m == December) |
84 | 0 | || (w == Monday && (d == 26 || d == 27) && m == December && y > 2022) |
85 | | |
86 | | // Lunar New Year |
87 | 0 | || ((d == 21 || d == 22 || d == 23) && m == January && y == 2004) |
88 | 0 | || ((d == 8 || d == 9 || d == 10) && m == February && y == 2005) |
89 | 0 | || ((d == 28 || d == 29 || d == 30) && m == January && y == 2006) |
90 | 0 | || ( d == 19 && m == February && y == 2007) |
91 | 0 | || ((d == 6 || d == 7 || d == 8) && m == February && y == 2008) |
92 | 0 | || ((d == 25 || d == 26 || d == 27) && m == January && y == 2009) |
93 | 0 | || ((d == 13 || d == 14 || d == 15) && m == February && y == 2010) |
94 | 0 | || ((d == 2 || d == 3 || d == 4) && m == February && y == 2011) |
95 | 0 | || ((d == 23 || d == 24) && m == January && y == 2012) |
96 | 0 | || ( d == 11 && m == February && y == 2013) |
97 | 0 | || ((d == 30 || d == 31) && m == January && y == 2014) |
98 | 0 | || ((d == 18 || d == 19 || d == 20) && m == February && y == 2015) |
99 | 0 | || ((d >= 7 && d <= 10) && m == February && y == 2016) |
100 | 0 | || ((d >= 27 && d <= 30) && m == January && y == 2017) |
101 | 0 | || ((d == 15 || d == 16 || d == 17) && m == February && y == 2018) |
102 | 0 | || ((d == 4 || d == 5 || d == 6) && m == February && y == 2019) |
103 | 0 | || ((d >= 24 && d <= 27) && m == January && y == 2020) |
104 | 0 | || ((d == 11 || d == 12 || d == 13) && m == February && y == 2021) |
105 | 0 | || (((d == 31 && m == January) || ((d == 1 || d == 2) |
106 | 0 | && m == February)) && y == 2022) |
107 | 0 | || ((d == 23 || d == 24) && m == January && y == 2023) |
108 | 0 | || ((d >= 9 && d <= 12) && m == February && y == 2024) |
109 | 0 | || ((d == 28 || d == 29 || d == 30) && m == January && y == 2025) |
110 | 0 | || ((d == 16 || d == 17 || d == 18) && m == February && y == 2026) |
111 | 0 | || ((d == 8 || d == 9) && m == February && y == 2027) |
112 | 0 | || ((d == 26 || d == 27 || d == 28) && m == January && y == 2028) |
113 | 0 | || ((d == 12 || d == 13 || d == 14) && m == February && y == 2029) |
114 | 0 | || ((d == 4 || d == 5) && m == February && y == 2030) |
115 | 0 | || ((d == 22 || d == 23 || d == 24) && m == January && y == 2031) |
116 | 0 | || ((d == 10 || d == 11 || d == 12) && m == February && y == 2032) |
117 | 0 | || (((d == 31 && m == January) || ((d == 1|| d == 2) |
118 | 0 | && m == February)) && y == 2033) |
119 | 0 | || ((d == 20 || d == 21) && m == February && y == 2034) |
120 | 0 | || ((d == 7 || d == 8 || d == 9) && m == February && y == 2035) |
121 | 0 | || ((d == 28 || d == 29 || d == 30) && m == January && y == 2036) |
122 | 0 | || ((d == 16 || d == 17) && m == February && y == 2037) |
123 | 0 | || ((d == 3 || d == 4 || d == 5) && m == February && y == 2038) |
124 | 0 | || ((d == 24 || d == 25 || d == 26) && m == January && y == 2039) |
125 | 0 | || ((d == 13 || d == 14) && m == February && y == 2040) |
126 | 0 | || (((d == 31 && m == January) || ((d == 1|| d == 2) |
127 | 0 | && m == February)) && y == 2041) |
128 | 0 | || ((d == 21 || d == 22 || d == 23) && m == January && y == 2042) |
129 | 0 | || ((d == 9 || d == 10 || d == 11) && m == February && y == 2043) |
130 | 0 | || ((((d == 29|| d == 30|| d == 31) && m == January) |
131 | 0 | || (d == 1 && m == February)) && y == 2044) |
132 | 0 | || ((d == 16 || d == 17 || d == 18) && m == February && y == 2045) |
133 | 0 | || ((d == 5 || d == 6 || d == 7) && m == February && y == 2046) |
134 | 0 | || ((d >= 25 && d <= 28) && m == January && y == 2047) |
135 | 0 | || ((d == 13 || d == 14 || d == 15) && m == February && y == 2048) |
136 | 0 | || ((d == 1 || d == 2 || d == 3) && m == February && y == 2049) |
137 | 0 | || ((d == 24 || d == 25) && m == January && y == 2050) |
138 | | |
139 | | // Election Days |
140 | 0 | || (d == 15 && m == April && y == 2004) // National Assembly |
141 | 0 | || (d == 31 && m == May && y == 2006) // Regional election |
142 | 0 | || (d == 19 && m == December && y == 2007) // Presidency |
143 | 0 | || (d == 9 && m == April && y == 2008) // National Assembly |
144 | 0 | || (d == 2 && m == June && y == 2010) // Local election |
145 | 0 | || (d == 11 && m == April && y == 2012) // National Assembly |
146 | 0 | || (d == 19 && m == December && y == 2012) // Presidency |
147 | 0 | || (d == 4 && m == June && y == 2014) // Local election |
148 | 0 | || (d == 13 && m == April && y == 2016) // National Assembly |
149 | 0 | || (d == 9 && m == May && y == 2017) // Presidency |
150 | 0 | || (d == 13 && m == June && y == 2018) // Local election |
151 | 0 | || (d == 15 && m == April && y == 2020) // National Assembly |
152 | 0 | || (d == 9 && m == March && y == 2022) // Presidency |
153 | 0 | || (d == 1 && m == June && y == 2022) // Local election |
154 | 0 | || (d == 10 && m == April && y == 2024) // National Assembly |
155 | | // Buddha's birthday |
156 | 0 | || (d == 26 && m == May && y == 2004) |
157 | 0 | || (d == 15 && m == May && y == 2005) |
158 | 0 | || (d == 5 && m == May && y == 2006) |
159 | 0 | || (d == 24 && m == May && y == 2007) |
160 | 0 | || (d == 12 && m == May && y == 2008) |
161 | 0 | || (d == 2 && m == May && y == 2009) |
162 | 0 | || (d == 21 && m == May && y == 2010) |
163 | 0 | || (d == 10 && m == May && y == 2011) |
164 | 0 | || (d == 28 && m == May && y == 2012) |
165 | 0 | || (d == 17 && m == May && y == 2013) |
166 | 0 | || (d == 6 && m == May && y == 2014) |
167 | 0 | || (d == 25 && m == May && y == 2015) |
168 | 0 | || (d == 14 && m == May && y == 2016) |
169 | 0 | || (d == 3 && m == May && y == 2017) |
170 | 0 | || (d == 22 && m == May && y == 2018) |
171 | 0 | || (d == 12 && m == May && y == 2019) |
172 | 0 | || (d == 30 && m == April && y == 2020) |
173 | 0 | || (d == 19 && m == May && y == 2021) |
174 | 0 | || (d == 8 && m == May && y == 2022) |
175 | 0 | || (d == 29 && m == May && y == 2023) // Substitute holiday |
176 | 0 | || (d == 15 && m == May && y == 2024) |
177 | 0 | || (d == 6 && m == May && y == 2025) |
178 | 0 | || (d == 25 && m == May && y == 2026) // Substitute holiday |
179 | 0 | || (d == 13 && m == May && y == 2027) |
180 | 0 | || (d == 2 && m == May && y == 2028) |
181 | 0 | || (d == 21 && m == May && y == 2029) // Substitute holiday |
182 | 0 | || (d == 9 && m == May && y == 2030) |
183 | 0 | || (d == 28 && m == May && y == 2031) |
184 | 0 | || (d == 17 && m == May && y == 2032) // Substitute holiday |
185 | 0 | || (d == 6 && m == May && y == 2033) |
186 | 0 | || (d == 25 && m == May && y == 2034) |
187 | 0 | || (d == 15 && m == May && y == 2035) |
188 | 0 | || (d == 6 && m == May && y == 2036) // Substitute holiday |
189 | 0 | || (d == 22 && m == May && y == 2037) |
190 | 0 | || (d == 11 && m == May && y == 2038) |
191 | 0 | || (d == 2 && m == May && y == 2039) // Substitute holiday |
192 | 0 | || (d == 18 && m == May && y == 2040) |
193 | 0 | || (d == 7 && m == May && y == 2041) |
194 | 0 | || (d == 26 && m == May && y == 2042) |
195 | 0 | || (d == 18 && m == May && y == 2043) // Substitute holiday |
196 | 0 | || (d == 6 && m == May && y == 2044) |
197 | 0 | || (d == 24 && m == May && y == 2045) |
198 | 0 | || (d == 14 && m == May && y == 2046) // Substitute holiday |
199 | 0 | || (d == 2 && m == May && y == 2047) |
200 | 0 | || (d == 20 && m == May && y == 2048) |
201 | 0 | || (d == 10 && m == May && y == 2049) // Substitute holiday |
202 | 0 | || (d == 30 && m == May && y == 2050) // Substitute holiday |
203 | | |
204 | | // Special holiday: 70 years from Independence Day |
205 | 0 | || (d == 14 && m == August && y == 2015) |
206 | | // Special temporary holiday |
207 | 0 | || (d == 17 && m == August && y == 2020) |
208 | 0 | || (d == 2 && m == October && y == 2023) |
209 | 0 | || (d == 1 && m == October && y == 2024) |
210 | | |
211 | | // Harvest Moon Day |
212 | 0 | || ((d == 27 || d == 28 || d == 29) && m == September && y == 2004) |
213 | 0 | || ((d == 17 || d == 18 || d == 19) && m == September && y == 2005) |
214 | 0 | || ((d == 5 || d == 6 || d == 7) && m == October && y == 2006) |
215 | 0 | || ((d == 24 || d == 25 || d == 26) && m == September && y == 2007) |
216 | 0 | || ((d == 13 || d == 14 || d == 15) && m == September && y == 2008) |
217 | 0 | || ((d == 2 || d == 3 || d == 4) && m == October && y == 2009) |
218 | 0 | || ((d == 21 || d == 22 || d == 23) && m == September && y == 2010) |
219 | 0 | || ((d == 12 || d == 13) && m == September && y == 2011) |
220 | 0 | || ((d == 1) && m == October && y == 2012) |
221 | 0 | || ((d == 18 || d == 19 || d == 20) && m == September && y == 2013) |
222 | 0 | || ((d == 8 || d == 9 || d == 10) && m == September && y == 2014) |
223 | 0 | || ((d == 28 || d == 29) && m == September && y == 2015) |
224 | 0 | || ((d == 14 || d == 15 || d == 16) && m == September && y == 2016) |
225 | 0 | || ((d >= 3 && d <= 6) && m == October && y == 2017) |
226 | 0 | || ((d >= 23 && d <= 26) && m == September && y == 2018) |
227 | 0 | || ((d == 12 || d == 13 || d == 14) && m == September && y == 2019) |
228 | 0 | || (((d == 30 && m == September) || ((d == 1 || d == 2) |
229 | 0 | && m == October)) && y == 2020) |
230 | 0 | || ((d == 20 || d == 21 || d == 22) && m == September && y == 2021) |
231 | 0 | || ((d == 9 || d == 10 || d == 11) && m == September && y == 2022) |
232 | 0 | || ((d >= 9 && d <= 12) && m == September && y == 2022) |
233 | 0 | || ((d == 28 || d == 29 || d == 30) && m == September && y == 2023) |
234 | 0 | || ((d == 16 || d == 17 || d == 18) && m == September && y == 2024) |
235 | 0 | || ((d == 6 || d == 7 || d == 8) && m == October && y == 2025) |
236 | 0 | || ((d == 24 || d == 25 || d == 26) && m == September && y == 2026) |
237 | 0 | || ((d == 14 || d == 15 || d == 16) && m == September && y == 2027) |
238 | 0 | || ((d >= 2 && d <= 5) && m == October && y == 2028) |
239 | 0 | || ((d >= 21 && d <= 24) && m == September && y == 2029) |
240 | 0 | || ((d == 11 || d == 12 || d == 13) && m == September && y == 2030) |
241 | 0 | || (((d == 30 && m == September) || ((d == 1 || d == 2) |
242 | 0 | && m == October)) && y == 2031) |
243 | 0 | || ((d == 20 || d == 21) && m == September && y == 2032) |
244 | 0 | || ((d == 7 || d == 8 || d == 9) && m == September && y == 2033) |
245 | 0 | || ((d == 26 || d == 27 || d == 28) && m == September && y == 2034) |
246 | 0 | || ((d == 17 || d == 18) && m == September && y == 2035) |
247 | 0 | || ((d >= 3 && d <= 7) && m == October && y == 2036) |
248 | 0 | || ((d == 23 || d == 24 || d == 25) && m == September && y == 2037) |
249 | 0 | || ((d == 13 || d == 14 || d == 15) && m == September && y == 2038) |
250 | 0 | || ((d == 3 || d == 4 || d == 5) && m == October && y == 2039) |
251 | 0 | || ((d == 20 || d == 21 || d == 22) && m == September && y == 2040) |
252 | 0 | || ((d == 9 || d == 10 || d == 11) && m == September && y == 2041) |
253 | 0 | || ((d == 29 || d == 30) && m == September && y == 2042) |
254 | 0 | || ((d == 16 || d == 17 || d == 18) && m == September && y == 2043) |
255 | 0 | || ((d == 4 || d == 5 || d == 6) && m == October && y == 2044) |
256 | 0 | || ((d == 25 || d == 26 || d == 27) && m == September && y == 2045) |
257 | 0 | || ((d >= 14 && d <= 17) && m == September && y == 2046) |
258 | 0 | || ((d == 4 || d == 5 || d == 7) && m == October && y == 2047) |
259 | 0 | || ((d == 21 || d == 22 || d == 23) && m == September && y == 2048) |
260 | 0 | || ((d >= 10 && d <= 13) && m == September && y == 2049) |
261 | 0 | || ((((d == 29|| d == 30) && m == September) |
262 | 0 | || (d == 1 && m == October)) && y == 2050) |
263 | | |
264 | | // Hangul Proclamation of Korea |
265 | 0 | || (d == 9 && m == October && y >= 2013) |
266 | 0 | || (w == Monday && (d == 10 || d == 11) && m == October && y > 2020) |
267 | 0 | ) |
268 | 0 | return false; // NOLINT(readability-simplify-boolean-expr) |
269 | | |
270 | 0 | return true; |
271 | 0 | } |
272 | | |
273 | 0 | bool SouthKorea::KrxImpl::isBusinessDay(const Date& date) const { |
274 | | // public holidays |
275 | 0 | if ( !SettlementImpl::isBusinessDay(date) ) |
276 | 0 | return false; |
277 | | |
278 | 0 | Day d = date.dayOfMonth(); |
279 | 0 | Weekday w = date.weekday(); |
280 | 0 | Month m = date.month(); |
281 | 0 | Year y = date.year(); |
282 | |
|
283 | 0 | if (// Year-end closing |
284 | 0 | ((((d == 29 || d == 30) && w == Friday) || d == 31) |
285 | 0 | && m == December) |
286 | 0 | ) |
287 | 0 | return false; |
288 | 0 | if (// occasional closing days (KRX day) |
289 | 0 | (d == 6 && m == May && y == 2016) || |
290 | 0 | (d == 2 && m == October && y == 2017) |
291 | 0 | ) |
292 | 0 | return false; |
293 | | |
294 | 0 | return true; |
295 | 0 | } |
296 | | |
297 | | } |
298 | | |