Source code for wraquant.data.calendar
"""Trading calendar utilities.
Wraps exchange-calendars and pandas-market-calendars for trading day
schedules, market hours, and holiday detection.
"""
from __future__ import annotations
from typing import Any
import pandas as pd
from wraquant.core.decorators import requires_extra
from wraquant.core.types import DateLike
from wraquant.data.utils import parse_date
[docs]
@requires_extra("market-data")
def get_trading_calendar(exchange: str = "XNYS") -> Any:
"""Get a trading calendar for an exchange.
Parameters:
exchange: Exchange MIC code (default: NYSE = 'XNYS').
Returns:
exchange_calendars.ExchangeCalendar instance.
Example:
>>> cal = get_trading_calendar("XNYS") # doctest: +SKIP
"""
import exchange_calendars
return exchange_calendars.get_calendar(exchange)
[docs]
@requires_extra("market-data")
def trading_days(
start: DateLike,
end: DateLike,
exchange: str = "XNYS",
) -> pd.DatetimeIndex:
"""Get trading days between two dates.
Parameters:
start: Start date.
end: End date.
exchange: Exchange MIC code.
Returns:
DatetimeIndex of valid trading days.
"""
cal = get_trading_calendar(exchange)
s = parse_date(start)
e = parse_date(end)
sessions = cal.sessions_in_range(s, e)
return pd.DatetimeIndex(sessions)
[docs]
def is_business_day(dt: DateLike) -> bool:
"""Check if a date is a business day (Mon-Fri).
Parameters:
dt: Date to check.
Returns:
True if weekday, False if weekend.
"""
ts = parse_date(dt)
if ts is None:
raise ValueError("Date cannot be None")
return ts.weekday() < 5