Create trading holiday calendar with Pandas
Perhaps it is more straightforward to create the trade calendar from scratch, like so:
import datetime as dtfrom pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, nearest_workday, \ USMartinLutherKingJr, USPresidentsDay, GoodFriday, USMemorialDay, \ USLaborDay, USThanksgivingDayclass USTradingCalendar(AbstractHolidayCalendar): rules = [ Holiday('NewYearsDay', month=1, day=1, observance=nearest_workday), USMartinLutherKingJr, USPresidentsDay, GoodFriday, USMemorialDay, Holiday('USIndependenceDay', month=7, day=4, observance=nearest_workday), USLaborDay, USThanksgivingDay, Holiday('Christmas', month=12, day=25, observance=nearest_workday) ]def get_trading_close_holidays(year): inst = USTradingCalendar() return inst.holidays(dt.datetime(year-1, 12, 31), dt.datetime(year, 12, 31))if __name__ == '__main__': print(get_trading_close_holidays(2016)) # DatetimeIndex(['2016-01-01', '2016-01-18', '2016-02-15', '2016-03-25', # '2016-05-30', '2016-07-04', '2016-09-05', '2016-11-24', # '2016-12-26'], # dtype='datetime64[ns]', freq=None)
If it helps, I had a similar need for exchange trading calendars. There was some excellent code buried in the Zipline project by Quantopian. I extracted out the relevant part and created a new project for creating market exchange trading calendars in pandas. The links are here, with some of the functionality described below.
https://github.com/rsheftel/pandas_market_calendars
https://pypi.python.org/pypi/pandas-market-calendars
Here is what it can do by creating a pandas DatetimeIndex of all of the valid open hours for the NYSE:
import pandas_market_calendars as mcalnyse = mcal.get_calendar('NYSE')early = nyse.schedule(start_date='2012-07-01', end_date='2012-07-10')early market_open market_close=========== ========================= =========================2012-07-02 2012-07-02 13:30:00+00:00 2012-07-02 20:00:00+00:002012-07-03 2012-07-03 13:30:00+00:00 2012-07-03 17:00:00+00:002012-07-05 2012-07-05 13:30:00+00:00 2012-07-05 20:00:00+00:002012-07-06 2012-07-06 13:30:00+00:00 2012-07-06 20:00:00+00:002012-07-09 2012-07-09 13:30:00+00:00 2012-07-09 20:00:00+00:002012-07-10 2012-07-10 13:30:00+00:00 2012-07-10 20:00:00+00:00mcal.date_range(early, frequency='1D')DatetimeIndex(['2012-07-02 20:00:00+00:00', '2012-07-03 17:00:00+00:00', '2012-07-05 20:00:00+00:00', '2012-07-06 20:00:00+00:00', '2012-07-09 20:00:00+00:00', '2012-07-10 20:00:00+00:00'], dtype='datetime64[ns, UTC]', freq=None)mcal.date_range(early, frequency='1H')DatetimeIndex(['2012-07-02 14:30:00+00:00', '2012-07-02 15:30:00+00:00', '2012-07-02 16:30:00+00:00', '2012-07-02 17:30:00+00:00', '2012-07-02 18:30:00+00:00', '2012-07-02 19:30:00+00:00', '2012-07-02 20:00:00+00:00', '2012-07-03 14:30:00+00:00', '2012-07-03 15:30:00+00:00', '2012-07-03 16:30:00+00:00', '2012-07-03 17:00:00+00:00', '2012-07-05 14:30:00+00:00', '2012-07-05 15:30:00+00:00', '2012-07-05 16:30:00+00:00', '2012-07-05 17:30:00+00:00', '2012-07-05 18:30:00+00:00', '2012-07-05 19:30:00+00:00', '2012-07-05 20:00:00+00:00', '2012-07-06 14:30:00+00:00', '2012-07-06 15:30:00+00:00', '2012-07-06 16:30:00+00:00', '2012-07-06 17:30:00+00:00', '2012-07-06 18:30:00+00:00', '2012-07-06 19:30:00+00:00', '2012-07-06 20:00:00+00:00', '2012-07-09 14:30:00+00:00', '2012-07-09 15:30:00+00:00', '2012-07-09 16:30:00+00:00', '2012-07-09 17:30:00+00:00', '2012-07-09 18:30:00+00:00', '2012-07-09 19:30:00+00:00', '2012-07-09 20:00:00+00:00', '2012-07-10 14:30:00+00:00', '2012-07-10 15:30:00+00:00', '2012-07-10 16:30:00+00:00', '2012-07-10 17:30:00+00:00', '2012-07-10 18:30:00+00:00', '2012-07-10 19:30:00+00:00', '2012-07-10 20:00:00+00:00'], dtype='datetime64[ns, UTC]', freq=None)
If you just want to get the pandas Holiday Calendar that can be used in other pandas functions that take that as an argument:
holidays = nyse.holidays()holidays.holidays[-5:](numpy.datetime64('2030-05-27'), numpy.datetime64('2030-07-04'), numpy.datetime64('2030-09-02'), numpy.datetime64('2030-11-28'), numpy.datetime64('2030-12-25'))
You have to create new instance of class: cal1 = tradingCal()
. This works for me.
from pandas.tseries.holiday import get_calendar, HolidayCalendarFactory, GoodFridayfrom datetime import datetimecal = get_calendar('USFederalHolidayCalendar') # Create calendar instancecal.rules.pop(7) # Remove Veteran's Day rulecal.rules.pop(6) # Remove Columbus Day ruletradingCal = HolidayCalendarFactory('TradingCalendar', cal, GoodFriday)print tradingCal.rules#new instance of classcal1 = tradingCal()print cal1.holidays(datetime(2014, 12, 31), datetime(2016, 12, 31))#DatetimeIndex(['2015-01-01', '2015-01-19', '2015-02-16', '2015-04-03',# '2015-05-25', '2015-07-03', '2015-09-07', '2015-11-26',# '2015-12-25', '2016-01-01', '2016-01-18', '2016-02-15',# '2016-03-25', '2016-05-30', '2016-07-04', '2016-09-05',# '2016-11-24', '2016-12-26'],# dtype='datetime64[ns]', freq=None, tz=None)