pandas-market-calendars 4.1.4__py3-none-any.whl → 4.2.0__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- {pandas_market_calendars-4.1.4.dist-info → pandas_market_calendars-4.2.0.dist-info}/METADATA +200 -187
- pandas_market_calendars-4.2.0.dist-info/NOTICE +206 -0
- pandas_market_calendars-4.2.0.dist-info/RECORD +6 -0
- {pandas_market_calendars-4.1.4.dist-info → pandas_market_calendars-4.2.0.dist-info}/WHEEL +1 -1
- pandas_market_calendars/__init__.py +0 -37
- pandas_market_calendars/calendar_registry.py +0 -47
- pandas_market_calendars/calendar_utils.py +0 -225
- pandas_market_calendars/class_registry.py +0 -111
- pandas_market_calendars/exchange_calendar_asx.py +0 -63
- pandas_market_calendars/exchange_calendar_bmf.py +0 -227
- pandas_market_calendars/exchange_calendar_bse.py +0 -409
- pandas_market_calendars/exchange_calendar_cboe.py +0 -115
- pandas_market_calendars/exchange_calendar_cme.py +0 -240
- pandas_market_calendars/exchange_calendar_cme_globex_agriculture.py +0 -109
- pandas_market_calendars/exchange_calendar_cme_globex_base.py +0 -106
- pandas_market_calendars/exchange_calendar_cme_globex_energy_and_metals.py +0 -146
- pandas_market_calendars/exchange_calendar_cme_globex_equities.py +0 -104
- pandas_market_calendars/exchange_calendar_cme_globex_fixed_income.py +0 -114
- pandas_market_calendars/exchange_calendar_cme_globex_fx.py +0 -78
- pandas_market_calendars/exchange_calendar_eurex.py +0 -119
- pandas_market_calendars/exchange_calendar_hkex.py +0 -408
- pandas_market_calendars/exchange_calendar_ice.py +0 -65
- pandas_market_calendars/exchange_calendar_iex.py +0 -98
- pandas_market_calendars/exchange_calendar_jpx.py +0 -98
- pandas_market_calendars/exchange_calendar_lse.py +0 -91
- pandas_market_calendars/exchange_calendar_nyse.py +0 -1127
- pandas_market_calendars/exchange_calendar_ose.py +0 -150
- pandas_market_calendars/exchange_calendar_sifma.py +0 -300
- pandas_market_calendars/exchange_calendar_six.py +0 -114
- pandas_market_calendars/exchange_calendar_sse.py +0 -290
- pandas_market_calendars/exchange_calendar_tase.py +0 -195
- pandas_market_calendars/exchange_calendar_tsx.py +0 -159
- pandas_market_calendars/exchange_calendars_mirror.py +0 -114
- pandas_market_calendars/holidays_cme.py +0 -341
- pandas_market_calendars/holidays_cme_globex.py +0 -169
- pandas_market_calendars/holidays_cn.py +0 -1436
- pandas_market_calendars/holidays_jp.py +0 -362
- pandas_market_calendars/holidays_nyse.py +0 -1474
- pandas_market_calendars/holidays_oz.py +0 -65
- pandas_market_calendars/holidays_sifma.py +0 -321
- pandas_market_calendars/holidays_uk.py +0 -177
- pandas_market_calendars/holidays_us.py +0 -364
- pandas_market_calendars/jpx_equinox.py +0 -147
- pandas_market_calendars/market_calendar.py +0 -770
- pandas_market_calendars-4.1.4.dist-info/RECORD +0 -45
- {pandas_market_calendars-4.1.4.dist-info → pandas_market_calendars-4.2.0.dist-info}/LICENSE +0 -0
- {pandas_market_calendars-4.1.4.dist-info → pandas_market_calendars-4.2.0.dist-info}/top_level.txt +0 -0
@@ -1,290 +0,0 @@
|
|
1
|
-
from datetime import time, timedelta
|
2
|
-
from functools import partial
|
3
|
-
|
4
|
-
from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, next_monday
|
5
|
-
from pytz import timezone
|
6
|
-
|
7
|
-
from .holidays_cn import *
|
8
|
-
from .market_calendar import MarketCalendar
|
9
|
-
|
10
|
-
|
11
|
-
class SSEExchangeCalendar(MarketCalendar):
|
12
|
-
"""
|
13
|
-
Exchange calendar for Shanghai Stock Exchange
|
14
|
-
|
15
|
-
Open Time: 9:30 AM, Asia/Shanghai
|
16
|
-
LUNCH BREAK :facepalm: : 11:30 AM - 1:00 PM Asia/Shanghai
|
17
|
-
Close Time: 3:00 PM, Asia/Shanghai
|
18
|
-
"""
|
19
|
-
aliases = ['SSE']
|
20
|
-
regular_market_times = {
|
21
|
-
"market_open": ((None, time(9, 30)),),
|
22
|
-
"market_close": ((None, time(15)),),
|
23
|
-
"break_start": ((None, time(11,30)),),
|
24
|
-
"break_end": ((None, time(13)),)
|
25
|
-
}
|
26
|
-
|
27
|
-
@property
|
28
|
-
def name(self):
|
29
|
-
return "SSE"
|
30
|
-
|
31
|
-
@property
|
32
|
-
def tz(self):
|
33
|
-
return timezone('Asia/Shanghai')
|
34
|
-
|
35
|
-
@property
|
36
|
-
def regular_holidays(self):
|
37
|
-
"""
|
38
|
-
Rules are guesses based on observations of recent year.
|
39
|
-
Rectify accordingly once the next year's holidays arrangement is published by the government.
|
40
|
-
"""
|
41
|
-
# Since all past holidays are adhoc, start_year should always be a year in the future.
|
42
|
-
# For example: Holiday arrangements for 2022 are now included,
|
43
|
-
# then our guesswork starts from the next year so start_year = 2023
|
44
|
-
start_year = 2024
|
45
|
-
|
46
|
-
return AbstractHolidayCalendar(rules=[
|
47
|
-
Holiday(
|
48
|
-
name="New Year's Day",
|
49
|
-
month=1,
|
50
|
-
day=1,
|
51
|
-
observance=next_monday,
|
52
|
-
start_date=Timestamp(start_year, 1, 1),
|
53
|
-
),
|
54
|
-
Holiday(
|
55
|
-
name="New Year's Day",
|
56
|
-
month=1,
|
57
|
-
day=2,
|
58
|
-
observance=partial(second_day_in_lieu),
|
59
|
-
start_date=Timestamp(start_year, 1, 2),
|
60
|
-
),
|
61
|
-
Holiday(
|
62
|
-
name="New Year's Day",
|
63
|
-
month=1,
|
64
|
-
day=3,
|
65
|
-
observance=partial(third_day_in_lieu),
|
66
|
-
start_date=Timestamp(start_year, 1, 3),
|
67
|
-
),
|
68
|
-
Holiday(
|
69
|
-
name="Spring Festival",
|
70
|
-
month=1,
|
71
|
-
day=20,
|
72
|
-
observance=partial(lunisolar, mapping=sf_mapping, delta=-1),
|
73
|
-
start_date=Timestamp(start_year, 1, 20),
|
74
|
-
),
|
75
|
-
Holiday(
|
76
|
-
name="Spring Festival",
|
77
|
-
month=1,
|
78
|
-
day=21,
|
79
|
-
observance=partial(lunisolar, mapping=sf_mapping, delta=0),
|
80
|
-
start_date=Timestamp(start_year, 1, 21),
|
81
|
-
),
|
82
|
-
Holiday(
|
83
|
-
name="Spring Festival",
|
84
|
-
month=1,
|
85
|
-
day=21,
|
86
|
-
observance=partial(lunisolar, mapping=sf_mapping, delta=1),
|
87
|
-
start_date=Timestamp(start_year, 1, 22),
|
88
|
-
),
|
89
|
-
Holiday(
|
90
|
-
name="Spring Festival",
|
91
|
-
month=1,
|
92
|
-
day=21,
|
93
|
-
observance=partial(lunisolar, mapping=sf_mapping, delta=2),
|
94
|
-
start_date=Timestamp(start_year, 1, 23),
|
95
|
-
),
|
96
|
-
Holiday(
|
97
|
-
name="Spring Festival",
|
98
|
-
month=1,
|
99
|
-
day=21,
|
100
|
-
observance=partial(lunisolar, mapping=sf_mapping, delta=3),
|
101
|
-
start_date=Timestamp(start_year, 1, 24),
|
102
|
-
),
|
103
|
-
Holiday(
|
104
|
-
name="Spring Festival",
|
105
|
-
month=1,
|
106
|
-
day=21,
|
107
|
-
observance=partial(lunisolar, mapping=sf_mapping, delta=4),
|
108
|
-
start_date=Timestamp(start_year, 1, 25),
|
109
|
-
),
|
110
|
-
Holiday(
|
111
|
-
name="Spring Festival",
|
112
|
-
month=1,
|
113
|
-
day=21,
|
114
|
-
observance=partial(lunisolar, mapping=sf_mapping, delta=5),
|
115
|
-
start_date=Timestamp(start_year, 1, 26),
|
116
|
-
),
|
117
|
-
Holiday(
|
118
|
-
name="Labour Day",
|
119
|
-
month=5,
|
120
|
-
day=1,
|
121
|
-
observance=next_monday,
|
122
|
-
start_date=Timestamp(start_year, 5, 1),
|
123
|
-
),
|
124
|
-
Holiday(
|
125
|
-
name="Labour Day",
|
126
|
-
month=5,
|
127
|
-
day=2,
|
128
|
-
observance=second_day_in_lieu,
|
129
|
-
start_date=Timestamp(start_year, 5, 2),
|
130
|
-
),
|
131
|
-
Holiday(
|
132
|
-
name="Labour Day",
|
133
|
-
month=5,
|
134
|
-
day=3,
|
135
|
-
observance=third_day_in_lieu,
|
136
|
-
start_date=Timestamp(start_year, 5, 3),
|
137
|
-
),
|
138
|
-
Holiday(
|
139
|
-
name="Tomb-sweeping Day",
|
140
|
-
month=4,
|
141
|
-
day=4,
|
142
|
-
observance=partial(lunisolar, mapping=tsd_mapping, func=next_monday),
|
143
|
-
start_date=Timestamp(start_year, 4, 4),
|
144
|
-
),
|
145
|
-
Holiday(
|
146
|
-
name="Tomb-sweeping Day",
|
147
|
-
month=4,
|
148
|
-
day=5,
|
149
|
-
observance=partial(lunisolar, mapping=tsd_mapping, func=second_day_in_lieu, delta=1),
|
150
|
-
start_date=Timestamp(start_year, 4, 4),
|
151
|
-
),
|
152
|
-
Holiday(
|
153
|
-
name="Tomb-sweeping Day",
|
154
|
-
month=4,
|
155
|
-
day=6,
|
156
|
-
observance=partial(lunisolar, mapping=tsd_mapping, func=third_day_in_lieu, delta=2),
|
157
|
-
start_date=Timestamp(start_year, 4, 4),
|
158
|
-
),
|
159
|
-
Holiday(
|
160
|
-
name="Dragon Boat Festival",
|
161
|
-
month=5,
|
162
|
-
day=27,
|
163
|
-
observance=partial(lunisolar, mapping=dbf_mapping, func=next_monday),
|
164
|
-
start_date=Timestamp(start_year, 5, 27),
|
165
|
-
),
|
166
|
-
Holiday(
|
167
|
-
name="Dragon Boat Festival",
|
168
|
-
month=5,
|
169
|
-
day=28,
|
170
|
-
observance=partial(lunisolar, mapping=dbf_mapping, func=second_day_in_lieu, delta=1),
|
171
|
-
start_date=Timestamp(start_year, 5, 27),
|
172
|
-
),
|
173
|
-
Holiday(
|
174
|
-
name="Dragon Boat Festival",
|
175
|
-
month=5,
|
176
|
-
day=29,
|
177
|
-
observance=partial(lunisolar, mapping=dbf_mapping, func=third_day_in_lieu, delta=2),
|
178
|
-
start_date=Timestamp(start_year, 5, 27),
|
179
|
-
),
|
180
|
-
Holiday(
|
181
|
-
name="Mid-autumn Festival",
|
182
|
-
month=9,
|
183
|
-
day=7,
|
184
|
-
observance=partial(lunisolar, mapping=maf_mapping, func=next_monday),
|
185
|
-
start_date=Timestamp(start_year, 9, 7),
|
186
|
-
),
|
187
|
-
Holiday(
|
188
|
-
name="Mid-autumn Festival",
|
189
|
-
month=9,
|
190
|
-
day=8,
|
191
|
-
observance=partial(lunisolar, mapping=maf_mapping, func=second_day_in_lieu, delta=1),
|
192
|
-
start_date=Timestamp(start_year, 9, 7),
|
193
|
-
),
|
194
|
-
Holiday(
|
195
|
-
name="Mid-autumn Festival",
|
196
|
-
month=9,
|
197
|
-
day=9,
|
198
|
-
observance=partial(lunisolar, mapping=maf_mapping, func=third_day_in_lieu, delta=2),
|
199
|
-
start_date=Timestamp(start_year, 9, 7),
|
200
|
-
),
|
201
|
-
Holiday(
|
202
|
-
name="National Day",
|
203
|
-
month=10,
|
204
|
-
day=1,
|
205
|
-
start_date=Timestamp(start_year, 10, 1),
|
206
|
-
),
|
207
|
-
Holiday(
|
208
|
-
name="National Day",
|
209
|
-
month=10,
|
210
|
-
day=2,
|
211
|
-
start_date=Timestamp(start_year, 10, 2),
|
212
|
-
),
|
213
|
-
Holiday(
|
214
|
-
name="National Day",
|
215
|
-
month=10,
|
216
|
-
day=3,
|
217
|
-
start_date=Timestamp(start_year, 10, 3),
|
218
|
-
),
|
219
|
-
Holiday(
|
220
|
-
name="National Day",
|
221
|
-
month=10,
|
222
|
-
day=4,
|
223
|
-
start_date=Timestamp(start_year, 10, 4),
|
224
|
-
),
|
225
|
-
Holiday(
|
226
|
-
name="National Day",
|
227
|
-
month=10,
|
228
|
-
day=5,
|
229
|
-
start_date=Timestamp(start_year, 10, 5),
|
230
|
-
),
|
231
|
-
Holiday(
|
232
|
-
name="National Day",
|
233
|
-
month=10,
|
234
|
-
day=6,
|
235
|
-
start_date=Timestamp(start_year, 10, 6),
|
236
|
-
),
|
237
|
-
Holiday(
|
238
|
-
name="National Day",
|
239
|
-
month=10,
|
240
|
-
day=7,
|
241
|
-
start_date=Timestamp(start_year, 10, 7),
|
242
|
-
),
|
243
|
-
])
|
244
|
-
|
245
|
-
@property
|
246
|
-
def adhoc_holidays(self):
|
247
|
-
return all_holidays
|
248
|
-
|
249
|
-
|
250
|
-
def second_day_in_lieu(dt):
|
251
|
-
dow = dt.weekday()
|
252
|
-
if dow == 0: # Holiday is Sunday, use Saturday
|
253
|
-
return dt - timedelta(2)
|
254
|
-
elif dow == 1: # Holiday is Monday, use Saturday
|
255
|
-
return dt - timedelta(3)
|
256
|
-
elif dow == 2: # Holiday is Tuesday, use Sunday
|
257
|
-
return dt - timedelta(3)
|
258
|
-
elif dow == 3: # Holiday is Wednesday, use Saturday
|
259
|
-
return dt - timedelta(5)
|
260
|
-
|
261
|
-
return dt
|
262
|
-
|
263
|
-
|
264
|
-
def third_day_in_lieu(dt):
|
265
|
-
dow = dt.weekday()
|
266
|
-
if dow == 0: # Holiday is Saturday, use Sunday
|
267
|
-
return dt - timedelta(1)
|
268
|
-
elif dow == 1: # Holiday is Sunday, use Sunday
|
269
|
-
return dt - timedelta(2)
|
270
|
-
elif dow == 2: # Holiday is Monday, use Sunday
|
271
|
-
return dt - timedelta(3)
|
272
|
-
elif dow == 3: # Holiday is Tuesday, use Monday
|
273
|
-
return dt - timedelta(3)
|
274
|
-
elif dow == 4: # Holiday is Wednesday, use Sunday
|
275
|
-
return dt - timedelta(5)
|
276
|
-
|
277
|
-
return dt
|
278
|
-
|
279
|
-
|
280
|
-
def lunisolar(dt, mapping, func=None, delta=None):
|
281
|
-
if mapping and (dt.year in mapping):
|
282
|
-
new_dt = mapping[dt.year]
|
283
|
-
else:
|
284
|
-
new_dt = dt
|
285
|
-
if delta:
|
286
|
-
new_dt = new_dt + timedelta(delta)
|
287
|
-
if func:
|
288
|
-
return func(new_dt)
|
289
|
-
else:
|
290
|
-
return new_dt
|
@@ -1,195 +0,0 @@
|
|
1
|
-
from datetime import time
|
2
|
-
from pandas import Timestamp
|
3
|
-
from pytz import timezone
|
4
|
-
from .market_calendar import MarketCalendar
|
5
|
-
|
6
|
-
TASEClosedDay = [
|
7
|
-
# 2019
|
8
|
-
Timestamp('2019-03-21', tz='Asia/Jerusalem'),
|
9
|
-
Timestamp('2019-04-09', tz='Asia/Jerusalem'),
|
10
|
-
Timestamp('2019-04-25', tz='Asia/Jerusalem'),
|
11
|
-
Timestamp('2019-04-26', tz='Asia/Jerusalem'),
|
12
|
-
Timestamp('2019-05-08', tz='Asia/Jerusalem'),
|
13
|
-
Timestamp('2019-05-09', tz='Asia/Jerusalem'),
|
14
|
-
Timestamp('2019-06-09', tz='Asia/Jerusalem'),
|
15
|
-
Timestamp('2019-08-11', tz='Asia/Jerusalem'),
|
16
|
-
Timestamp('2019-09-17', tz='Asia/Jerusalem'),
|
17
|
-
Timestamp('2019-09-29', tz='Asia/Jerusalem'),
|
18
|
-
Timestamp('2019-09-30', tz='Asia/Jerusalem'),
|
19
|
-
Timestamp('2019-10-01', tz='Asia/Jerusalem'),
|
20
|
-
Timestamp('2019-10-08', tz='Asia/Jerusalem'),
|
21
|
-
Timestamp('2019-10-09', tz='Asia/Jerusalem'),
|
22
|
-
Timestamp('2019-10-13', tz='Asia/Jerusalem'),
|
23
|
-
Timestamp('2019-10-14', tz='Asia/Jerusalem'),
|
24
|
-
Timestamp('2019-10-20', tz='Asia/Jerusalem'),
|
25
|
-
Timestamp('2019-10-21', tz='Asia/Jerusalem'),
|
26
|
-
# 2020
|
27
|
-
Timestamp('2020-03-02', tz='Asia/Jerusalem'),
|
28
|
-
Timestamp('2020-03-10', tz='Asia/Jerusalem'),
|
29
|
-
Timestamp('2020-04-08', tz='Asia/Jerusalem'),
|
30
|
-
Timestamp('2020-04-09', tz='Asia/Jerusalem'),
|
31
|
-
Timestamp('2020-04-14', tz='Asia/Jerusalem'),
|
32
|
-
Timestamp('2020-04-15', tz='Asia/Jerusalem'),
|
33
|
-
Timestamp('2020-04-28', tz='Asia/Jerusalem'),
|
34
|
-
Timestamp('2020-04-29', tz='Asia/Jerusalem'),
|
35
|
-
Timestamp('2020-05-28', tz='Asia/Jerusalem'),
|
36
|
-
Timestamp('2020-05-29', tz='Asia/Jerusalem'),
|
37
|
-
Timestamp('2020-07-30', tz='Asia/Jerusalem'),
|
38
|
-
Timestamp('2020-09-20', tz='Asia/Jerusalem'),
|
39
|
-
Timestamp('2020-09-27', tz='Asia/Jerusalem'),
|
40
|
-
Timestamp('2020-09-28', tz='Asia/Jerusalem'),
|
41
|
-
# 2021
|
42
|
-
Timestamp('2021-02-26', tz='Asia/Jerusalem'),
|
43
|
-
Timestamp('2021-03-28', tz='Asia/Jerusalem'),
|
44
|
-
Timestamp('2021-04-02', tz='Asia/Jerusalem'),
|
45
|
-
Timestamp('2021-04-14', tz='Asia/Jerusalem'),
|
46
|
-
Timestamp('2021-04-15', tz='Asia/Jerusalem'),
|
47
|
-
Timestamp('2021-05-16', tz='Asia/Jerusalem'),
|
48
|
-
Timestamp('2021-05-17', tz='Asia/Jerusalem'),
|
49
|
-
Timestamp('2021-07-18', tz='Asia/Jerusalem'),
|
50
|
-
Timestamp('2021-09-06', tz='Asia/Jerusalem'),
|
51
|
-
Timestamp('2021-09-07', tz='Asia/Jerusalem'),
|
52
|
-
Timestamp('2021-09-08', tz='Asia/Jerusalem'),
|
53
|
-
Timestamp('2021-09-15', tz='Asia/Jerusalem'),
|
54
|
-
Timestamp('2021-09-16', tz='Asia/Jerusalem'),
|
55
|
-
Timestamp('2021-09-20', tz='Asia/Jerusalem'),
|
56
|
-
Timestamp('2021-09-21', tz='Asia/Jerusalem'),
|
57
|
-
Timestamp('2021-09-27', tz='Asia/Jerusalem'),
|
58
|
-
Timestamp('2021-09-28', tz='Asia/Jerusalem'),
|
59
|
-
#2022
|
60
|
-
Timestamp('2022-03-17', tz='Asia/Jerusalem'),
|
61
|
-
Timestamp('2022-03-18', tz='Asia/Jerusalem'),
|
62
|
-
Timestamp('2022-04-15', tz='Asia/Jerusalem'),
|
63
|
-
Timestamp('2022-04-21', tz='Asia/Jerusalem'),
|
64
|
-
Timestamp('2022-04-22', tz='Asia/Jerusalem'),
|
65
|
-
Timestamp('2022-05-05', tz='Asia/Jerusalem'),
|
66
|
-
Timestamp('2022-06-05', tz='Asia/Jerusalem'),
|
67
|
-
Timestamp('2022-08-07', tz='Asia/Jerusalem'),
|
68
|
-
Timestamp('2022-09-25', tz='Asia/Jerusalem'),
|
69
|
-
Timestamp('2022-09-26', tz='Asia/Jerusalem'),
|
70
|
-
Timestamp('2022-09-27', tz='Asia/Jerusalem'),
|
71
|
-
Timestamp('2022-10-04', tz='Asia/Jerusalem'),
|
72
|
-
Timestamp('2022-10-05', tz='Asia/Jerusalem'),
|
73
|
-
Timestamp('2022-10-09', tz='Asia/Jerusalem'),
|
74
|
-
Timestamp('2022-10-10', tz='Asia/Jerusalem'),
|
75
|
-
Timestamp('2022-10-16', tz='Asia/Jerusalem'),
|
76
|
-
Timestamp('2022-10-17', tz='Asia/Jerusalem'),
|
77
|
-
Timestamp('2022-11-01', tz='Asia/Jerusalem'),
|
78
|
-
#2023
|
79
|
-
Timestamp('2023-03-07', tz='Asia/Jerusalem'),
|
80
|
-
Timestamp('2023-03-08', tz='Asia/Jerusalem'),
|
81
|
-
Timestamp('2023-04-05', tz='Asia/Jerusalem'),
|
82
|
-
Timestamp('2023-04-06', tz='Asia/Jerusalem'),
|
83
|
-
Timestamp('2023-04-11', tz='Asia/Jerusalem'),
|
84
|
-
Timestamp('2023-04-12', tz='Asia/Jerusalem'),
|
85
|
-
Timestamp('2023-04-25', tz='Asia/Jerusalem'),
|
86
|
-
Timestamp('2023-04-26', tz='Asia/Jerusalem'),
|
87
|
-
Timestamp('2023-05-25', tz='Asia/Jerusalem'),
|
88
|
-
Timestamp('2023-05-26', tz='Asia/Jerusalem'),
|
89
|
-
Timestamp('2023-07-27', tz='Asia/Jerusalem'),
|
90
|
-
Timestamp('2023-09-15', tz='Asia/Jerusalem'),
|
91
|
-
Timestamp('2023-09-17', tz='Asia/Jerusalem'),
|
92
|
-
Timestamp('2023-09-24', tz='Asia/Jerusalem'),
|
93
|
-
Timestamp('2023-09-25', tz='Asia/Jerusalem'),
|
94
|
-
Timestamp('2023-09-29', tz='Asia/Jerusalem'),
|
95
|
-
Timestamp('2023-10-06', tz='Asia/Jerusalem'),
|
96
|
-
Timestamp('2023-10-31', tz='Asia/Jerusalem'),
|
97
|
-
#2024
|
98
|
-
Timestamp('2024-03-24', tz='Asia/Jerusalem'),
|
99
|
-
Timestamp('2024-03-25', tz='Asia/Jerusalem'),
|
100
|
-
Timestamp('2024-04-22', tz='Asia/Jerusalem'),
|
101
|
-
Timestamp('2024-04-23', tz='Asia/Jerusalem'),
|
102
|
-
Timestamp('2024-04-28', tz='Asia/Jerusalem'),
|
103
|
-
Timestamp('2024-04-29', tz='Asia/Jerusalem'),
|
104
|
-
Timestamp('2024-05-13', tz='Asia/Jerusalem'),
|
105
|
-
Timestamp('2024-05-14', tz='Asia/Jerusalem'),
|
106
|
-
Timestamp('2024-06-11', tz='Asia/Jerusalem'),
|
107
|
-
Timestamp('2024-06-12', tz='Asia/Jerusalem'),
|
108
|
-
Timestamp('2024-08-13', tz='Asia/Jerusalem'),
|
109
|
-
Timestamp('2024-10-02', tz='Asia/Jerusalem'),
|
110
|
-
Timestamp('2024-10-03', tz='Asia/Jerusalem'),
|
111
|
-
Timestamp('2024-10-04', tz='Asia/Jerusalem'),
|
112
|
-
Timestamp('2024-10-11', tz='Asia/Jerusalem'),
|
113
|
-
Timestamp('2024-10-16', tz='Asia/Jerusalem'),
|
114
|
-
Timestamp('2024-10-17', tz='Asia/Jerusalem'),
|
115
|
-
Timestamp('2024-10-23', tz='Asia/Jerusalem'),
|
116
|
-
Timestamp('2024-10-24', tz='Asia/Jerusalem'),
|
117
|
-
#2025
|
118
|
-
Timestamp('2025-03-14', tz='Asia/Jerusalem'),
|
119
|
-
Timestamp('2025-04-13', tz='Asia/Jerusalem'),
|
120
|
-
Timestamp('2025-04-18', tz='Asia/Jerusalem'),
|
121
|
-
Timestamp('2025-04-30', tz='Asia/Jerusalem'),
|
122
|
-
Timestamp('2025-05-01', tz='Asia/Jerusalem'),
|
123
|
-
Timestamp('2025-06-01', tz='Asia/Jerusalem'),
|
124
|
-
Timestamp('2025-06-02', tz='Asia/Jerusalem'),
|
125
|
-
Timestamp('2025-08-03', tz='Asia/Jerusalem'),
|
126
|
-
Timestamp('2025-09-22', tz='Asia/Jerusalem'),
|
127
|
-
Timestamp('2025-09-23', tz='Asia/Jerusalem'),
|
128
|
-
Timestamp('2025-09-24', tz='Asia/Jerusalem'),
|
129
|
-
Timestamp('2025-10-01', tz='Asia/Jerusalem'),
|
130
|
-
Timestamp('2025-10-02', tz='Asia/Jerusalem'),
|
131
|
-
Timestamp('2025-10-06', tz='Asia/Jerusalem'),
|
132
|
-
Timestamp('2025-10-07', tz='Asia/Jerusalem'),
|
133
|
-
Timestamp('2025-10-13', tz='Asia/Jerusalem'),
|
134
|
-
Timestamp('2025-10-14', tz='Asia/Jerusalem')
|
135
|
-
]
|
136
|
-
|
137
|
-
|
138
|
-
class TASEExchangeCalendar(MarketCalendar):
|
139
|
-
"""
|
140
|
-
Exchange calendar for TASE Stock Exchange
|
141
|
-
|
142
|
-
Note these dates are only checked against 2020 and 2021
|
143
|
-
https://info.tase.co.il/Eng/about_tase/corporate/Pages/vacation_schedule.aspx
|
144
|
-
|
145
|
-
Opening times for the regular trading of equities (not including closing auction call)
|
146
|
-
Open Time: 10:00 AM Asia/Jerusalem
|
147
|
-
Close Time: 3:59 PM Asia/Jerusalem
|
148
|
-
|
149
|
-
Daylight Saving Time in Israel comes into effect on the Friday before the last Sunday in March, and lasts until the
|
150
|
-
last Sunday in October.
|
151
|
-
During the Daylight Saving time period the clock will be UTC+3, and for the rest of the year UTC+2.
|
152
|
-
|
153
|
-
Regularly-Observed Holidays (not necessarily in order):
|
154
|
-
- Purim
|
155
|
-
- Passover_I_Eve
|
156
|
-
- Passover_I
|
157
|
-
- Passover_II_Eve
|
158
|
-
- Passover_II
|
159
|
-
- Independence_Day
|
160
|
-
- Yom_HaZikaron
|
161
|
-
- Shavuot_Eve
|
162
|
-
- Shavuot
|
163
|
-
- Tisha_beAv
|
164
|
-
- Jewish_New_Year_Eve
|
165
|
-
- Jewish_New_Year_I
|
166
|
-
- Jewish_New_Year_II
|
167
|
-
- Yom_Kippur_Eve
|
168
|
-
- Yom_Kippur
|
169
|
-
- Sukkoth_Eve
|
170
|
-
- Sukkoth
|
171
|
-
- Simchat_Tora_Eve
|
172
|
-
- Simchat_Tora
|
173
|
-
"""
|
174
|
-
|
175
|
-
aliases = ['TASE']
|
176
|
-
regular_market_times = {
|
177
|
-
"market_open": ((None, time(10)),),
|
178
|
-
"market_close": ((None, time(15,59)),)
|
179
|
-
}
|
180
|
-
|
181
|
-
@property
|
182
|
-
def name(self):
|
183
|
-
return "TASE"
|
184
|
-
|
185
|
-
@property
|
186
|
-
def tz(self):
|
187
|
-
return timezone("Asia/Jerusalem")
|
188
|
-
|
189
|
-
@property
|
190
|
-
def adhoc_holidays(self):
|
191
|
-
return TASEClosedDay
|
192
|
-
|
193
|
-
@property
|
194
|
-
def weekmask(self):
|
195
|
-
return "Sun Mon Tue Wed Thu"
|
@@ -1,159 +0,0 @@
|
|
1
|
-
from datetime import time
|
2
|
-
|
3
|
-
import pandas as pd
|
4
|
-
from pandas.tseries.holiday import AbstractHolidayCalendar, DateOffset, GoodFriday, Holiday, MO, weekend_to_monday
|
5
|
-
from pytz import timezone
|
6
|
-
from itertools import chain
|
7
|
-
|
8
|
-
from .holidays_uk import BoxingDay, WeekendBoxingDay, WeekendChristmas
|
9
|
-
from .market_calendar import MarketCalendar, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
|
10
|
-
|
11
|
-
# New Year's Day
|
12
|
-
TSXNewYearsDay = Holiday(
|
13
|
-
"New Year's Day",
|
14
|
-
month=1,
|
15
|
-
day=1,
|
16
|
-
observance=weekend_to_monday,
|
17
|
-
)
|
18
|
-
# Ontario Family Day
|
19
|
-
FamilyDay = Holiday(
|
20
|
-
"Family Day",
|
21
|
-
month=2,
|
22
|
-
day=1,
|
23
|
-
offset=DateOffset(weekday=MO(3)),
|
24
|
-
start_date='2008-01-01',
|
25
|
-
)
|
26
|
-
# Victoria Day
|
27
|
-
# https://www.timeanddate.com/holidays/canada/victoria-day
|
28
|
-
VictoriaDay = Holiday(
|
29
|
-
'Victoria Day',
|
30
|
-
month=5,
|
31
|
-
day=24,
|
32
|
-
offset=DateOffset(weekday=MO(-1)),
|
33
|
-
)
|
34
|
-
# Canada Day
|
35
|
-
CanadaDay = Holiday(
|
36
|
-
'Canada Day',
|
37
|
-
month=7,
|
38
|
-
day=1,
|
39
|
-
observance=weekend_to_monday,
|
40
|
-
)
|
41
|
-
# Civic Holiday
|
42
|
-
CivicHoliday = Holiday(
|
43
|
-
'Civic Holiday',
|
44
|
-
month=8,
|
45
|
-
day=1,
|
46
|
-
offset=DateOffset(weekday=MO(1)),
|
47
|
-
)
|
48
|
-
# Labor Day
|
49
|
-
LaborDay = Holiday(
|
50
|
-
'Labor Day',
|
51
|
-
month=9,
|
52
|
-
day=1,
|
53
|
-
offset=DateOffset(weekday=MO(1)),
|
54
|
-
)
|
55
|
-
# Thanksgiving
|
56
|
-
Thanksgiving = Holiday(
|
57
|
-
'Thanksgiving',
|
58
|
-
month=10,
|
59
|
-
day=1,
|
60
|
-
offset=DateOffset(weekday=MO(2)),
|
61
|
-
)
|
62
|
-
|
63
|
-
Christmas = Holiday(
|
64
|
-
'Christmas',
|
65
|
-
month=12,
|
66
|
-
day=25,
|
67
|
-
)
|
68
|
-
|
69
|
-
ChristmasEveEarlyClose2010Onwards = Holiday(
|
70
|
-
"Christmas Eve Early Close",
|
71
|
-
month=12,
|
72
|
-
day=24,
|
73
|
-
days_of_week=(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY),
|
74
|
-
start_date=pd.Timestamp("2010-01-01"),
|
75
|
-
)
|
76
|
-
|
77
|
-
September11Closings2001 = [
|
78
|
-
pd.Timestamp("2001-09-11", tz='UTC'),
|
79
|
-
pd.Timestamp("2001-09-12", tz='UTC'),
|
80
|
-
]
|
81
|
-
|
82
|
-
|
83
|
-
class TSXExchangeCalendar(MarketCalendar):
|
84
|
-
"""
|
85
|
-
Exchange calendar for the Toronto Stock Exchange
|
86
|
-
|
87
|
-
Open Time: 9:30 AM, EST
|
88
|
-
Close Time: 4:00 PM, EST
|
89
|
-
|
90
|
-
Regularly-Observed Holidays:
|
91
|
-
- New Years Day (observed on first business day on/after)
|
92
|
-
- Family Day (Third Monday in February, starting in 2008)
|
93
|
-
- Good Friday
|
94
|
-
- Victoria Day (Monday before May 25th)
|
95
|
-
- Canada Day (July 1st, observed first business day after)
|
96
|
-
- Civic Holiday (First Monday in August)
|
97
|
-
- Labor Day (First Monday in September)
|
98
|
-
- Thanksgiving (Second Monday in October)
|
99
|
-
- Christmas Day
|
100
|
-
- Dec. 26th if Christmas is on a Sunday
|
101
|
-
- Dec. 27th if Christmas is on a weekend
|
102
|
-
- Boxing Day
|
103
|
-
- Dec. 27th if Christmas is on a Sunday
|
104
|
-
- Dec. 28th if Boxing Day is on a weekend
|
105
|
-
|
106
|
-
Early closes:
|
107
|
-
- Starting in 2010, if Christmas Eve falls on a weekday, the market
|
108
|
-
closes at 1:00 pm that day. If it falls on a weekend, there is no
|
109
|
-
early close.
|
110
|
-
"""
|
111
|
-
aliases = ['TSX', 'TSXV']
|
112
|
-
|
113
|
-
regular_market_times = {
|
114
|
-
"market_open": ((None, time(9, 30)),),
|
115
|
-
"market_close": ((None, time(16)),)
|
116
|
-
}
|
117
|
-
|
118
|
-
|
119
|
-
@property
|
120
|
-
def name(self):
|
121
|
-
return "TSX"
|
122
|
-
|
123
|
-
@property
|
124
|
-
def tz(self):
|
125
|
-
return timezone('Canada/Eastern')
|
126
|
-
|
127
|
-
regular_early_close = time(13)
|
128
|
-
|
129
|
-
@property
|
130
|
-
def regular_holidays(self):
|
131
|
-
return AbstractHolidayCalendar(rules=[
|
132
|
-
TSXNewYearsDay,
|
133
|
-
FamilyDay,
|
134
|
-
GoodFriday,
|
135
|
-
VictoriaDay,
|
136
|
-
CanadaDay,
|
137
|
-
CivicHoliday,
|
138
|
-
LaborDay,
|
139
|
-
Thanksgiving,
|
140
|
-
Christmas,
|
141
|
-
WeekendChristmas,
|
142
|
-
BoxingDay,
|
143
|
-
WeekendBoxingDay
|
144
|
-
])
|
145
|
-
|
146
|
-
@property
|
147
|
-
def adhoc_holidays(self):
|
148
|
-
return list(chain(
|
149
|
-
September11Closings2001,
|
150
|
-
))
|
151
|
-
|
152
|
-
@property
|
153
|
-
def special_closes(self):
|
154
|
-
return [
|
155
|
-
(
|
156
|
-
self.regular_early_close,
|
157
|
-
AbstractHolidayCalendar([ChristmasEveEarlyClose2010Onwards]),
|
158
|
-
)
|
159
|
-
]
|