def testMonthlyComplexByWeekday(self): self.failUnlessParseMatches( "FREQ=MONTHLY;BYDAY=WE,4TH,FR", True, { 'freq': rrule.MONTHLY, 'interval': 1, 'byweekday': (rrule.TH(4), rrule.WE, rrule.FR) }, {})
def thanksgiving(start=date.today(), end=date.today() + timedelta(days=365)): ''' Example for one date. ''' rs = rrule.rruleset() rs.rrule( rrule.rrule(rrule.YEARLY, dtstart=start, until=end, bymonth=11, byweekday=rrule.TH(4))) return rs
def _thanksgiving(self, dtstart=None, until=None, count=None): """Thanksgiving is the last thursday of every november""" kwargs = { "freq": rrule.YEARLY, "bymonth": 11, "byweekday": rrule.TH(4), "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 ]
def create_sample_data(): # Create the studio's event types ets = dict( ((abbr, swingtime.EventType.objects.create(abbr=abbr, label=label)) for abbr, label in ( ('prv', 'Private Lesson'), ('bgn', 'Beginner Class'), ('adv', 'Advanced Class'), ('bbc', 'Black Belt Class'), ('spr', 'Sparring'), ('open', 'Open Dojo'), ('spc', 'Special Event'), ))) print(__doc__) print('Created event types: %s' % (', '.join(['%s' % et for et in swingtime.EventType.objects.all()]), )) now = datetime.now() # create a single occurrence event evt = swingtime.create_event( 'Grand Opening', ets['spc'], description='Open house', start_time=datetime.combine(now.date(), time(16)), end_time=datetime.combine(now.date(), time(18)), note='Free tea, sushi, and sake') print('Created event "%s" with %d occurrences' % (evt, evt.occurrence_set.count())) # create an event with multiple occurrences by fixed count evt = swingtime.create_event( 'Beginner Class', ets['bgn'], description='Open to all white and yellow belts', start_time=datetime.combine(now.date(), time(19)), count=30, byweekday=(rrule.MO, rrule.WE, rrule.FR)) print('Created event "%s" with %d occurrences' % (evt, evt.occurrence_set.count())) # create an event with multiple occurrences by ending date (until) evt = swingtime.create_event( 'Advance Class', ets['adv'], description='Open to all green and brown belts', start_time=datetime.combine(now.date(), time(18)), until=now + timedelta(days=+70), byweekday=(rrule.MO, rrule.WE, rrule.FR)) print('Created event "%s" with %d occurrences' % (evt, evt.occurrence_set.count())) # create an event with multiple occurrences by fixed count on monthly basis evt = swingtime.create_event( 'Black Belt Class', ets['bbc'], description='Open to all black belts', start_time=datetime.combine(now.date(), time(18, 30)), end_time=datetime.combine(now.date(), time(20, 30)), count=6, freq=rrule.MONTHLY, byweekday=(rrule.TH(+1), rrule.TH(+3))) print('Created event "%s" with %d occurrences' % (evt, evt.occurrence_set.count())) # create an event with multiple occurrences and alternate intervale evt = swingtime.create_event( 'Open Dojo', ets['open'], description='Open to all students', start_time=datetime.combine(now.date(), time(12)), end_time=datetime.combine(now.date(), time(16)), interval=2, count=6, byweekday=(rrule.SU)) print('Created event "%s" with %d occurrences\n' % (evt, evt.occurrence_set.count()))
''' from datetime import datetime, timedelta weekdays = [ 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday' ] def get_previous_byday(dayname, start_date=None): if not start_date: start_date = datetime.now() day_num = start_date.weekday() day_num_target = weekdays.index(dayname) days_ago = (7 + day_num - day_num_target) % 7 if days_ago == 0: days_ago = 7 target_date = start_date - timedelta(days=days_ago) return target_date if __name__ == "__main__": print(get_previous_byday("Thursday")) from dateutil.relativedelta import relativedelta from dateutil import rrule d = datetime.now() print(d + relativedelta(weekday=rrule.TH)) print(d + relativedelta(weekday=rrule.TH(-1)))
def testMonthlyByWeekday(self): self.failUnlessParseMatches("FREQ=MONTHLY;BYDAY=4TH", True, { 'freq': rrule.MONTHLY, 'interval': 1, 'byweekday': (rrule.TH(4), ) }, {})
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 analyze(model, logFunc): months = list(calendar.month_abbr) startMonth = months.index(model.startMonth) startDate = datetime.datetime(int(model.startYear), startMonth, 1) endMonth = months.index(model.endMonth) firstWeekday, days = calendar.monthrange(int(model.endYear), endMonth) endDate = datetime.datetime(int(model.endYear), endMonth, days) if endDate < startDate: raise AnalyzeException("End date must > start date") if endDate.year == startDate.year and endDate.month - startDate.month < 2: raise AnalyzeException( "Start and end date should be atleast 2 months apart") startDateStr = startDate.strftime("%Y-%m-%d") endDateStr = endDate.strftime("%Y-%m-%d") conn = sqlite3.connect(model.dbFile) cursor = conn.cursor() columns = [('INSTRUMENT', 'text'), ('SYMBOL', 'text'), ('EXPIRY_DT', 'text'), ('STRIKE_PR', 'real'), ('OPTION_TYP', 'text'), ('OPEN', 'real'), ('HIGH', 'real'), ('LOW', 'real'), ('CLOSE', 'real'), ('SETTLE_PR', 'real'), ('CONTRACTS', 'real'), ('VAL_INLAKH', 'real'), ('OPEN_INT', 'real'), ('CHG_IN_OI', 'real'), ('TIMESTAMP', 'text')] column_names = [c for c, t in columns] column_str = ",".join(column_names) sql = "select %s from %s where TIMESTAMP >= ? and TIMESTAMP <= ? order by TIMESTAMP" % ( column_str, model.tableName) count = 0 logFunc("Analyzing...%s - %s" % (startDateStr, endDateStr)) expiryDates = list( rrule.rrule(rrule.MONTHLY, byweekday=rrule.TH(-1), dtstart=startDate).between(startDate, endDate, inc=True)) expiryDatesTagMap = {} for expiryDate in expiryDates: expiryDatesTagMap[expiryDate.strftime("%Y-%m-%d")] = expiryDate monthsData = [] # keep each month's data, month is from expiry to expiry lastDateTag = None strategy_data = {} for i, strategy in enumerate(model.get_strategy_list()): strategy_data[i] = [] for row in cursor.execute(sql, [startDateStr, endDateStr]): count += 1 data = dict(zip(column_names, row)) curDateTag = data['TIMESTAMP'] if curDateTag not in expiryDatesTagMap and lastDateTag in expiryDatesTagMap: # expirty date passed analyze_month_data(monthsData, model, strategy_data, lastDateTag, logFunc) monthsData = [] monthsData.append(data) lastDateTag = curDateTag logFunc("read %s rows" % count) # strategy_data is map of index and data, just get data out in sequence strategy_data = strategy_data.items() strategy_data.sort() strategy_data = [item[1] for item in strategy_data] return strategy_data
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
cache=True, dtstart=start, until=end) non_trading_rules.append(july_4th) 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(-1)), 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) non_trading_ruleset = rrule.rruleset()
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
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_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)