Skip to content

Commit

Permalink
Merge pull request #1390 from quantopian/revert-can-trade-behavior-fo…
Browse files Browse the repository at this point in the history
…r-now

BUG: Temporarily commenting out new can_trade functionality until we sort out downstream dependencies.
  • Loading branch information
jbredeche committed Aug 15, 2016
2 parents 0ebffba + 9a2ad26 commit a011634
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 76 deletions.
152 changes: 79 additions & 73 deletions tests/test_bar_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -462,79 +462,85 @@ def test_spot_price_at_midnight(self):
bd.current(self.HILARIOUSLY_ILLIQUID_ASSET, "volume")
)

def test_can_trade_during_non_market_hours(self):
# make sure that if we use `can_trade` at midnight, we don't pretend
# we're in the previous day's last minute
the_day_after = self.trading_calendar.next_session_label(
self.equity_minute_bar_days[-1]
)

bar_data = BarData(self.data_portal, lambda: the_day_after, "minute")

for asset in [self.ASSET1, self.HILARIOUSLY_ILLIQUID_ASSET]:
self.assertFalse(bar_data.can_trade(asset))

with handle_non_market_minutes(bar_data):
self.assertFalse(bar_data.can_trade(asset))

# NYSE is closed at midnight, so even if the asset is alive, can_trade
# should return False
bar_data2 = BarData(
self.data_portal,
lambda: self.equity_minute_bar_days[1],
"minute",
)
for asset in [self.ASSET1, self.HILARIOUSLY_ILLIQUID_ASSET]:
self.assertFalse(bar_data2.can_trade(asset))

with handle_non_market_minutes(bar_data2):
self.assertFalse(bar_data2.can_trade(asset))

def test_can_trade_exchange_closed(self):
nyse_asset = self.asset_finder.retrieve_asset(1)
ice_asset = self.asset_finder.retrieve_asset(6)

# minutes we're going to check (to verify that that the same bardata
# can check multiple exchange calendars, all times Eastern):
# 2016-01-05:
# 20:00 (minute before ICE opens)
# 20:01 (first minute of ICE session)
# 20:02 (second minute of ICE session)
# 00:00 (Cinderella's ride becomes a pumpkin)
# 2016-01-06:
# 9:30 (minute before NYSE opens)
# 9:31 (first minute of NYSE session)
# 9:32 (second minute of NYSE session)
# 15:59 (second-to-last minute of NYSE session)
# 16:00 (last minute of NYSE session)
# 16:01 (minute after NYSE closed)
# 17:59 (second-to-last minute of ICE session)
# 18:00 (last minute of ICE session)
# 18:01 (minute after ICE closed)

# each row is dt, whether-nyse-is-open, whether-ice-is-open
minutes_to_check = [
(pd.Timestamp("2016-01-05 20:00", tz="US/Eastern"), False, False),
(pd.Timestamp("2016-01-05 20:01", tz="US/Eastern"), False, True),
(pd.Timestamp("2016-01-05 20:02", tz="US/Eastern"), False, True),
(pd.Timestamp("2016-01-06 00:00", tz="US/Eastern"), False, True),
(pd.Timestamp("2016-01-06 9:30", tz="US/Eastern"), False, True),
(pd.Timestamp("2016-01-06 9:31", tz="US/Eastern"), True, True),
(pd.Timestamp("2016-01-06 9:32", tz="US/Eastern"), True, True),
(pd.Timestamp("2016-01-06 15:59", tz="US/Eastern"), True, True),
(pd.Timestamp("2016-01-06 16:00", tz="US/Eastern"), True, True),
(pd.Timestamp("2016-01-06 16:01", tz="US/Eastern"), False, True),
(pd.Timestamp("2016-01-06 17:59", tz="US/Eastern"), False, True),
(pd.Timestamp("2016-01-06 18:00", tz="US/Eastern"), False, True),
(pd.Timestamp("2016-01-06 18:01", tz="US/Eastern"), False, False),
]

for info in minutes_to_check:
bar_data = BarData(self.data_portal, lambda: info[0], "minute")
series = bar_data.can_trade([nyse_asset, ice_asset])

