Merge pull request #41 from quantopian/revert_fix_window

Revert fix window
This commit is contained in:
Eddie Hebert
2012-12-12 16:47:42 -08:00
2 changed files with 43 additions and 12 deletions
+6 -2
View File
@@ -123,7 +123,11 @@ class TestEventWindow(TestCase):
# Record the length of the window after each event.
lengths.append(len(window.ticks))
assert lengths == [1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
# The window stretches out during the weekend because we wait
# to drop events until the weekend ends. The last window is
# briefly longer because it doesn't complete a full day. The
# window then shrinks once the day completes
assert lengths == [1, 2, 3, 3, 3, 4, 5, 5, 5, 3, 4, 3]
assert window.added == events
assert window.removed == events[:-3]
@@ -142,7 +146,7 @@ class TestEventWindow(TestCase):
# Record the length of the window after each event.
lengths.append(len(window.ticks))
assert lengths == [1, 2, 2, 2, 2]
assert lengths == [1, 2, 3, 3, 2]
assert window.added == events
assert window.removed == events[:-2]
+37 -10
View File
@@ -239,9 +239,17 @@ class EventWindow(object):
# adding new ticks.
self.handle_add(event)
if self.market_aware:
self.add_new_holidays(event.dt)
# Clear out any expired events. drop_condition changes depending
# on whether or not we are running in market_aware mode.
while self.drop_condition():
#
# oldest newest
# | |
# V V
while self.drop_condition(self.ticks[0].dt, self.ticks[-1].dt):
# popleft removes and returns the oldest tick in self.ticks
popped = self.ticks.popleft()
@@ -249,17 +257,36 @@ class EventWindow(object):
# behavior for removing ticks.
self.handle_remove(popped)
def out_of_market_window(self):
# Find number of unique days in window
# Note that this assumes that each day we received an
# event is a trading day.
unique_dts = set([event.dt.date() for event in self.ticks])
def add_new_holidays(self, newest):
# Add to our tracked window any untracked holidays that are
# older than our newest event. (newest should always be
# self.ticks[-1])
while len(self.all_holidays) > 0 and self.all_holidays[0] <= newest:
self.cur_holidays.append(self.all_holidays.popleft())
return len(unique_dts) > self.window_length
def drop_old_holidays(self, oldest):
# Drop from our tracked window any holidays that are older
# than our oldest tracked event. (oldest should always
# be self.ticks[0])
while len(self.cur_holidays) > 0 and self.cur_holidays[0] < oldest:
self.cur_holidays.popleft()
def out_of_delta(self):
# newest - oldest
return (self.ticks[-1].dt - self.ticks[0].dt) >= self.delta
def out_of_market_window(self, oldest, newest):
self.drop_old_holidays(oldest)
calendar_dates_between = (newest.date() - oldest.date()).days
holidays_between = len(self.cur_holidays)
trading_days_between = calendar_dates_between - holidays_between
# "Put back" a day if oldest is earlier in its day than newest,
# reflecting the fact that we haven't yet completed the last
# day in the window.
if oldest.time() > newest.time():
trading_days_between -= 1
return trading_days_between >= self.window_length
def out_of_delta(self, oldest, newest):
return (newest - oldest) >= self.delta
# All event windows expect to receive events with datetime fields
# that arrive in sorted order.