python - example - Crear calendario comercial de vacaciones con pandas
time series dataframe python (3)
Si ayuda, tuve una necesidad similar de intercambiar calendarios comerciales. Había un código excelente enterrado en el proyecto Zipline por Quantopian. Extraje la parte relevante y creé un nuevo proyecto para crear calendarios de intercambio de mercado en pandas. Los enlaces están aquí, con algunas de las funciones que se describen a continuación.
https://github.com/rsheftel/pandas_market_calendars
https://pypi.python.org/pypi/pandas-market-calendars
Esto es lo que puede hacer al crear un índice de fecha y hora de pandas de todas las horas abiertas válidas para el NYSE:
import pandas_market_calendars as mcal
nyse = 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:00
2012-07-03 2012-07-03 13:30:00+00:00 2012-07-03 17:00:00+00:00
2012-07-05 2012-07-05 13:30:00+00:00 2012-07-05 20:00:00+00:00
2012-07-06 2012-07-06 13:30:00+00:00 2012-07-06 20:00:00+00:00
2012-07-09 2012-07-09 13:30:00+00:00 2012-07-09 20:00:00+00:00
2012-07-10 2012-07-10 13:30:00+00:00 2012-07-10 20:00:00+00:00
mcal.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)
Si solo desea obtener el calendario de vacaciones de pandas que se puede usar en otras funciones de pandas que lo toman como un argumento:
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''))
Estoy tratando de crear un calendario comercial usando Pandas. Puedo crear una instancia de cal basada en el USFederalHolidayCalendar. El USFederalHolidayCalendar no es consistente con el calendario de Trading, ya que el calendario de Trading no incluye el Día de Colón y el Día de los Veteranos. Sin embargo, el calendario de operaciones incluye el Viernes Santo (no incluido en el calendario de vacaciones de Estados Unidos). Todo excepto la última línea en el siguiente código funciona:
from pandas.tseries.holiday import get_calendar, HolidayCalendarFactory, GoodFriday
from datetime import datetime
cal = get_calendar(''USFederalHolidayCalendar'') # Create calendar instance
cal.rules.pop(7) # Remove Veteran''s Day rule
cal.rules.pop(6) # Remove Columbus Day rule
tradingCal = HolidayCalendarFactory(''TradingCalendar'', cal, GoodFriday)
La instancia de tradingCal parece funcionar porque puedo ver las reglas de vacaciones.
In[10]: tradingCal.rules
Out[10]:
[Holiday: Labor Day (month=9, day=1, offset=<DateOffset: kwds={''weekday'': MO(+1)}>),
Holiday: Presidents Day (month=2, day=1, offset=<DateOffset: kwds={''weekday'': MO(+3)}>),
Holiday: Good Friday (month=1, day=1, offset=[<Easter>, <-2 * Days>]),
Holiday: Dr. Martin Luther King Jr. (month=1, day=1, offset=<DateOffset: kwds={''weekday'': MO(+3)}>),
Holiday: New Years Day (month=1, day=1, observance=<function nearest_workday at 0x000000000A190BA8>),
Holiday: Thanksgiving (month=11, day=1, offset=<DateOffset: kwds={''weekday'': TH(+4)}>),
Holiday: July 4th (month=7, day=4, observance=<function nearest_workday at 0x000000000A190BA8>),
Holiday: Christmas (month=12, day=25, observance=<function nearest_workday at 0x000000000A190BA8>),
Holiday: MemorialDay (month=5, day=31, offset=<DateOffset: kwds={''weekday'': MO(-1)}>)]
Cuando intento listar los días festivos en un rango de fechas, aparece el siguiente error:
In[11]: tradingCal.holidays(datetime(2014, 12, 31), datetime(2016, 12, 31))
Traceback (most recent call last):
File "C:/Python27/lib/site-packages/IPython/core/interactiveshell.py", line 3035, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-12-2708cd2db7a0>", line 1, in <module>
tradingCal.holidays(datetime(2014, 12, 31), datetime(2016, 12, 31))
TypeError: unbound method holidays() must be called with TradingCalendar instance as first argument (got datetime instance instead)
¿Algunas ideas?
Tal vez sea más sencillo crear el calendario comercial desde cero, así:
import datetime as dt
from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, nearest_workday, /
USMartinLutherKingJr, USPresidentsDay, GoodFriday, USMemorialDay, /
USLaborDay, USThanksgivingDay
class 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)
Tienes que crear una nueva instancia de la clase: cal1 = tradingCal()
. Esto funciona para mí.
from pandas.tseries.holiday import get_calendar, HolidayCalendarFactory, GoodFriday
from datetime import datetime
cal = get_calendar(''USFederalHolidayCalendar'') # Create calendar instance
cal.rules.pop(7) # Remove Veteran''s Day rule
cal.rules.pop(6) # Remove Columbus Day rule
tradingCal = HolidayCalendarFactory(''TradingCalendar'', cal, GoodFriday)
print tradingCal.rules
#new instance of class
cal1 = 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)