fa45d8aa5f
- health_checklist.json: 192.168.1.122→node122
- ocr_client.py: docstring IP→node122
- docs/market-data-requirements.md: IP→node122
- 所有API调用通过ProxyHandler({})绕过系统代理
Privoxy对node122:18003返回500,直连正常
82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
from datetime import time
|
|
from itertools import chain
|
|
from zoneinfo import ZoneInfo
|
|
|
|
import pandas as pd
|
|
from pandas.tseries.holiday import Holiday
|
|
import numpy as np # for concatenate
|
|
|
|
from exchange_calendars.exchange_calendar import ExchangeCalendar, HolidayCalendar
|
|
|
|
SaudiFoundingDay = Holiday("Saudi Founding Day", month=2, day=22)
|
|
|
|
NationalDayOfSaudiArabia = Holiday("National Day of Saudi Arabia", month=9, day=23)
|
|
|
|
# https://www.saudiexchange.sa/wps/portal/saudiexchange/about-saudi-exchange/exchange-media-centre/saudi-exchange-holiday-calendar?locale=en
|
|
EidAlAdhaHoliday = pd.to_datetime(
|
|
np.concatenate(
|
|
[
|
|
pd.date_range("2029-04-20", "2029-04-28"),
|
|
pd.date_range("2028-05-03", "2028-05-09"),
|
|
pd.date_range("2027-05-14", "2027-05-22"),
|
|
pd.date_range("2026-05-22", "2026-05-30"),
|
|
pd.date_range("2025-06-04", "2025-06-09"),
|
|
pd.date_range("2024-06-13", "2024-06-23"),
|
|
pd.date_range("2023-06-27", "2023-07-02"),
|
|
pd.date_range("2022-07-07", "2022-07-13"),
|
|
pd.date_range("2021-07-16", "2021-07-22"),
|
|
]
|
|
)
|
|
)
|
|
|
|
EidAlFiterHoliday = pd.to_datetime(
|
|
np.concatenate(
|
|
[
|
|
pd.date_range("2029-02-12", "2029-02-18"),
|
|
pd.date_range("2028-02-25", "2028-03-04"),
|
|
pd.date_range("2027-03-05", "2027-03-13"),
|
|
pd.date_range("2026-03-17", "2026-03-23"),
|
|
pd.date_range("2025-03-27", "2025-04-02"),
|
|
pd.date_range("2024-04-05", "2024-04-15"),
|
|
pd.date_range("2023-04-18", "2023-04-25"),
|
|
pd.date_range("2022-04-28", "2022-05-08"),
|
|
pd.date_range("2021-05-13", "2021-05-16"),
|
|
]
|
|
)
|
|
)
|
|
|
|
|
|
class XSAUExchangeCalendar(ExchangeCalendar):
|
|
"""
|
|
Exchange calendar for the Saudi Exchange (XSAU)
|
|
Available here: https://www.saudiexchange.sa/wps/portal/saudiexchange/rules-guidance/capital-market-overview/trading-cycle-and-times
|
|
"""
|
|
|
|
name = "XSAU"
|
|
|
|
tz = ZoneInfo("Asia/Riyadh")
|
|
|
|
open_times = ((None, time(10)),)
|
|
|
|
close_times = ((None, time(15)),)
|
|
|
|
@classmethod
|
|
def bound_min(cls) -> pd.Timestamp:
|
|
return pd.Timestamp("2021-01-01")
|
|
|
|
@classmethod
|
|
def bound_max(cls) -> pd.Timestamp:
|
|
return pd.Timestamp("2029-12-31")
|
|
|
|
@property
|
|
def regular_holidays(self):
|
|
return HolidayCalendar([SaudiFoundingDay, NationalDayOfSaudiArabia])
|
|
|
|
@property
|
|
def weekmask(self):
|
|
return "1111001"
|
|
|
|
@property
|
|
def adhoc_holidays(self):
|
|
return list(chain(EidAlAdhaHoliday, EidAlFiterHoliday))
|