pandas-market-calendars 5.0.0__py3-none-any.whl → 5.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. pandas_market_calendars/__init__.py +39 -39
  2. pandas_market_calendars/calendar_registry.py +57 -57
  3. pandas_market_calendars/calendar_utils.py +1151 -1147
  4. pandas_market_calendars/calendars/asx.py +77 -70
  5. pandas_market_calendars/calendars/bmf.py +226 -219
  6. pandas_market_calendars/calendars/bse.py +432 -425
  7. pandas_market_calendars/calendars/cboe.py +156 -149
  8. pandas_market_calendars/calendars/cme.py +412 -405
  9. pandas_market_calendars/calendars/cme_globex_agriculture.py +172 -172
  10. pandas_market_calendars/calendars/cme_globex_base.py +126 -119
  11. pandas_market_calendars/calendars/cme_globex_crypto.py +165 -158
  12. pandas_market_calendars/calendars/cme_globex_energy_and_metals.py +223 -216
  13. pandas_market_calendars/calendars/cme_globex_equities.py +130 -123
  14. pandas_market_calendars/calendars/cme_globex_fixed_income.py +136 -136
  15. pandas_market_calendars/calendars/cme_globex_fx.py +101 -101
  16. pandas_market_calendars/calendars/eurex.py +138 -131
  17. pandas_market_calendars/calendars/eurex_fixed_income.py +105 -98
  18. pandas_market_calendars/calendars/hkex.py +438 -431
  19. pandas_market_calendars/calendars/ice.py +88 -81
  20. pandas_market_calendars/calendars/iex.py +162 -155
  21. pandas_market_calendars/calendars/jpx.py +124 -117
  22. pandas_market_calendars/calendars/lse.py +125 -118
  23. pandas_market_calendars/calendars/mirror.py +144 -144
  24. pandas_market_calendars/calendars/nyse.py +1472 -1466
  25. pandas_market_calendars/calendars/ose.py +125 -118
  26. pandas_market_calendars/calendars/sifma.py +390 -356
  27. pandas_market_calendars/calendars/six.py +143 -136
  28. pandas_market_calendars/calendars/sse.py +322 -315
  29. pandas_market_calendars/calendars/tase.py +231 -224
  30. pandas_market_calendars/calendars/tsx.py +192 -185
  31. pandas_market_calendars/class_registry.py +115 -115
  32. pandas_market_calendars/holidays/cme.py +385 -385
  33. pandas_market_calendars/holidays/cme_globex.py +214 -214
  34. pandas_market_calendars/holidays/cn.py +1476 -1476
  35. pandas_market_calendars/holidays/jp.py +401 -401
  36. pandas_market_calendars/holidays/jpx_equinox.py +506 -506
  37. pandas_market_calendars/holidays/nyse.py +1536 -1536
  38. pandas_market_calendars/holidays/oz.py +63 -63
  39. pandas_market_calendars/holidays/sifma.py +350 -350
  40. pandas_market_calendars/holidays/us.py +376 -376
  41. pandas_market_calendars/market_calendar.py +1008 -1008
  42. {pandas_market_calendars-5.0.0.dist-info → pandas_market_calendars-5.1.1.dist-info}/METADATA +3 -1
  43. pandas_market_calendars-5.1.1.dist-info/RECORD +50 -0
  44. {pandas_market_calendars-5.0.0.dist-info → pandas_market_calendars-5.1.1.dist-info}/WHEEL +1 -1
  45. pandas_market_calendars-5.0.0.dist-info/RECORD +0 -50
  46. {pandas_market_calendars-5.0.0.dist-info → pandas_market_calendars-5.1.1.dist-info}/licenses/LICENSE +0 -0
  47. {pandas_market_calendars-5.0.0.dist-info → pandas_market_calendars-5.1.1.dist-info}/licenses/NOTICE +0 -0
  48. {pandas_market_calendars-5.0.0.dist-info → pandas_market_calendars-5.1.1.dist-info}/top_level.txt +0 -0
