def all_labor(start, end): labors = rrule.rrule(rrule.YEARLY, bymonth=9, byweekday=rrule.MO(1), dtstart=start, until=end) return [d.date() for d in labors]
def all_labor(start, end): # return the list of Labor Day dates within start..end labors = rrule.rrule(rrule.YEARLY, bymonth=9, byweekday=rrule.MO(1), dtstart=start, until=end) return [d.date() for d in labors] # no need to test for in-between here
def _labor_day(self, dtstart=None, until=None, count=None): """Labor day is the first monday of September""" kwargs = { "freq": rrule.YEARLY, "bymonth": 9, "byweekday": rrule.MO(1), "dtstart": dtstart, "until": until, "count": count, } return self._irule(**kwargs)
def _spring_withdraw_deadline(self, dtstart=None, until=None, count=None): """Spring withdraw deadline is the third Monday in March""" kwargs = { "freq": rrule.YEARLY, "bymonth": 3, "byweekday": rrule.MO(3), "dtstart": dtstart, "until": until, "count": count, } return self._irule(**kwargs)
def _fall_start(self, dtstart=None, until=None, count=None): """Fall term starts the second to last Monday of August""" kwargs = { "freq": rrule.YEARLY, "bymonth": 8, "byweekday": rrule.MO(-2), "dtstart": dtstart, "until": until, "count": count, } return self._irule(**kwargs)
def _fall_break_start(self, dtstart=None, until=None, count=None): """Fall break starts the second to last Monday of October""" kwargs = { "freq": rrule.YEARLY, "bymonth": 10, "byweekday": rrule.MO(-2), "dtstart": dtstart, "until": until, "count": count, } return self._irule(**kwargs)
def _mlk_day(self, dtstart=None, until=None, count=None): """MLK day is the third monday of January""" kwargs = { "freq": rrule.YEARLY, "bymonth": 1, "byweekday": rrule.MO(3), "dtstart": dtstart, "until": until, "count": count, } return self._irule(**kwargs)
def _memorial_day(self, dtstart=None, until=None, count=None): """Memorial day is the last monday of March""" kwargs = { "freq": rrule.YEARLY, "bymonth": 3, "byweekday": rrule.MO(-1), "dtstart": dtstart, "until": until, "count": count, } return self._irule(**kwargs)
def NYSE_holidays(a=datetime.date.today(), b=datetime.date.today()+datetime.timedelta(days=365)): rs = rrule.rruleset() # Include all potential holiday observances rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=12, bymonthday=31, byweekday=rrule.FR)) # New Years Day rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth= 1, bymonthday= 1)) # New Years Day rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth= 1, bymonthday= 2, byweekday=rrule.MO)) # New Years Day rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth= 1, byweekday= rrule.MO(3))) # Martin Luther King Day rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth= 2, byweekday= rrule.MO(3))) # Washington's Birthday rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, byeaster= -2)) # Good Friday rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth= 5, byweekday= rrule.MO(-1))) # Memorial Day rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth= 7, bymonthday= 3, byweekday=rrule.FR)) # Independence Day rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth= 7, bymonthday= 4)) # Independence Day rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth= 7, bymonthday= 5, byweekday=rrule.MO)) # Independence Day rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth= 9, byweekday= rrule.MO(1))) # Labor Day rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=11, byweekday= rrule.TH(4))) # Thanksgiving Day rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=12, bymonthday=24, byweekday=rrule.FR)) # Christmas rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=12, bymonthday=25)) # Christmas rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=12, bymonthday=26, byweekday=rrule.MO)) # Christmas # Exclude potential holidays that fall on weekends rs.exrule(rrule.rrule(rrule.WEEKLY, dtstart=a, until=b, byweekday=(rrule.SA,rrule.SU)))
def get_schedule_holidays_rrules(): return [ rrule.rrule(rrule.YEARLY, dtstart=datetime.now(), bymonth=1, bymonthday=1), # New Years rrule.rrule(rrule.YEARLY, dtstart=datetime.now(), bymonth=5, byweekday=rrule.MO(-1)), # Memorial rrule.rrule(rrule.YEARLY, dtstart=datetime.now(), bymonth=7, bymonthday=4), # Independence rrule.rrule(rrule.YEARLY, dtstart=datetime.now(), bymonth=11, byweekday=rrule.TH(4)), # Thanksgiving rrule.rrule(rrule.YEARLY, dtstart=datetime.now(), bymonth=12, bymonthday=25), # Christmas ]
# ------- YOUR CODE -------------# from dateutil import rrule from datetime import datetime MLK_DAY = rrule.rrule( dtstart=datetime(1986, 1, 20), # First celebration freq=rrule.YEARLY, # Occurs once per year bymonth=1, # In January byweekday=rrule.MO(+3), # On the 3rd Monday ) # -------------------------------# from datetime import datetime MLK_TEST_CASES = [ ((datetime(1970, 1, 1), datetime(1980, 1, 1)), []), ((datetime(1980, 1, 1), datetime(1989, 1, 1)), [datetime(1986, 1, 20), datetime(1987, 1, 19), datetime(1988, 1, 18)]), ((datetime(2017, 2, 1), datetime(2022, 2, 1)), [ datetime(2018, 1, 15, 0, 0), datetime(2019, 1, 21, 0, 0), datetime(2020, 1, 20, 0, 0), datetime(2021, 1, 18, 0, 0), datetime(2022, 1, 17, 0, 0) ]), ]
def get_non_trading_days(start, end): non_trading_rules = [] start = canonicalize_datetime(start) end = canonicalize_datetime(end) weekends = rrule.rrule( rrule.YEARLY, byweekday=(rrule.SA, rrule.SU), cache=True, dtstart=start, until=end ) non_trading_rules.append(weekends) new_years = rrule.rrule( rrule.MONTHLY, byyearday=1, cache=True, dtstart=start, until=end ) non_trading_rules.append(new_years) new_years_sunday = rrule.rrule( rrule.MONTHLY, byyearday=2, byweekday=rrule.MO, cache=True, dtstart=start, until=end ) non_trading_rules.append(new_years_sunday) new_years_saturday = rrule.rrule( rrule.MONTHLY, byyearday=3, byweekday=rrule.MO, cache=True, dtstart=start, until=end ) non_trading_rules.append(new_years_saturday) # Family day in Ontario, starting in 2008, third monday of February family_day = rrule.rrule( rrule.MONTHLY, bymonth=2, byweekday=(rrule.MO(3)), cache=True, dtstart=datetime(2008, 1, 1, tzinfo=pytz.utc), until=end ) non_trading_rules.append(family_day) good_friday = rrule.rrule( rrule.DAILY, byeaster=-2, cache=True, dtstart=start, until=end ) non_trading_rules.append(good_friday) # Monday prior to May 25th. victoria_day = rrule.rrule( rrule.MONTHLY, bymonth=5, byweekday=rrule.MO, bymonthday=[24, 23, 22, 21, 20, 19, 18], cache=True, dtstart=start, until=end ) non_trading_rules.append(victoria_day) july_1st = rrule.rrule( rrule.MONTHLY, bymonth=7, bymonthday=1, cache=True, dtstart=start, until=end ) non_trading_rules.append(july_1st) july_1st_sunday = rrule.rrule( rrule.MONTHLY, bymonth=7, bymonthday=2, byweekday=rrule.MO, cache=True, dtstart=start, until=end ) non_trading_rules.append(july_1st_sunday) july_1st_saturday = rrule.rrule( rrule.MONTHLY, bymonth=7, bymonthday=3, byweekday=rrule.MO, cache=True, dtstart=start, until=end ) non_trading_rules.append(july_1st_saturday) civic_holiday = rrule.rrule( rrule.MONTHLY, bymonth=8, byweekday=rrule.MO(1), cache=True, dtstart=start, until=end ) non_trading_rules.append(civic_holiday) labor_day = rrule.rrule( rrule.MONTHLY, bymonth=9, byweekday=(rrule.MO(1)), cache=True, dtstart=start, until=end ) non_trading_rules.append(labor_day) thanksgiving = rrule.rrule( rrule.MONTHLY, bymonth=10, byweekday=(rrule.MO(2)), cache=True, dtstart=start, until=end ) non_trading_rules.append(thanksgiving) christmas = rrule.rrule( rrule.MONTHLY, bymonth=12, bymonthday=25, cache=True, dtstart=start, until=end ) non_trading_rules.append(christmas) # If Christmas is a Sunday then the 26th, a Monday is observed. # (but that would be boxing day), so the 27th is also observed. christmas_sunday = rrule.rrule( rrule.MONTHLY, bymonth=12, bymonthday=27, byweekday=rrule.TU, cache=True, dtstart=start, until=end ) non_trading_rules.append(christmas_sunday) # If Christmas is a Saturday then the 27th, a monday is observed. christmas_saturday = rrule.rrule( rrule.MONTHLY, bymonth=12, bymonthday=27, byweekday=rrule.MO, cache=True, dtstart=start, until=end ) non_trading_rules.append(christmas_saturday) boxing_day = rrule.rrule( rrule.MONTHLY, bymonth=12, bymonthday=26, cache=True, dtstart=start, until=end ) non_trading_rules.append(boxing_day) # if boxing day is a sunday, the Christmas was saturday. # Christmas is observed on the 27th, a month and boxing day is observed # on the 28th, a tuesday. boxing_day_sunday = rrule.rrule( rrule.MONTHLY, bymonth=12, bymonthday=28, byweekday=rrule.TU, cache=True, dtstart=start, until=end ) non_trading_rules.append(boxing_day_sunday) # If boxing day is a Saturday then the 28th, a monday is observed. boxing_day_saturday = rrule.rrule( rrule.MONTHLY, bymonth=12, bymonthday=28, byweekday=rrule.MO, cache=True, dtstart=start, until=end ) non_trading_rules.append(boxing_day_saturday) non_trading_ruleset = rrule.rruleset() for rule in non_trading_rules: non_trading_ruleset.rrule(rule) non_trading_days = non_trading_ruleset.between(start, end, inc=True) # Add September 11th closings # The TSX was open for 71 minutes on September 11, 2011. # It was closed on the 12th and reopened on the 13th. # http://www.cbc.ca/news2/interactives/map-tsx/ # # September 2001 # Su Mo Tu We Th Fr Sa # 1 # 2 3 4 5 6 7 8 # 9 10 11 12 13 14 15 # 16 17 18 19 20 21 22 # 23 24 25 26 27 28 29 # 30 non_trading_days.append( datetime(2001, 9, 12, tzinfo=pytz.utc)) non_trading_days.sort() return pd.DatetimeIndex(non_trading_days)
def get_nyse_holidays(year_start_, year_end_): a = datetime.date(year_start_, 1, 1) b = datetime.date(year_end_, 12, 31) rs = rrule.rruleset() rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=12, bymonthday=31, byweekday=rrule.FR)) # New Years Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=1, bymonthday=1)) # New Years Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=1, bymonthday=2, byweekday=rrule.MO)) # New Years Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=1, byweekday=rrule.MO(3))) # Martin Luther King Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=2, byweekday=rrule.MO(3))) # Washington's Birthday rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, byeaster=-2)) # Good Friday rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=5, byweekday=rrule.MO(-1))) # Memorial Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=7, bymonthday=3, byweekday=rrule.FR)) # Independence Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=7, bymonthday=4)) # Independence Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=7, bymonthday=5, byweekday=rrule.MO)) # Independence Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=9, byweekday=rrule.MO(1))) # Labor Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=11, byweekday=rrule.TH(4))) # Thanksgiving Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=12, bymonthday=24, byweekday=rrule.FR)) # Christmas rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=12, bymonthday=25)) # Christmas rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=12, bymonthday=26, byweekday=rrule.MO)) # Christmas # Exclude potential holidays that fall on weekends rs.exrule( rrule.rrule(rrule.WEEKLY, dtstart=a, until=b, byweekday=(rrule.SA, rrule.SU))) return list(rs)
def get_non_trading_days(start, end): non_trading_rules = [] start = canonicalize_datetime(start) end = canonicalize_datetime(end) weekends = rrule.rrule(rrule.YEARLY, byweekday=(rrule.SA, rrule.SU), cache=True, dtstart=start, until=end) non_trading_rules.append(weekends) new_years = rrule.rrule(rrule.MONTHLY, byyearday=1, cache=True, dtstart=start, until=end) non_trading_rules.append(new_years) new_years_sunday = rrule.rrule(rrule.MONTHLY, byyearday=2, byweekday=rrule.MO, cache=True, dtstart=start, until=end) non_trading_rules.append(new_years_sunday) mlk_day = rrule.rrule(rrule.MONTHLY, bymonth=1, byweekday=(rrule.MO(+3)), cache=True, dtstart=datetime(1998, 1, 1, tzinfo=pytz.utc), until=end) non_trading_rules.append(mlk_day) presidents_day = rrule.rrule(rrule.MONTHLY, bymonth=2, byweekday=(rrule.MO(3)), cache=True, dtstart=start, until=end) non_trading_rules.append(presidents_day) good_friday = rrule.rrule(rrule.DAILY, byeaster=-2, cache=True, dtstart=start, until=end) non_trading_rules.append(good_friday) memorial_day = rrule.rrule(rrule.MONTHLY, bymonth=5, byweekday=(rrule.MO(-1)), cache=True, dtstart=start, until=end) non_trading_rules.append(memorial_day) july_4th = rrule.rrule(rrule.MONTHLY, bymonth=7, bymonthday=4, cache=True, dtstart=start, until=end) non_trading_rules.append(july_4th) july_4th_sunday = rrule.rrule(rrule.MONTHLY, bymonth=7, bymonthday=5, byweekday=rrule.MO, cache=True, dtstart=start, until=end) non_trading_rules.append(july_4th_sunday) july_4th_saturday = rrule.rrule(rrule.MONTHLY, bymonth=7, bymonthday=3, byweekday=rrule.FR, cache=True, dtstart=start, until=end) non_trading_rules.append(july_4th_saturday) labor_day = rrule.rrule(rrule.MONTHLY, bymonth=9, byweekday=(rrule.MO(1)), cache=True, dtstart=start, until=end) non_trading_rules.append(labor_day) thanksgiving = rrule.rrule(rrule.MONTHLY, bymonth=11, byweekday=(rrule.TH(4)), cache=True, dtstart=start, until=end) non_trading_rules.append(thanksgiving) christmas = rrule.rrule(rrule.MONTHLY, bymonth=12, bymonthday=25, cache=True, dtstart=start, until=end) non_trading_rules.append(christmas) christmas_sunday = rrule.rrule(rrule.MONTHLY, bymonth=12, bymonthday=26, byweekday=rrule.MO, cache=True, dtstart=start, until=end) non_trading_rules.append(christmas_sunday) # If Christmas is a Saturday then 24th, a Friday is observed. christmas_saturday = rrule.rrule(rrule.MONTHLY, bymonth=12, bymonthday=24, byweekday=rrule.FR, cache=True, dtstart=start, until=end) non_trading_rules.append(christmas_saturday) non_trading_ruleset = rrule.rruleset() for rule in non_trading_rules: non_trading_ruleset.rrule(rule) non_trading_days = non_trading_ruleset.between(start, end, inc=True) # Add September 11th closings # https://en.wikipedia.org/wiki/Aftermath_of_the_September_11_attacks # Due to the terrorist attacks, the stock market did not open on 9/11/2001 # It did not open again until 9/17/2001. # # September 2001 # Su Mo Tu We Th Fr Sa # 1 # 2 3 4 5 6 7 8 # 9 10 11 12 13 14 15 # 16 17 18 19 20 21 22 # 23 24 25 26 27 28 29 # 30 for day_num in range(11, 17): non_trading_days.append(datetime(2001, 9, day_num, tzinfo=pytz.utc)) # Add closings due to Hurricane Sandy in 2012 # https://en.wikipedia.org/wiki/Hurricane_sandy # # The stock exchange was closed due to Hurricane Sandy's # impact on New York. # It closed on 10/29 and 10/30, reopening on 10/31 # October 2012 # Su Mo Tu We Th Fr Sa # 1 2 3 4 5 6 # 7 8 9 10 11 12 13 # 14 15 16 17 18 19 20 # 21 22 23 24 25 26 27 # 28 29 30 31 for day_num in range(29, 31): non_trading_days.append(datetime(2012, 10, day_num, tzinfo=pytz.utc)) # Misc closings from NYSE listing. # http://www.nyse.com/pdfs/closings.pdf # # National Days of Mourning # - President Richard Nixon non_trading_days.append(datetime(1994, 4, 27, tzinfo=pytz.utc)) # - President Ronald W. Reagan - June 11, 2004 non_trading_days.append(datetime(2004, 6, 11, tzinfo=pytz.utc)) # - President Gerald R. Ford - Jan 2, 2007 non_trading_days.append(datetime(2007, 1, 2, tzinfo=pytz.utc)) non_trading_days.sort() return pd.DatetimeIndex(non_trading_days)
def workingdays(startdate, enddate): # Business days (working days) between the start date and end date days = list(rrule.rrule(rrule.DAILY, byweekday = range(0,5), dtstart = startdate, until = enddate)) # List of company holidays, Memorial Day, Independence Day, Labor Day, Thanksgiving, Company Shutdown, MLK Birthday holidays = list(rrule.rrule(rrule.YEARLY, dtstart = startdate, until = enddate, bymonth = 5, byweekday = rrule.MO(-1))) +\ list(rrule.rrule(rrule.YEARLY, dtstart = startdate, until = enddate, bymonth = 7, bymonthday = 4)) +\ list(rrule.rrule(rrule.YEARLY, dtstart = startdate, until = enddate, bymonth = 9, byweekday = rrule.MO(1))) +\ list(rrule.rrule(rrule.YEARLY, dtstart = startdate, until = enddate, bymonth = 11, byweekday = rrule.TH(4))) +\ list(rrule.rrule(rrule.YEARLY, dtstart = startdate, until = enddate, bymonth = 11, byweekday = rrule.FR(4))) +\ list(rrule.rrule(rrule.YEARLY, dtstart = startdate, until = enddate, bymonth = 12, bymonthday = 25)) +\ list(rrule.rrule(rrule.YEARLY, dtstart = startdate, until = enddate, bymonth = 12, bymonthday = 26)) +\ list(rrule.rrule(rrule.YEARLY, dtstart = startdate, until = enddate, bymonth = 12, bymonthday = 27)) +\ list(rrule.rrule(rrule.YEARLY, dtstart = startdate, until = enddate, bymonth = 12, bymonthday = 28)) +\ list(rrule.rrule(rrule.YEARLY, dtstart = startdate, until = enddate, bymonth = 12, bymonthday = 29)) +\ list(rrule.rrule(rrule.YEARLY, dtstart = startdate, until = enddate, bymonth = 12, bymonthday = 30)) +\ list(rrule.rrule(rrule.YEARLY, dtstart = startdate, until = enddate, bymonth = 12, bymonthday = 31)) +\ list(rrule.rrule(rrule.YEARLY, dtstart = startdate, until = enddate, bymonth = 1, bymonthday = 1)) +\ list(rrule.rrule(rrule.YEARLY, dtstart = startdate, until = enddate, bymonth = 1, byweekday = rrule.MO(3))) # Total number of working days totaldays = len(set(days) - set(holidays)) return totaldays
def NYSE_holidays2(a, b): # Generate ruleset for holiday observances on the NYSE rs = rrule.rruleset() # Include all potential holiday observances ############################################### # New Years Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=12, bymonthday=31, byweekday=rrule.FR)) # New Years Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=1, bymonthday=1)) # New Years Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=1, bymonthday=2, byweekday=rrule.MO)) # MLK Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=1, byweekday=rrule.MO(3))) # Washington's Bday rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=2, byweekday=rrule.MO(3))) # Good Friday rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, byeaster=-2)) # Memorial Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=5, byweekday=rrule.MO(-1))) # Independence Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=7, bymonthday=3, byweekday=rrule.FR)) # Independence Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=7, bymonthday=4)) # Independence Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=7, bymonthday=5, byweekday=rrule.MO)) # Labor Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=9, byweekday=rrule.MO(1))) # Thanksgiving Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=11, byweekday=rrule.TH(4))) # Christmas rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=12, bymonthday=24, byweekday=rrule.FR)) # Christmas rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=12, bymonthday=25)) # Christmas rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=12, bymonthday=26, byweekday=rrule.MO)) ###################################################### # Exclude potential holidays that fall on weekends rs.exrule( rrule.rrule(rrule.WEEKLY, dtstart=a, until=b, byweekday=(rrule.SA, rrule.SU))) return rs
def get_nontrading_days(start, end): non_trading_rules = [] weekends = rrule.rrule(rrule.YEARLY, byweekday=(rrule.SA, rrule.SU), cache=True, dtstart=start, until=end) non_trading_rules.append(weekends) new_years = rrule.rrule(rrule.MONTHLY, byyearday=1, cache=True, dtstart=start, until=end) non_trading_rules.append(new_years) new_years_sun = rrule.rrule(rrule.MONTHLY, byyearday=2, byweekday=(rrule.MO), cache=True, dtstart=start, until=end) non_trading_rules.append(new_years_sun) mlk_day = rrule.rrule(rrule.MONTHLY, bymonth=1, byweekday=(rrule.MO(+3)), cache=True, dtstart=datetime(1998, 01, 01), until=end) non_trading_rules.append(mlk_day) presidents_day = rrule.rrule(rrule.MONTHLY, bymonth=2, bymonthday=22, cache=True, dtstart=datetime(1950, 01, 01), until=datetime(1971, 01, 01)) non_trading_rules.append(presidents_day) presidents_day_mon = rrule.rrule(rrule.MONTHLY, bymonth=2, byweekday=(rrule.MO(3)), cache=True, dtstart=datetime(1971, 01, 01), until=end) non_trading_rules.append(presidents_day_mon) good_friday = rrule.rrule(rrule.DAILY, byeaster=-2, cache=True, dtstart=start, until=end) non_trading_rules.append(good_friday) memorial_day = rrule.rrule(rrule.MONTHLY, bymonth=5, bymonthday=30, cache=True, dtstart=datetime(1950, 01, 01), until=datetime(1971, 01, 01)) non_trading_rules.append(memorial_day) memorial_mon = rrule.rrule(rrule.MONTHLY, bymonth=5, byweekday=(rrule.MO(-1)), cache=True, dtstart=datetime(1971, 01, 01), until=end) non_trading_rules.append(memorial_mon) paperwork_crisis = rrule.rrule(rrule.WEEKLY, byweekday=rrule.WE, cache=True, dtstart=datetime(1968, 6, 11), until=datetime(1968, 12, 31)) non_trading_rules.append(paperwork_crisis) july_4th_sat = rrule.rrule(rrule.MONTHLY, bymonth=7, byweekday=(rrule.FR), bymonthday=3, cache=True, dtstart=start, until=end) non_trading_rules.append(july_4th_sat) july_4th = rrule.rrule(rrule.MONTHLY, bymonth=7, bymonthday=4, cache=True, dtstart=start, until=end) non_trading_rules.append(july_4th) july_4th_sun = rrule.rrule(rrule.MONTHLY, bymonth=7, byweekday=(rrule.MO), bymonthday=5, cache=True, dtstart=start, until=end) non_trading_rules.append(july_4th_sun) labor_day = rrule.rrule(rrule.MONTHLY, bymonth=9, byweekday=(rrule.MO(1)), cache=True, dtstart=start, until=end) non_trading_rules.append(labor_day) thanksgiving = rrule.rrule(rrule.MONTHLY, bymonth=11, byweekday=(rrule.TH(4)), cache=True, dtstart=start, until=end) non_trading_rules.append(thanksgiving) election = rrule.rrule(rrule.YEARLY, bymonth=11, byweekday=rrule.TU, bymonthday=(2, 3, 4, 5, 6, 7, 8), cache=True, dtstart=datetime(1950, 01, 01), until=datetime(1968, 12, 01)) non_trading_rules.append(election) pres_election = rrule.rrule(rrule.YEARLY, interval=4, bymonth=11, byweekday=rrule.TU, bymonthday=(2, 3, 4, 5, 6, 7, 8), cache=True, dtstart=datetime(1972, 01, 01), until=datetime(1980, 12, 01)) non_trading_rules.append(pres_election) christmas_sat = rrule.rrule(rrule.MONTHLY, bymonth=12, byweekday=(rrule.FR), bymonthday=24, cache=True, dtstart=start, until=end) non_trading_rules.append(christmas_sat) christmas = rrule.rrule(rrule.MONTHLY, bymonth=12, bymonthday=25, cache=True, dtstart=start, until=end) non_trading_rules.append(christmas) christmas_sun = rrule.rrule(rrule.MONTHLY, bymonth=12, byweekday=(rrule.MO), bymonthday=26, cache=True, dtstart=start, until=end) non_trading_rules.append(christmas_sun) non_trading_ruleset = rrule.rruleset() for rule in non_trading_rules: non_trading_ruleset.rrule(rule) non_trading_days = non_trading_ruleset.between(start, end, inc=True) # Add September 11th closings # http://en.wikipedia.org/wiki/Aftermath_of_the_September_11_attacks # Due to the terrorist attacks, the stock market did not open on 9/11/2001 # It did not open again until 9/17/2001. # # September 2001 # Su Mo Tu We Th Fr Sa # 1 # 2 3 4 5 6 7 8 # 9 10 11 12 13 14 15 # 16 17 18 19 20 21 22 # 23 24 25 26 27 28 29 # 30 for day_num in range(11, 17): non_trading_days.append(datetime(2001, 9, day_num)) # Add closings due to Hurricane Sandy in 2012 # http://en.wikipedia.org/wiki/Hurricane_sandy # # The stock exchange was closed due to Hurricane Sandy's # impact on New York. # It closed on 10/29 and 10/30, reopening on 10/31 # October 2012 # Su Mo Tu We Th Fr Sa # 1 2 3 4 5 6 # 7 8 9 10 11 12 13 # 14 15 16 17 18 19 20 # 21 22 23 24 25 26 27 # 28 29 30 31 for day_num in range(29, 31): non_trading_days.append(datetime(2012, 10, day_num)) # Misc closings from NYSE listing. # http://www.nyse.com/pdfs/closings.pdf # # Day before Decoration Day non_trading_days.append(datetime(1961, 5, 29)) # Presidents day friday one time close non_trading_days.append(datetime(1964, 2, 21)) # memorial day friday one time close non_trading_days.append(datetime(1964, 5, 29)) non_trading_days.append(datetime(1965, 5, 31)) # Lincolns birthday non_trading_days.append(datetime(1968, 2, 12)) # MLK Mounrning non_trading_days.append(datetime(1968, 4, 9)) # National Days of Mourning # - President John F. Kennedy non_trading_days.append(datetime(1963, 11, 25)) # - President Richard M. Nixon - April 27, 1994 non_trading_days.append(datetime(1994, 4, 27)) # - President Ronald W. Reagan - June 11, 2004 non_trading_days.append(datetime(2004, 6, 11)) # - President Gerald R. Ford - Jan 2, 2007 non_trading_days.append(datetime(2007, 1, 2)) return non_trading_days
byeaster=-2, cache=True, dtstart=start, until=end) non_trading_rules.append(good_friday) # Easter Monday easter_monday = rrule.rrule(rrule.DAILY, byeaster=1, cache=True, dtstart=start, until=end) non_trading_rules.append(easter_monday) # Early May Bank Holiday (1st Monday in May) may_bank = rrule.rrule(rrule.MONTHLY, bymonth=5, byweekday=(rrule.MO(1)), cache=True, dtstart=start, until=end) non_trading_rules.append(may_bank) # Spring Bank Holiday (Last Monday in May) spring_bank = rrule.rrule(rrule.MONTHLY, bymonth=5, byweekday=(rrule.MO(-1)), cache=True, dtstart=datetime(2003, 1, 1, tzinfo=pytz.utc), until=end) non_trading_rules.append(spring_bank) # Summer Bank Holiday (Last Monday in August) summer_bank = rrule.rrule(rrule.MONTHLY, bymonth=8,
def get_nyse_holidays(year_start_, year_end_): '''Returns list of NYSE holidays between and included two specific years, source `https://gist.github.com/jckantor/d100a028027c5a6b8340` :param year_start_: integer representing the starting year :param year_end_: integer representing the ending year :return : list of datetime.date containing NYSE holidays ''' a = dt.date(year_start_, 1, 1) b = dt.date(year_end_, 12, 31) rs = rrule.rruleset() # New Years Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=12, bymonthday=31, byweekday=rrule.FR)) # New Years Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=1, bymonthday=1)) # New Years Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=1, bymonthday=2, byweekday=rrule.MO)) # Martin Luther King Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=1, byweekday=rrule.MO(3))) # Washington's Birthday rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=2, byweekday=rrule.MO(3))) # Good Friday rs.rrule(rrule.rrule(rrule.YEARLY, dtstart=a, until=b, byeaster=-2)) # Memorial Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=5, byweekday=rrule.MO(-1))) # Independence Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=7, bymonthday=3, byweekday=rrule.FR)) # Independence Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=7, bymonthday=4)) # Independence Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=7, bymonthday=5, byweekday=rrule.MO)) # Labor Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=9, byweekday=rrule.MO(1))) # Thanksgiving Day rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=11, byweekday=rrule.TH(4))) # Christmas rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=12, bymonthday=24, byweekday=rrule.FR)) # Christmas rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=12, bymonthday=25)) # Christmas rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=a, until=b, bymonth=12, bymonthday=26, byweekday=rrule.MO)) # Exclude potential holidays that fall on weekends rs.exrule( rrule.rrule(rrule.WEEKLY, dtstart=a, until=b, byweekday=(rrule.SA, rrule.SU))) return list(rs)