From 1c351c3ee18e3bc87e77bef11332ec19e4558895 Mon Sep 17 00:00:00 2001 From: Noufal E Date: Sun, 21 Mar 2021 18:40:01 -0700 Subject: [PATCH 1/2] US Holidays Fix --- gamestonk_terminal/helper_funcs.py | 68 +++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/gamestonk_terminal/helper_funcs.py b/gamestonk_terminal/helper_funcs.py index ae83fca3972..7623f5cbedb 100644 --- a/gamestonk_terminal/helper_funcs.py +++ b/gamestonk_terminal/helper_funcs.py @@ -62,6 +62,64 @@ def plot_view_stock(df, symbol): print("") +def us_market_holidays(years) -> list: + if isinstance(years, int): + years = [ + years, + ] + # https://www.nyse.com/markets/hours-calendars + marketHolidays = [ + "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 + goodFridays = { + 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: "2020-04-02", + 2022: "2020-04-15", + 2023: "2020-04-07", + 2024: "2020-03-29", + 2025: "2020-04-18", + 2026: "2020-04-03", + 2027: "2020-03-26", + 2028: "2020-04-14", + 2029: "2020-03-30", + 2030: "2020-04-19", + } + marketHolidays_and_obsrvd = marketHolidays + [ + holiday + " (Observed)" for holiday in marketHolidays + ] + allHolidays = holidaysUS(years=years) + validHolidays = [] + for date in list(allHolidays): + if allHolidays[date] in marketHolidays_and_obsrvd: + validHolidays.append(date) + for year in years: + new_Year = datetime.strptime(f"{year}-01-01", "%Y-%m-%d") + if new_Year.weekday() != 5: # ignore saturday + validHolidays.append(new_Year.date()) + if new_Year.weekday() == 6: # add monday for Sunday + validHolidays.append(new_Year.date() + timedelta(1)) + for year in years: + validHolidays.append(datetime.strptime(goodFridays[year], "%Y-%m-%d").date()) + return validHolidays + + def b_is_stock_market_open() -> bool: """ checks if the stock market is open """ # Get current US time @@ -70,7 +128,7 @@ def b_is_stock_market_open() -> bool: if now.date().weekday() > 4: return False # Check if it is a holiday - if now.strftime("%Y-%m-%d") in holidaysUS(): + if now.strftime("%Y-%m-%d") in us_market_holidays(now.year): return False # Check if it hasn't open already if now.time() < Time(hour=9, minute=30, second=0): @@ -143,15 +201,21 @@ def divide_chunks(data, n): def get_next_stock_market_days(last_stock_day, n_next_days) -> list: n_days = 0 l_pred_days = list() + years = list() + holidays = list() while n_days < n_next_days: last_stock_day += timedelta(hours=24) + year = last_stock_day.date().year + if year not in years: + years.append(year) + holidays = holidays + us_market_holidays(year) # Check if it is a weekend if last_stock_day.date().weekday() > 4: continue # Check if it is a holiday - if last_stock_day.strftime("%Y-%m-%d") in holidaysUS(): + if last_stock_day.strftime("%Y-%m-%d") in holidays: continue # Otherwise stock market is open n_days += 1 From b52e04c1ae41a857020ccda57a60dd1809c710cf Mon Sep 17 00:00:00 2001 From: Noufal E Date: Sun, 21 Mar 2021 18:54:32 -0700 Subject: [PATCH 2/2] US Holidays Fix --- gamestonk_terminal/helper_funcs.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/gamestonk_terminal/helper_funcs.py b/gamestonk_terminal/helper_funcs.py index 7623f5cbedb..4aff574d3f5 100644 --- a/gamestonk_terminal/helper_funcs.py +++ b/gamestonk_terminal/helper_funcs.py @@ -201,16 +201,14 @@ def divide_chunks(data, n): def get_next_stock_market_days(last_stock_day, n_next_days) -> list: n_days = 0 l_pred_days = list() - years = list() - holidays = list() + years: list = [] + holidays: list = [] while n_days < n_next_days: - last_stock_day += timedelta(hours=24) year = last_stock_day.date().year if year not in years: years.append(year) holidays = holidays + us_market_holidays(year) - # Check if it is a weekend if last_stock_day.date().weekday() > 4: continue