You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.1 KiB
Python
40 lines
1.1 KiB
Python
"""Calendar utilities for the backtester — thin wrappers over existing libs."""
|
|
from __future__ import annotations
|
|
|
|
import datetime as dt
|
|
|
|
from libs.common.time_utils import (
|
|
is_trading_day,
|
|
next_trading_day,
|
|
trading_days_between,
|
|
)
|
|
from libs.labeler.reaction_date import compute_reaction_date
|
|
|
|
|
|
def resolve_execution_date(
|
|
event_date: dt.date,
|
|
filing_time_bucket: str,
|
|
) -> dt.date:
|
|
"""Return the date on which the trade is executed (next open after reaction).
|
|
|
|
The reaction_date is the first trading day the market can react.
|
|
Execution date = next trading day after reaction_date (entry at next open).
|
|
"""
|
|
reaction = compute_reaction_date(event_date, filing_time_bucket)
|
|
return next_trading_day(reaction)
|
|
|
|
|
|
def get_trading_days(start: dt.date, end: dt.date) -> list[dt.date]:
|
|
"""Return all NYSE trading days in [start, end] inclusive."""
|
|
return trading_days_between(start, end)
|
|
|
|
|
|
__all__ = [
|
|
"resolve_execution_date",
|
|
"get_trading_days",
|
|
"is_trading_day",
|
|
"next_trading_day",
|
|
"trading_days_between",
|
|
"compute_reaction_date",
|
|
]
|