From 48be898a13a5a08ff982222b19fffb3f307204ef Mon Sep 17 00:00:00 2001 From: Eddie Hebert Date: Mon, 11 Nov 2013 15:47:00 -0500 Subject: [PATCH] ENH: Add open and closes to trading calendar. Use the early closes to populate a DataFrame which includes the open and close minute for each day. To be used by the environment instead of calculating each value mid-backtest. --- zipline/utils/tradingcalendar.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/zipline/utils/tradingcalendar.py b/zipline/utils/tradingcalendar.py index 0fc54a00..27bbfba8 100644 --- a/zipline/utils/tradingcalendar.py +++ b/zipline/utils/tradingcalendar.py @@ -365,3 +365,35 @@ def get_early_closes(start, end): early_closes.sort() return pd.DatetimeIndex(early_closes) + +early_closes = get_early_closes(start, end) + + +def get_open_and_closes(trading_days, early_closes, tz='US/Eastern'): + open_and_closes = pd.DataFrame(index=trading_days, + columns=('open_minute', 'close_minute')) + for day in trading_days: + open_minute = pd.Timestamp( + datetime( + year=day.year, + month=day.month, + day=day.day, + hour=9, + minute=31), + tz='US/Eastern').tz_convert('UTC') + # 1 PM if early close, 4 PM otherwise + close_hour = 13 if day in early_closes else 16 + close_minute = pd.Timestamp( + datetime( + year=day.year, + month=day.month, + day=day.day, + hour=close_hour), + tz='US/Eastern').tz_convert('UTC') + + open_and_closes.ix[day]['open_minute'] = open_minute + open_and_closes.ix[day]['close_minute'] = close_minute + + return open_and_closes + +open_and_closes = get_open_and_closes(trading_days, early_closes)