@@ -1,431 +1,438 @@
1
- from datetime import time, timedelta
2
- from functools import partial
3
-
4
- from pandas import DateOffset, Timestamp
5
- from pandas.tseries.holiday import (
6
- AbstractHolidayCalendar,
7
- EasterMonday,
8
- GoodFriday,
9
- Holiday,
10
- sunday_to_monday,
11
- )
12
- from pandas.tseries.offsets import LastWeekOfMonth, WeekOfMonth
13
- from zoneinfo import ZoneInfo
14
-
15
- from pandas_market_calendars.holidays.cn import (
16
- bsd_mapping,
17
- dbf_mapping,
18
- dnf_mapping,
19
- maf_mapping,
20
- sf_mapping,
21
- tsd_mapping,
22
- )
23
- from pandas_market_calendars.holidays.us import USNewYearsDay
24
- from pandas_market_calendars.market_calendar import MarketCalendar
25
-
26
-
27
- def process_date(dt, mapping=None, func=None, delta=None, offset=None):
28
- if mapping and (dt.year in mapping):
29
- new_dt = mapping[dt.year]
30
- else:
31
- new_dt = dt
32
- if delta:
33
- new_dt = new_dt + timedelta(delta)
34
- dow = new_dt.weekday()
35
- if dow == 6 and offset: # sunday
36
- new_dt = new_dt + timedelta(offset)
37
- if func:
38
- return func(new_dt)
39
- return new_dt
40
-
41
-
42
- def process_queen_birthday(dt):
43
- # before 1983
44
- if dt.year in [1974, 1981]:
45
- return dt + DateOffset(weekday=6)
46
- elif dt.year < 1983:
47
- return sunday_to_monday(dt)
48
- # after 1983
49
- wom = WeekOfMonth(week=2, weekday=0)
50
- if dt.year in [1983, 1988, 1993, 1994]:
51
- wom = WeekOfMonth(week=1, weekday=0)
52
- if dt.year in [1985]:
53
- wom = WeekOfMonth(week=3, weekday=0)
54
- return dt + wom
55
-
56
-
57
- HKNewYearsDay = USNewYearsDay
58
-
59
- SpringFestivalDayBefore1983 = Holiday(
60
- name="Spring Festival",
61
- month=1,
62
- day=21,
63
- observance=partial(process_date, mapping=sf_mapping, delta=0, offset=3),
64
- start_date=Timestamp("1961-01-01"),
65
- end_date=Timestamp("1983-01-01"),
66
- )
67
-
68
- SpringFestivalDay2Before1983 = Holiday(
69
- name="Spring Festival",
70
- month=1,
71
- day=21,
72
- observance=partial(process_date, mapping=sf_mapping, delta=1, offset=2),
73
- start_date=Timestamp("1961-01-01"),
74
- end_date=Timestamp("1983-01-01"),
75
- )
76
-
77
- SpringFestivalDay3Before1983 = Holiday(
78
- name="Spring Festival",
79
- month=1,
80
- day=21,
81
- observance=partial(process_date, mapping=sf_mapping, delta=2, offset=1),
82
- start_date=Timestamp("1961-01-01"),
83
- end_date=Timestamp("1983-01-01"),
84
- )
85
-
86
- SpringFestivalDayBefore2010 = Holiday(
87
- name="Spring Festival",
88
- month=1,
89
- day=21,
90
- observance=partial(process_date, mapping=sf_mapping, delta=0, offset=-1),
91
- start_date=Timestamp("1983-01-01"),
92
- end_date=Timestamp("2010-07-01"),
93
- )
94
-
95
- SpringFestivalDay2Before2010 = Holiday(
96
- name="Spring Festival",
97
- month=1,
98
- day=21,
99
- observance=partial(process_date, mapping=sf_mapping, delta=1, offset=-2),
100
- start_date=Timestamp("1983-01-01"),
101
- end_date=Timestamp("2010-07-01"),
102
- )
103
-
104
- SpringFestivalDay3Before2010 = Holiday(
105
- name="Spring Festival",
106
- month=1,
107
- day=21,
108
- observance=partial(process_date, mapping=sf_mapping, delta=2, offset=-3),
109
- start_date=Timestamp("1983-01-01"),
110
- end_date=Timestamp("2010-07-01"),
111
- )
112
-
113
- SpringFestivalDay = Holiday(
114
- name="Spring Festival",
115
- month=1,
116
- day=21,
117
- observance=partial(process_date, mapping=sf_mapping, delta=0, offset=3),
118
- start_date=Timestamp("2010-07-01"),
119
- )
120
-
121
- SpringFestivalDay2 = Holiday(
122
- name="Spring Festival",
123
- month=1,
124
- day=21,
125
- observance=partial(process_date, mapping=sf_mapping, delta=1, offset=2),
126
- start_date=Timestamp("2010-07-01"),
127
- )
128
-
129
- SpringFestivalDay3 = Holiday(
130
- name="Spring Festival",
131
- month=1,
132
- day=21,
133
- observance=partial(process_date, mapping=sf_mapping, delta=2, offset=1),
134
- start_date=Timestamp("2010-07-01"),
135
- )
136
-
137
- TombSweepingDay = Holiday(
138
- name="Tomb-sweeping Day", # 清明节4月5日
139
- month=4,
140
- day=4,
141
- observance=partial(process_date, mapping=tsd_mapping, func=sunday_to_monday),
142
- start_date=Timestamp("1961-01-01"),
143
- )
144
-
145
- LabourDay = Holiday(
146
- name="Labour Day", # 劳动节
147
- month=5,
148
- day=1,
149
- observance=sunday_to_monday,
150
- start_date=Timestamp("1999-05-01"),
151
- )
152
-
153
- BuddhaShakyamuniDay = Holiday(
154
- name="Buddha Shakyamuni Day", # 浴佛节 98年农历4月8日定为法定假日
155
- month=4,
156
- day=28,
157
- observance=partial(process_date, mapping=bsd_mapping, func=sunday_to_monday),
158
- start_date=Timestamp("1999-04-28"),
159
- )
160
-
161
- DragonBoatFestivalDay = Holiday(
162
- name="Dragon Boat Festival", # 端午节
163
- month=5,
164
- day=27,
165
- observance=partial(process_date, mapping=dbf_mapping, func=sunday_to_monday),
166
- start_date=Timestamp("1961-01-01"),
167
- )
168
-
169
- HKRegionEstablishmentDay = Holiday(
170
- name="Hong Kong Special Region Establishment Day",
171
- month=7,
172
- day=1,
173
- observance=sunday_to_monday,
174
- start_date=Timestamp("1997-07-01"),
175
- )
176
-
177
- MidAutumnFestivalDayBefore1983 = Holiday(
178
- name="Mid-autumn Festival", # 中秋节翌日
179
- month=9,
180
- day=7,
181
- observance=partial(
182
- process_date, mapping=maf_mapping, delta=1, func=sunday_to_monday
183
- ),
184
- start_date=Timestamp("1961-01-01"),
185
- end_date=Timestamp("1983-01-01"),
186
- )
187
-
188
- MidAutumnFestivalDayBefore2010 = Holiday(
189
- name="Mid-autumn Festival", # 中秋节翌日
190
- month=9,
191
- day=7,
192
- observance=partial(process_date, mapping=maf_mapping, delta=1, offset=-1),
193
- start_date=Timestamp("1983-01-01"),
194
- end_date=Timestamp("2010-12-31"),
195
- )
196
-
197
- MidAutumnFestivalDay = Holiday(
198
- name="Mid-autumn Festival", # 中秋节翌日
199
- month=9,
200
- day=7,
201
- observance=partial(process_date, mapping=maf_mapping, delta=1, func=sunday_to_monday),
202
- start_date=Timestamp("2011-01-01"),
203
- )
204
-
205
- DoubleNinthFestivalDay = Holiday(
206
- name="Double Ninth Festival", # 重阳节
207
- month=10,
208
- day=2,
209
- observance=partial(process_date, mapping=dnf_mapping, func=sunday_to_monday),
210
- start_date=Timestamp("1961-01-01"),
211
- )
212
-
213
- NationalDay = Holiday(
214
- name="National Day",
215
- month=10,
216
- day=1,
217
- observance=sunday_to_monday,
218
- start_date=Timestamp("1997-07-01"),
219
- )
220
-
221
- Christmas = Holiday(
222
- name="Christmas",
223
- month=12,
224
- day=25,
225
- observance=partial(process_date, offset=2),
226
- start_date=Timestamp("1954-01-01"),
227
- )
228
-
229
- BoxingDay = Holiday(
230
- name="Boxing day", # 圣诞节后第一个平日
231
- month=12,
232
- day=26,
233
- observance=sunday_to_monday,
234
- start_date=Timestamp("1954-01-01"),
235
- )
236
-
237
- QueenBirthday = Holiday(
238
- name="Queen's Birthday", # 英女王生日 6月
239
- month=6,
240
- day=10,
241
- observance=process_queen_birthday,
242
- start_date=Timestamp("1983-01-01"),
243
- end_date=Timestamp("1997-06-01"),
244
- )
245
-
246
- QueenBirthday2 = Holiday(
247
- name="Queen's Birthday", # 英女王生日 4月
248
- month=4,
249
- day=21,
250
- observance=process_queen_birthday,
251
- start_date=Timestamp("1926-04-21"),
252
- end_date=Timestamp("1983-01-01"),
253
- )
254
-
255
- CommemoratingAlliedVictory = Holiday(
256
- name="Commemorating the allied victory", # 重光纪念日 8月最后一个星期一
257
- month=8,
258
- day=20,
259
- offset=LastWeekOfMonth(weekday=0),
260
- start_date=Timestamp("1945-08-30"),
261
- end_date=Timestamp("1997-07-01"),
262
- )
263
-
264
- IDontKnow = Holiday(
265
- name="I dont know these days, please tell me", # 8月第一个星期一
266
- month=7,
267
- day=31,
268
- offset=WeekOfMonth(week=0, weekday=0),
269
- start_date=Timestamp("1960-08-01"),
270
- end_date=Timestamp("1983-01-01"),
271
- )
272
-
273
- HKClosedDay = [
274
- # I dont know these days
275
- Timestamp("1970-07-01", tz="UTC"),
276
- Timestamp("1971-07-01", tz="UTC"),
277
- Timestamp("1973-07-02", tz="UTC"),
278
- Timestamp("1974-07-01", tz="UTC"),
279
- Timestamp("1975-07-01", tz="UTC"),
280
- Timestamp("1976-07-01", tz="UTC"),
281
- Timestamp("1977-07-01", tz="UTC"),
282
- Timestamp("1979-07-02", tz="UTC"),
283
- Timestamp("1980-07-01", tz="UTC"),
284
- Timestamp("1981-07-01", tz="UTC"),
285
- Timestamp("1982-07-01", tz="UTC"),
286
- Timestamp("1971-03-22", tz="UTC"),
287
- Timestamp("1971-12-06", tz="UTC"),
288
- Timestamp("1971-12-20", tz="UTC"),
289
- Timestamp("1975-07-28", tz="UTC"),
290
- Timestamp("1985-07-29", tz="UTC"),
291
- Timestamp("1970-07-16", tz="UTC"), # 台风Ruby7003
292
- Timestamp("1970-09-14", tz="UTC"), # 台风Georgia7011
293
- Timestamp("1971-07-22", tz="UTC"), # 台风Lucy7114
294
- Timestamp("1971-08-31", tz="UTC"), # 重光纪念日?
295
- Timestamp("1973-04-16", tz="UTC"), # 股灾休市?
296
- Timestamp("1973-07-17", tz="UTC"), # 台风Dot7304
297
- Timestamp("1974-04-25", tz="UTC"), # 英国女王生日
298
- Timestamp("1975-10-14", tz="UTC"), # 台风Elsie7514
299
- Timestamp("1978-07-26", tz="UTC"), # 台风Agnes7807
300
- Timestamp("1978-07-27", tz="UTC"),
301
- Timestamp("1979-01-26", tz="UTC"), # 春节补假
302
- Timestamp("1979-08-02", tz="UTC"), # 台风Hope7908
303
- Timestamp("1980-05-21", tz="UTC"), # 台风Georgia8004
304
- Timestamp("1980-07-22", tz="UTC"), # 台风Joy8007
305
- Timestamp("1981-04-27", tz="UTC"), # 英国女王生日
306
- Timestamp("1981-07-06", tz="UTC"), # 台风Lynn8106
307
- Timestamp("1981-07-07", tz="UTC"),
308
- Timestamp("1981-07-29", tz="UTC"), # 查理斯王子与戴安娜婚礼
309
- Timestamp("1983-09-09", tz="UTC"), # 台风Ellen8309
310
- Timestamp("1985-06-24", tz="UTC"), # 台风Hal8504
311
- Timestamp("1986-04-01", tz="UTC"), # 复活节星期一翌日
312
- Timestamp("1986-10-22", tz="UTC"), # 英女王伊丽莎白二世访港
313
- Timestamp("1987-10-20", tz="UTC"), # 黑色星期一后,休市4天
314
- Timestamp("1987-10-21", tz="UTC"),
315
- Timestamp("1987-10-22", tz="UTC"),
316
- Timestamp("1987-10-23", tz="UTC"),
317
- Timestamp("1988-04-05", tz="UTC"), # 清明节翌日
318
- # Timestamp('1988-06-13', tz='UTC'), # 英国女王生日
319
- Timestamp("1991-06-18", tz="UTC"), # 英国女王生日翌日
320
- Timestamp("1992-07-22", tz="UTC"), # 台风Cary9207
321
- # Timestamp('1993-06-14', tz='UTC'), # 英国女王生日
322
- Timestamp("1993-09-17", tz="UTC"), # 台风Becky9316
323
- Timestamp("1994-06-14", tz="UTC"), # 英国女王生日翌日,端午节翌日
324
- Timestamp("1997-06-30", tz="UTC"), # 英国女王生日
325
- Timestamp("1997-07-02", tz="UTC"), # 香港回归纪念日翌日
326
- Timestamp("1997-08-18", tz="UTC"), # 抗战胜利纪念日
327
- Timestamp("1997-10-02", tz="UTC"), # 国庆节翌日
328
- Timestamp("1998-08-17", tz="UTC"), # 抗战胜利纪念日
329
- Timestamp("1998-10-02", tz="UTC"), # 国庆节翌日
330
- Timestamp("1999-04-06", tz="UTC"), # 清明节翌日
331
- Timestamp("1999-09-16", tz="UTC"), # 台风约克
332
- Timestamp("1999-12-31", tz="UTC"), # 千年虫
333
- Timestamp("2001-07-06", tz="UTC"), # 台风尤特0104
334
- Timestamp("2001-07-25", tz="UTC"), # 台风玉兔0107
335
- # Timestamp(2008-06-25', tz='UTC'), # 台风风神0806,上午休市
336
- Timestamp("2008-08-06", tz="UTC"), # 台风北冕0809
337
- Timestamp("2008-08-22", tz="UTC"), # 台风鹦鹉0810
338
- # Timestamp(2009-09-15', tz='UTC'), # 台风巨爵0915,上午休市
339
- Timestamp("2010-04-06", tz="UTC"), # 清明节翌日
340
- Timestamp("2011-09-29", tz="UTC"), # 台风纳沙1117
341
- # Timestamp(2012-07-24', tz='UTC'), # 台风韦森特1208,上午休市
342
- Timestamp("2012-10-02", tz="UTC"), # 中秋节补假
343
- # Timestamp(2013-05-22', tz='UTC'), # 暴雨,上午休市
344
- Timestamp("2013-08-14", tz="UTC"), # 台风尤特1311
345
- # Timestamp(2013-09-23', tz='UTC'), # 台风天兔1319,上午休市
346
- # Timestamp(2014-09-16', tz='UTC'), # 台风海鸥1415,上午休市
347
- Timestamp("2015-04-07", tz="UTC"), # 复活节+清明节补假
348
- # Timestamp(2015-07-09', tz='UTC'), # 台风莲花1520,期货夜盘休市
349
- Timestamp("2015-09-03", tz="UTC"), # 抗战70周年纪念
350
- # Timestamp(2016-08-01', tz='UTC'), # 台风妮妲1604,期货夜盘20:55收市
351
- Timestamp("2016-08-02", tz="UTC"), # 台风妮妲1604
352
- Timestamp("2016-10-21", tz="UTC"), # 台风海马1622
353
- # Timestamp(2017-06-12', tz='UTC'), # 台风苗柏1702,期货夜盘17:35休市
354
- Timestamp("2017-08-23", tz="UTC"), # 台风天鸽1713
355
- Timestamp("2023-07-17", tz="UTC"), # Typhoon closure
356
- Timestamp("2023-09-01", tz="UTC"), # Typhoon closure
357
- Timestamp("2023-09-08", tz="UTC"), # Typhoon closure
358
- ]
359
-
360
-
361
- class HKEXExchangeCalendar(MarketCalendar):
362
- """
363
- Exchange calendar for Hong Kong Stock Exchange
364
-
365
- Open Time: 9:30 AM, Asia/Shanghai
366
- LUNCH BREAK :facepalm: : 12:00 AM - 1:00 PM Asia/Shanghai
367
- Close Time: 4:00 PM, Asia/Shanghai
368
- """
369
-
370
- aliases = ["HKEX"]
371
- regular_market_times = {
372
- "market_open": ((None, time(9, 30)),),
373
- "market_close": ((None, time(16)),),
374
- "break_start": ((None, time(12)),),
375
- "break_end": ((None, time(13)),),
376
- }
377
-
378
- @property
379
- def name(self):
380
- return "HKEX"
381
-
382
- @property
383
- def full_name(self):
384
- return "Hong Kong Stock Exchange"
385
-
386
- @property
387
- def tz(self):
388
- return ZoneInfo("Asia/Shanghai")
389
-
390
- @property
391
- def regular_holidays(self):
392
- """
393
- Rules are guesses based on observations of recent year.
394
- Rectify accordingly once the next year's holidays arrangement is published by the government.
395
- """
396
- return AbstractHolidayCalendar(
397
- rules=[
398
- HKNewYearsDay,
399
- SpringFestivalDayBefore1983,
400
- SpringFestivalDay2Before1983,
401
- SpringFestivalDay3Before1983,
402
- SpringFestivalDayBefore2010,
403
- SpringFestivalDay2Before2010,
404
- SpringFestivalDay3Before2010,
405
- SpringFestivalDay,
406
- SpringFestivalDay2,
407
- SpringFestivalDay3,
408
- GoodFriday,
409
- EasterMonday,
410
- TombSweepingDay,
411
- LabourDay,
412
- BuddhaShakyamuniDay,
413
- DragonBoatFestivalDay,
414
- HKRegionEstablishmentDay,
415
- MidAutumnFestivalDayBefore1983,
416
- MidAutumnFestivalDayBefore2010,
417
- MidAutumnFestivalDay,
418
- NationalDay,
419
- DoubleNinthFestivalDay,
420
- Christmas,
421
- BoxingDay,
422
- CommemoratingAlliedVictory,
423
- QueenBirthday,
424
- QueenBirthday2,
425
- IDontKnow,
426
- ]
427
- )
428
-
429
- @property
430
- def adhoc_holidays(self):
431
- return HKClosedDay
1
+ from datetime import time, timedelta
2
+ from functools import partial
3
+
4
+ from pandas import DateOffset, Timestamp
5
+ from pandas.tseries.holiday import (
6
+ AbstractHolidayCalendar,
7
+ EasterMonday,
8
+ GoodFriday,
9
+ Holiday,
10
+ sunday_to_monday,
11
+ )
12
+ from pandas.tseries.offsets import LastWeekOfMonth, WeekOfMonth
13
+ import sys
14
+ # check python versiOn aNd import accordingly
15
+ if sys.version_info >= (3, 9):
16
+ # For Python 3.9 and later, import directly
17
+ from zoneinfo import ZoneInfo
18
+ else:
19
+ # For Python 3.8 and earlier, import from backports
20
+ from backports.zoneinfo import ZoneInfo
21
+
22
+ from pandas_market_calendars.holidays.cn import (
23
+ bsd_mapping,
24
+ dbf_mapping,
25
+ dnf_mapping,
26
+ maf_mapping,
27
+ sf_mapping,
28
+ tsd_mapping,
29
+ )
30
+ from pandas_market_calendars.holidays.us import USNewYearsDay
31
+ from pandas_market_calendars.market_calendar import MarketCalendar
32
+
33
+
34
+ def process_date(dt, mapping=None, func=None, delta=None, offset=None):
35
+ if mapping and (dt.year in mapping):
36
+ new_dt = mapping[dt.year]
37
+ else:
38
+ new_dt = dt
39
+ if delta:
40
+ new_dt = new_dt + timedelta(delta)
41
+ dow = new_dt.weekday()
42
+ if dow == 6 and offset: # sunday
43
+ new_dt = new_dt + timedelta(offset)
44
+ if func:
45
+ return func(new_dt)
46
+ return new_dt
47
+
48
+
49
+ def process_queen_birthday(dt):
50
+ # before 1983
51
+ if dt.year in [1974, 1981]:
52
+ return dt + DateOffset(weekday=6)
53
+ elif dt.year < 1983:
54
+ return sunday_to_monday(dt)
55
+ # after 1983
56
+ wom = WeekOfMonth(week=2, weekday=0)
57
+ if dt.year in [1983, 1988, 1993, 1994]:
58
+ wom = WeekOfMonth(week=1, weekday=0)
59
+ if dt.year in [1985]:
60
+ wom = WeekOfMonth(week=3, weekday=0)
61
+ return dt + wom
62
+
63
+
64
+ HKNewYearsDay = USNewYearsDay
65
+
66
+ SpringFestivalDayBefore1983 = Holiday(
67
+ name="Spring Festival",
68
+ month=1,
69
+ day=21,
70
+ observance=partial(process_date, mapping=sf_mapping, delta=0, offset=3),
71
+ start_date=Timestamp("1961-01-01"),
72
+ end_date=Timestamp("1983-01-01"),
73
+ )
74
+
75
+ SpringFestivalDay2Before1983 = Holiday(
76
+ name="Spring Festival",
77
+ month=1,
78
+ day=21,
79
+ observance=partial(process_date, mapping=sf_mapping, delta=1, offset=2),
80
+ start_date=Timestamp("1961-01-01"),
81
+ end_date=Timestamp("1983-01-01"),
82
+ )
83
+
84
+ SpringFestivalDay3Before1983 = Holiday(
85
+ name="Spring Festival",
86
+ month=1,
87
+ day=21,
88
+ observance=partial(process_date, mapping=sf_mapping, delta=2, offset=1),
89
+ start_date=Timestamp("1961-01-01"),
90
+ end_date=Timestamp("1983-01-01"),
91
+ )
92
+
93
+ SpringFestivalDayBefore2010 = Holiday(
94
+ name="Spring Festival",
95
+ month=1,
96
+ day=21,
97
+ observance=partial(process_date, mapping=sf_mapping, delta=0, offset=-1),
98
+ start_date=Timestamp("1983-01-01"),
99
+ end_date=Timestamp("2010-07-01"),
100
+ )
101
+
102
+ SpringFestivalDay2Before2010 = Holiday(
103
+ name="Spring Festival",
104
+ month=1,
105
+ day=21,
106
+ observance=partial(process_date, mapping=sf_mapping, delta=1, offset=-2),
107
+ start_date=Timestamp("1983-01-01"),
108
+ end_date=Timestamp("2010-07-01"),
109
+ )
110
+
111
+ SpringFestivalDay3Before2010 = Holiday(
112
+ name="Spring Festival",
113
+ month=1,
114
+ day=21,
115
+ observance=partial(process_date, mapping=sf_mapping, delta=2, offset=-3),
116
+ start_date=Timestamp("1983-01-01"),
117
+ end_date=Timestamp("2010-07-01"),
118
+ )
119
+
120
+ SpringFestivalDay = Holiday(
121
+ name="Spring Festival",
122
+ month=1,
123
+ day=21,
124
+ observance=partial(process_date, mapping=sf_mapping, delta=0, offset=3),
125
+ start_date=Timestamp("2010-07-01"),
126
+ )
127
+
128
+ SpringFestivalDay2 = Holiday(
129
+ name="Spring Festival",
130
+ month=1,
131
+ day=21,
132
+ observance=partial(process_date, mapping=sf_mapping, delta=1, offset=2),
133
+ start_date=Timestamp("2010-07-01"),
134
+ )
135
+
136
+ SpringFestivalDay3 = Holiday(
137
+ name="Spring Festival",
138
+ month=1,
139
+ day=21,
140
+ observance=partial(process_date, mapping=sf_mapping, delta=2, offset=1),
141
+ start_date=Timestamp("2010-07-01"),
142
+ )
143
+
144
+ TombSweepingDay = Holiday(
145
+ name="Tomb-sweeping Day", # 清明节4月5日
146
+ month=4,
147
+ day=4,
148
+ observance=partial(process_date, mapping=tsd_mapping, func=sunday_to_monday),
149
+ start_date=Timestamp("1961-01-01"),
150
+ )
151
+
152
+ LabourDay = Holiday(
153
+ name="Labour Day", # 劳动节
154
+ month=5,
155
+ day=1,
156
+ observance=sunday_to_monday,
157
+ start_date=Timestamp("1999-05-01"),
158
+ )
159
+
160
+ BuddhaShakyamuniDay = Holiday(
161
+ name="Buddha Shakyamuni Day", # 浴佛节 98年农历4月8日定为法定假日
162
+ month=4,
163
+ day=28,
164
+ observance=partial(process_date, mapping=bsd_mapping, func=sunday_to_monday),
165
+ start_date=Timestamp("1999-04-28"),
166
+ )
167
+
168
+ DragonBoatFestivalDay = Holiday(
169
+ name="Dragon Boat Festival", # 端午节
170
+ month=5,
171
+ day=27,
172
+ observance=partial(process_date, mapping=dbf_mapping, func=sunday_to_monday),
173
+ start_date=Timestamp("1961-01-01"),
174
+ )
175
+
176
+ HKRegionEstablishmentDay = Holiday(
177
+ name="Hong Kong Special Region Establishment Day",
178
+ month=7,
179
+ day=1,
180
+ observance=sunday_to_monday,
181
+ start_date=Timestamp("1997-07-01"),
182
+ )
183
+
184
+ MidAutumnFestivalDayBefore1983 = Holiday(
185
+ name="Mid-autumn Festival", # 中秋节翌日
186
+ month=9,
187
+ day=7,
188
+ observance=partial(
189
+ process_date, mapping=maf_mapping, delta=1, func=sunday_to_monday
190
+ ),
191
+ start_date=Timestamp("1961-01-01"),
192
+ end_date=Timestamp("1983-01-01"),
193
+ )
194
+
195
+ MidAutumnFestivalDayBefore2010 = Holiday(
196
+ name="Mid-autumn Festival", # 中秋节翌日
197
+ month=9,
198
+ day=7,
199
+ observance=partial(process_date, mapping=maf_mapping, delta=1, offset=-1),
200
+ start_date=Timestamp("1983-01-01"),
201
+ end_date=Timestamp("2010-12-31"),
202
+ )
203
+
204
+ MidAutumnFestivalDay = Holiday(
205
+ name="Mid-autumn Festival", # 中秋节翌日
206
+ month=9,
207
+ day=7,
208
+ observance=partial(process_date, mapping=maf_mapping, delta=1, func=sunday_to_monday),
209
+ start_date=Timestamp("2011-01-01"),
210
+ )
211
+
212
+ DoubleNinthFestivalDay = Holiday(
213
+ name="Double Ninth Festival", # 重阳节
214
+ month=10,
215
+ day=2,
216
+ observance=partial(process_date, mapping=dnf_mapping, func=sunday_to_monday),
217
+ start_date=Timestamp("1961-01-01"),
218
+ )
219
+
220
+ NationalDay = Holiday(
221
+ name="National Day",
222
+ month=10,
223
+ day=1,
224
+ observance=sunday_to_monday,
225
+ start_date=Timestamp("1997-07-01"),
226
+ )
227
+
228
+ Christmas = Holiday(
229
+ name="Christmas",
230
+ month=12,
231
+ day=25,
232
+ observance=partial(process_date, offset=2),
233
+ start_date=Timestamp("1954-01-01"),
234
+ )
235
+
236
+ BoxingDay = Holiday(
237
+ name="Boxing day", # 圣诞节后第一个平日
238
+ month=12,
239
+ day=26,
240
+ observance=sunday_to_monday,
241
+ start_date=Timestamp("1954-01-01"),
242
+ )
243
+
244
+ QueenBirthday = Holiday(
245
+ name="Queen's Birthday", # 英女王生日 6月
246
+ month=6,
247
+ day=10,
248
+ observance=process_queen_birthday,
249
+ start_date=Timestamp("1983-01-01"),
250
+ end_date=Timestamp("1997-06-01"),
251
+ )
252
+
253
+ QueenBirthday2 = Holiday(
254
+ name="Queen's Birthday", # 英女王生日 4月
255
+ month=4,
256
+ day=21,
257
+ observance=process_queen_birthday,
258
+ start_date=Timestamp("1926-04-21"),
259
+ end_date=Timestamp("1983-01-01"),
260
+ )
261
+
262
+ CommemoratingAlliedVictory = Holiday(
263
+ name="Commemorating the allied victory", # 重光纪念日 8月最后一个星期一
264
+ month=8,
265
+ day=20,
266
+ offset=LastWeekOfMonth(weekday=0),
267
+ start_date=Timestamp("1945-08-30"),
268
+ end_date=Timestamp("1997-07-01"),
269
+ )
270
+
271
+ IDontKnow = Holiday(
272
+ name="I dont know these days, please tell me", # 8月第一个星期一
273
+ month=7,
274
+ day=31,
275
+ offset=WeekOfMonth(week=0, weekday=0),
276
+ start_date=Timestamp("1960-08-01"),
277
+ end_date=Timestamp("1983-01-01"),
278
+ )
279
+
280
+ HKClosedDay = [
281
+ # I dont know these days
282
+ Timestamp("1970-07-01", tz="UTC"),
283
+ Timestamp("1971-07-01", tz="UTC"),
284
+ Timestamp("1973-07-02", tz="UTC"),
285
+ Timestamp("1974-07-01", tz="UTC"),
286
+ Timestamp("1975-07-01", tz="UTC"),
287
+ Timestamp("1976-07-01", tz="UTC"),
288
+ Timestamp("1977-07-01", tz="UTC"),
289
+ Timestamp("1979-07-02", tz="UTC"),
290
+ Timestamp("1980-07-01", tz="UTC"),
291
+ Timestamp("1981-07-01", tz="UTC"),
292
+ Timestamp("1982-07-01", tz="UTC"),
293
+ Timestamp("1971-03-22", tz="UTC"),
294
+ Timestamp("1971-12-06", tz="UTC"),
295
+ Timestamp("1971-12-20", tz="UTC"),
296
+ Timestamp("1975-07-28", tz="UTC"),
297
+ Timestamp("1985-07-29", tz="UTC"),
298
+ Timestamp("1970-07-16", tz="UTC"), # 台风Ruby7003
299
+ Timestamp("1970-09-14", tz="UTC"), # 台风Georgia7011
300
+ Timestamp("1971-07-22", tz="UTC"), # 台风Lucy7114
301
+ Timestamp("1971-08-31", tz="UTC"), # 重光纪念日?
302
+ Timestamp("1973-04-16", tz="UTC"), # 股灾休市?
303
+ Timestamp("1973-07-17", tz="UTC"), # 台风Dot7304
304
+ Timestamp("1974-04-25", tz="UTC"), # 英国女王生日
305
+ Timestamp("1975-10-14", tz="UTC"), # 台风Elsie7514
306
+ Timestamp("1978-07-26", tz="UTC"), # 台风Agnes7807
307
+ Timestamp("1978-07-27", tz="UTC"),
308
+ Timestamp("1979-01-26", tz="UTC"), # 春节补假
309
+ Timestamp("1979-08-02", tz="UTC"), # 台风Hope7908
310
+ Timestamp("1980-05-21", tz="UTC"), # 台风Georgia8004
311
+ Timestamp("1980-07-22", tz="UTC"), # 台风Joy8007
312
+ Timestamp("1981-04-27", tz="UTC"), # 英国女王生日
313
+ Timestamp("1981-07-06", tz="UTC"), # 台风Lynn8106
314
+ Timestamp("1981-07-07", tz="UTC"),
315
+ Timestamp("1981-07-29", tz="UTC"), # 查理斯王子与戴安娜婚礼
316
+ Timestamp("1983-09-09", tz="UTC"), # 台风Ellen8309
317
+ Timestamp("1985-06-24", tz="UTC"), # 台风Hal8504
318
+ Timestamp("1986-04-01", tz="UTC"), # 复活节星期一翌日
319
+ Timestamp("1986-10-22", tz="UTC"), # 英女王伊丽莎白二世访港
320
+ Timestamp("1987-10-20", tz="UTC"), # 黑色星期一后,休市4天
321
+ Timestamp("1987-10-21", tz="UTC"),
322
+ Timestamp("1987-10-22", tz="UTC"),
323
+ Timestamp("1987-10-23", tz="UTC"),
324
+ Timestamp("1988-04-05", tz="UTC"), # 清明节翌日
325
+ # Timestamp('1988-06-13', tz='UTC'), # 英国女王生日
326
+ Timestamp("1991-06-18", tz="UTC"), # 英国女王生日翌日
327
+ Timestamp("1992-07-22", tz="UTC"), # 台风Cary9207
328
+ # Timestamp('1993-06-14', tz='UTC'), # 英国女王生日
329
+ Timestamp("1993-09-17", tz="UTC"), # 台风Becky9316
330
+ Timestamp("1994-06-14", tz="UTC"), # 英国女王生日翌日,端午节翌日
331
+ Timestamp("1997-06-30", tz="UTC"), # 英国女王生日
332
+ Timestamp("1997-07-02", tz="UTC"), # 香港回归纪念日翌日
333
+ Timestamp("1997-08-18", tz="UTC"), # 抗战胜利纪念日
334
+ Timestamp("1997-10-02", tz="UTC"), # 国庆节翌日
335
+ Timestamp("1998-08-17", tz="UTC"), # 抗战胜利纪念日
336
+ Timestamp("1998-10-02", tz="UTC"), # 国庆节翌日
337
+ Timestamp("1999-04-06", tz="UTC"), # 清明节翌日
338
+ Timestamp("1999-09-16", tz="UTC"), # 台风约克
339
+ Timestamp("1999-12-31", tz="UTC"), # 千年虫
340
+ Timestamp("2001-07-06", tz="UTC"), # 台风尤特0104
341
+ Timestamp("2001-07-25", tz="UTC"), # 台风玉兔0107
342
+ # Timestamp(2008-06-25', tz='UTC'), # 台风风神0806,上午休市
343
+ Timestamp("2008-08-06", tz="UTC"), # 台风北冕0809
344
+ Timestamp("2008-08-22", tz="UTC"), # 台风鹦鹉0810
345
+ # Timestamp(2009-09-15', tz='UTC'), # 台风巨爵0915,上午休市
346
+ Timestamp("2010-04-06", tz="UTC"), # 清明节翌日
347
+ Timestamp("2011-09-29", tz="UTC"), # 台风纳沙1117
348
+ # Timestamp(2012-07-24', tz='UTC'), # 台风韦森特1208,上午休市
349
+ Timestamp("2012-10-02", tz="UTC"), # 中秋节补假
350
+ # Timestamp(2013-05-22', tz='UTC'), # 暴雨,上午休市
351
+ Timestamp("2013-08-14", tz="UTC"), # 台风尤特1311
352
+ # Timestamp(2013-09-23', tz='UTC'), # 台风天兔1319,上午休市
353
+ # Timestamp(2014-09-16', tz='UTC'), # 台风海鸥1415,上午休市
354
+ Timestamp("2015-04-07", tz="UTC"), # 复活节+清明节补假
355
+ # Timestamp(2015-07-09', tz='UTC'), # 台风莲花1520,期货夜盘休市
356
+ Timestamp("2015-09-03", tz="UTC"), # 抗战70周年纪念
357
+ # Timestamp(2016-08-01', tz='UTC'), # 台风妮妲1604,期货夜盘20:55收市
358
+ Timestamp("2016-08-02", tz="UTC"), # 台风妮妲1604
359
+ Timestamp("2016-10-21", tz="UTC"), # 台风海马1622
360
+ # Timestamp(2017-06-12', tz='UTC'), # 台风苗柏1702,期货夜盘17:35休市
361
+ Timestamp("2017-08-23", tz="UTC"), # 台风天鸽1713
362
+ Timestamp("2023-07-17", tz="UTC"), # Typhoon closure
363
+ Timestamp("2023-09-01", tz="UTC"), # Typhoon closure
364
+ Timestamp("2023-09-08", tz="UTC"), # Typhoon closure
365
+ ]
366
+
367
+
368
+ class HKEXExchangeCalendar(MarketCalendar):
369
+ """
370
+ Exchange calendar for Hong Kong Stock Exchange
371
+
372
+ Open Time: 9:30 AM, Asia/Shanghai
373
+ LUNCH BREAK :facepalm: : 12:00 AM - 1:00 PM Asia/Shanghai
374
+ Close Time: 4:00 PM, Asia/Shanghai
375
+ """
376
+
377
+ aliases = ["HKEX"]
378
+ regular_market_times = {
379
+ "market_open": ((None, time(9, 30)),),
380
+ "market_close": ((None, time(16)),),
381
+ "break_start": ((None, time(12)),),
382
+ "break_end": ((None, time(13)),),
383
+ }
384
+
385
+ @property
386
+ def name(self):
387
+ return "HKEX"
388
+
389
+ @property
390
+ def full_name(self):
391
+ return "Hong Kong Stock Exchange"
392
+
393
+ @property
394
+ def tz(self):
395
+ return ZoneInfo("Asia/Shanghai")
396
+
397
+ @property
398
+ def regular_holidays(self):
399
+ """
400
+ Rules are guesses based on observations of recent year.
401
+ Rectify accordingly once the next year's holidays arrangement is published by the government.
402
+ """
403
+ return AbstractHolidayCalendar(
404
+ rules=[
405
+ HKNewYearsDay,
406
+ SpringFestivalDayBefore1983,
407
+ SpringFestivalDay2Before1983,
408
+ SpringFestivalDay3Before1983,
409
+ SpringFestivalDayBefore2010,
410
+ SpringFestivalDay2Before2010,
411
+ SpringFestivalDay3Before2010,
412
+ SpringFestivalDay,
413
+ SpringFestivalDay2,
414
+ SpringFestivalDay3,
415
+ GoodFriday,
416
+ EasterMonday,
417
+ TombSweepingDay,
418
+ LabourDay,
419
+ BuddhaShakyamuniDay,
420
+ DragonBoatFestivalDay,
421
+ HKRegionEstablishmentDay,
422
+ MidAutumnFestivalDayBefore1983,
423
+ MidAutumnFestivalDayBefore2010,
424
+ MidAutumnFestivalDay,
425
+ NationalDay,
426
+ DoubleNinthFestivalDay,
427
+ Christmas,
428
+ BoxingDay,
429
+ CommemoratingAlliedVictory,
430
+ QueenBirthday,
431
+ QueenBirthday2,
432
+ IDontKnow,
433
+ ]
434
+ )
435
+
436
+ @property
437
+ def adhoc_holidays(self):
438
+ return HKClosedDay