From 1643bd1db65e0b97170db75f6d7c71739369014c Mon Sep 17 00:00:00 2001 From: Andrew Liang Date: Tue, 21 Jun 2016 12:26:40 -0400 Subject: [PATCH] BUG: get_first_trading_day_of_month needs to return normalized dt --- tests/utils/test_events.py | 18 ++++++++++++------ zipline/utils/events.py | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/tests/utils/test_events.py b/tests/utils/test_events.py index efa3d074..f9efbcf7 100644 --- a/tests/utils/test_events.py +++ b/tests/utils/test_events.py @@ -277,10 +277,15 @@ class TestStatelessRules(RuleTestCase): cls.nyse_cal = get_calendar('NYSE') + # First day of 09/2014 is closed whereas that for 10/2014 is open cls.sept_days = cls.nyse_cal.trading_days_in_range( pd.Timestamp('2014-09-01'), pd.Timestamp('2014-09-30'), ) + cls.oct_days = cls.nyse_cal.trading_days_in_range( + pd.Timestamp('2014-10-01'), + pd.Timestamp('2014-10-31'), + ) cls.sept_week = cls.nyse_cal.trading_minutes_for_days_in_range( datetime.date(year=2014, month=9, day=21), @@ -490,12 +495,13 @@ class TestStatelessRules(RuleTestCase): rule = NthTradingDayOfMonth(n) rule.cal = cal should_trigger = rule.should_trigger - for n_tdays, d in enumerate(self.sept_days): - for m in self.nyse_cal.trading_minutes_for_day(d): - if should_trigger(m): - self.assertEqual(n_tdays, n) - else: - self.assertNotEqual(n_tdays, n) + for days_list in (self.sept_days, self.oct_days): + for n_tdays, d in enumerate(days_list): + for m in self.nyse_cal.trading_minutes_for_day(d): + if should_trigger(m): + self.assertEqual(n_tdays, n) + else: + self.assertNotEqual(n_tdays, n) @subtest(param_range(MAX_MONTH_RANGE), 'n') def test_NDaysBeforeLastTradingDayOfMonth(self, n): diff --git a/zipline/utils/events.py b/zipline/utils/events.py index 1a7bb068..df043c4c 100644 --- a/zipline/utils/events.py +++ b/zipline/utils/events.py @@ -539,7 +539,7 @@ class NthTradingDayOfMonth(TradingDayOfMonthRule): self.month = dt.month dt = dt.replace(day=1) - first_day = (dt if self.cal.is_open_on_day(dt) + first_day = (normalize_date(dt) if self.cal.is_open_on_day(dt) else self.cal.next_trading_day(dt)) return first_day