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)
         }, {})
Exemple #2
0
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
Exemple #3
0
 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)))
Exemple #5
0
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
    ]
Exemple #6
0
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()))
Exemple #7
0
'''
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
Exemple #11
0
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
Exemple #12
0
                       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
Exemple #14
0
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)
Exemple #16
0
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)