self.assertEqual(info[1], series.loc[nyse_asset])
self.assertEqual(info[2], series.loc[ice_asset])
# FIXME temporarily commenting out until we restore the new can_trade
# functionality that checks exchange status
# def test_can_trade_during_non_market_hours(self):
# # make sure that if we use `can_trade` at midnight, we don't pretend
# # we're in the previous day's last minute
# the_day_after = self.trading_calendar.next_session_label(
# self.equity_minute_bar_days[-1]
# )
#
# bar_data = BarData(self.data_portal, lambda: the_day_after, "minute")
#
# for asset in [self.ASSET1, self.HILARIOUSLY_ILLIQUID_ASSET]:
# self.assertFalse(bar_data.can_trade(asset))
#
# with handle_non_market_minutes(bar_data):
# self.assertFalse(bar_data.can_trade(asset))
#
# # NYSE is closed at midnight, so even if the asset is alive,
# # can_trade should return False
# bar_data2 = BarData(
# self.data_portal,
# lambda: self.equity_minute_bar_days[1],
# "minute",
# )
# for asset in [self.ASSET1, self.HILARIOUSLY_ILLIQUID_ASSET]:
# self.assertFalse(bar_data2.can_trade(asset))
#
# with handle_non_market_minutes(bar_data2):
# self.assertFalse(bar_data2.can_trade(asset))

# FIXME temporarily commenting out until we restore the new can_trade
# functionality that checks exchange status
# def test_can_trade_exchange_closed(self):
# nyse_asset = self.asset_finder.retrieve_asset(1)
# ice_asset = self.asset_finder.retrieve_asset(6)
#
# # minutes we're going to check (to verify that that the same bardata
# # can check multiple exchange calendars, all times Eastern):
# # 2016-01-05:
# # 20:00 (minute before ICE opens)
# # 20:01 (first minute of ICE session)
# # 20:02 (second minute of ICE session)
# # 00:00 (Cinderella's ride becomes a pumpkin)
# # 2016-01-06:
# # 9:30 (minute before NYSE opens)
# # 9:31 (first minute of NYSE session)
# # 9:32 (second minute of NYSE session)
# # 15:59 (second-to-last minute of NYSE session)
# # 16:00 (last minute of NYSE session)
# # 16:01 (minute after NYSE closed)
# # 17:59 (second-to-last minute of ICE session)
# # 18:00 (last minute of ICE session)
# # 18:01 (minute after ICE closed)
#
# # each row is dt, whether-nyse-is-open, whether-ice-is-open
# minutes_to_check = [
# (pd.Timestamp("2016-01-05 20:00", tz="US/Eastern"), False,
# False),
# (pd.Timestamp("2016-01-05 20:01", tz="US/Eastern"), False, True),
# (pd.Timestamp("2016-01-05 20:02", tz="US/Eastern"), False, True),
# (pd.Timestamp("2016-01-06 00:00", tz="US/Eastern"), False, True),
# (pd.Timestamp("2016-01-06 9:30", tz="US/Eastern"), False, True),
# (pd.Timestamp("2016-01-06 9:31", tz="US/Eastern"), True, True),
# (pd.Timestamp("2016-01-06 9:32", tz="US/Eastern"), True, True),
# (pd.Timestamp("2016-01-06 15:59", tz="US/Eastern"), True, True),
# (pd.Timestamp("2016-01-06 16:00", tz="US/Eastern"), True, True),
# (pd.Timestamp("2016-01-06 16:01", tz="US/Eastern"), False, True),
# (pd.Timestamp("2016-01-06 17:59", tz="US/Eastern"), False, True),
# (pd.Timestamp("2016-01-06 18:00", tz="US/Eastern"), False, True),
# (pd.Timestamp("2016-01-06 18:01", tz="US/Eastern"), False,
# False),
# ]
#
# for info in minutes_to_check:
# bar_data = BarData(self.data_portal, lambda: info[0], "minute")
# series = bar_data.can_trade([nyse_asset, ice_asset])
#
# self.assertEqual(info[1], series.loc[nyse_asset])
# self.assertEqual(info[2], series.loc[ice_asset])

def test_is_stale_during_non_market_hours(self):
bar_data = BarData(
Expand Down
8 changes: 5 additions & 3 deletions zipline/_protocol.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -467,9 +467,11 @@ cdef class BarData:
# asset isn't alive
return False

if not asset.is_exchange_open(dt):
# exchange isn't open
return False
# FIXME temporarily commenting out while we sort out some downstream
# dependencies
# if not asset.is_exchange_open(dt):
# # exchange isn't open
# return False

if isinstance(asset, Future):
# FIXME: this will get removed once we can get prices for futures
Expand Down

0 comments on commit a011634

Please sign in to comment.