def us_market_holidays(years) -> list: """Get US market holidays""" if isinstance(years, int): years = [ years, ] # https://www.nyse.com/markets/hours-calendars market_holidays = [ "Martin Luther King Jr. Day", "Washington's Birthday", "Memorial Day", "Independence Day", "Labor Day", "Thanksgiving", "Christmas Day", ] # http://www.maa.clell.de/StarDate/publ_holidays.html good_fridays = { 2010: "2010-04-02", 2011: "2011-04-22", 2012: "2012-04-06", 2013: "2013-03-29", 2014: "2014-04-18", 2015: "2015-04-03", 2016: "2016-03-25", 2017: "2017-04-14", 2018: "2018-03-30", 2019: "2019-04-19", 2020: "2020-04-10", 2021: "2021-04-02", 2022: "2022-04-15", 2023: "2023-04-07", 2024: "2024-03-29", 2025: "2025-04-18", 2026: "2026-04-03", 2027: "2027-03-26", 2028: "2028-04-14", 2029: "2029-03-30", 2030: "2030-04-19", } market_and_observed_holidays = market_holidays + [ holiday + " (Observed)" for holiday in market_holidays ] all_holidays = us_holidays(years=years) valid_holidays = [] for date in list(all_holidays): if all_holidays[date] in market_and_observed_holidays: valid_holidays.append(date) for year in years: new_Year = datetime.strptime(f"{year}-01-01", "%Y-%m-%d") if new_Year.weekday() != 5: # ignore saturday valid_holidays.append(new_Year.date()) if new_Year.weekday() == 6: # add monday for Sunday valid_holidays.append(new_Year.date() + timedelta(1)) for year in years: valid_holidays.append( datetime.strptime(good_fridays[year], "%Y-%m-%d").date()) return valid_holidays
def get_last_time_market_was_open(dt): """Get last time the US market was open""" # Check if it is a weekend if dt.date().weekday() > 4: dt = get_last_time_market_was_open(dt - timedelta(hours=24)) # Check if it is a holiday if dt.strftime("%Y-%m-%d") in us_holidays(): dt = get_last_time_market_was_open(dt - timedelta(hours=24)) dt = dt.replace(hour=21, minute=0, second=0) return dt