Skip to content

Commit

Permalink
Merge a5693d0 into fb0981e
Browse files Browse the repository at this point in the history
  • Loading branch information
jbredeche committed Sep 14, 2016
2 parents fb0981e + a5693d0 commit f461bc3
Show file tree
Hide file tree
Showing 6 changed files with 185 additions and 204 deletions.
25 changes: 25 additions & 0 deletions tests/data/test_resample.py
Expand Up @@ -518,6 +518,19 @@ class TestResampleSessionBars(WithBcolzFutureMinuteBarReader,
END_DATE = pd.Timestamp('2016-03-17', tz='UTC')
NUM_SESSIONS = 2

@classmethod
def make_futures_info(cls):
future_dict = {}

for future_sid in cls.ASSET_FINDER_FUTURE_SIDS:
future_dict[future_sid] = {
'multiplier': 1000,
'exchange': 'CME',
'root_symbol': "ABC"
}

return pd.DataFrame.from_dict(future_dict, orient='index')

@classmethod
def make_future_minute_bar_data(cls):
for sid in cls.ASSET_FINDER_FUTURE_SIDS:
Expand Down Expand Up @@ -582,6 +595,18 @@ def test_first_trading_day(self):
self.assertEqual(self.START_DATE,
self.session_bar_reader.first_trading_day)

def test_get_last_traded_dt(self):
future = self.asset_finder.retrieve_asset(
self.ASSET_FINDER_FUTURE_SIDS[0]
)

self.assertEqual(
self.trading_calendar.open_and_close_for_session(
self.trading_calendar.previous_session_label(self.END_DATE)
)[1],
self.session_bar_reader.get_last_traded_dt(future, self.END_DATE)
)


class TestReindexMinuteBars(WithBcolzEquityMinuteBarReader,
ZiplineTestCase):
Expand Down
132 changes: 132 additions & 0 deletions zipline/data/bar_reader.py
@@ -0,0 +1,132 @@
# Copyright 2016 Quantopian, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from abc import ABCMeta, abstractmethod, abstractproperty
from six import with_metaclass


class NoDataOnDate(Exception):
"""
Raised when a spot price can be found for the sid and date.
"""
pass


class NoDataBeforeDate(Exception):
pass


class NoDataAfterDate(Exception):
pass


class BarReader(with_metaclass(ABCMeta, object)):
@abstractproperty
def data_frequency(self):
pass

@abstractmethod
def load_raw_arrays(self, columns, start_date, end_date, assets):
"""
Parameters
----------
fields : list of str
'open', 'high', 'low', 'close', or 'volume'
start_dt: Timestamp
Beginning of the window range.
end_dt: Timestamp
End of the window range.
sids : list of int
The asset identifiers in the window.
Returns
-------
list of np.ndarray
A list with an entry per field of ndarrays with shape
(minutes in range, sids) with a dtype of float64, containing the
values for the respective field over start and end dt range.
"""
pass

@abstractproperty
def last_available_dt(self):
"""
Returns
-------
dt : pd.Timestamp
The last session for which the reader can provide data.
"""
pass

@abstractproperty
def trading_calendar(self):
"""
Returns the zipline.utils.calendar.trading_calendar used to read
the data. Can be None (if the writer didn't specify it).
"""
pass

@abstractproperty
def first_trading_day(self):
"""
Returns
-------
dt : pd.Timestamp
The first trading day (session) for which the reader can provide
data.
"""
pass

@abstractmethod
def get_value(self, sid, dt, field):
"""
Retrieve the value at the given coordinates.
Parameters
----------
sid : int
The asset identifier.
dt : pd.Timestamp
The timestamp for the desired data point.
field : string
The OHLVC name for the desired data point.
Returns
-------
value : float|int
The value at the given coordinates, ``float`` for OHLC, ``int``
for 'volume'.
"""
pass

@abstractmethod
def get_last_traded_dt(self, asset, dt):
"""
Get the latest minute on or before ``dt`` in which ``asset`` traded.
If there are no trades on or before ``dt``, returns ``pd.NaT``.
Parameters
----------
asset : zipline.asset.Asset
The asset for which to get the last traded minute.
dt : pd.Timestamp
The minute at which to start searching for the last traded minute.
Returns
-------
last_traded : pd.Timestamp
The dt of the last trade for the given asset, using the input
dt as a vantage point.
"""
pass
104 changes: 4 additions & 100 deletions zipline/data/minute_bars.py
Expand Up @@ -11,7 +11,6 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from abc import ABCMeta, abstractmethod, abstractproperty
import json
import os
from os.path import join
Expand All @@ -23,7 +22,6 @@
from intervaltree import IntervalTree
import numpy as np
import pandas as pd
from six import with_metaclass
from toolz import keymap, valmap

from zipline.data._minute_bar_internal import (
Expand All @@ -33,6 +31,8 @@
)

from zipline.gens.sim_engine import NANOS_IN_MINUTE

from zipline.data.bar_reader import BarReader
from zipline.utils.calendars import get_calendar
from zipline.utils.cli import maybe_show_progress
from zipline.utils.memoize import lazyval
Expand All @@ -53,106 +53,10 @@ class BcolzMinuteWriterColumnMismatch(Exception):
pass


class MinuteBarReader(with_metaclass(ABCMeta)):

_data_frequency = 'minute'

class MinuteBarReader(BarReader):
@property
def data_frequency(self):
return self._data_frequency

@abstractproperty
def last_available_dt(self):
"""
Returns
-------
dt : pd.Timestamp
The last minute for which the reader can provide data.
"""
pass

@abstractproperty
def first_trading_day(self):
"""
Returns
-------
dt : pd.Timestamp
The first trading day (session) for which the reader can provide
data.
"""
pass

@abstractmethod
def get_value(self, sid, dt, field):
"""
Retrieve the value at the given coordinates.
Parameters
----------
sid : int
The asset identifier.
dt : pd.Timestamp
The minute label for the desired data point.
field : string
The OHLVC name for the desired data point.
Returns
-------
value : float|int
The value at the given coordinates, ``float`` for OHLC, ``int``
for 'volume'.
"""
pass

@abstractmethod
def get_last_traded_dt(self, asset, dt):
"""
Get the latest minute on or before ``dt`` in which ``asset`` traded.
If there are no trades on or before ``dt`` returns ``pd.NaT``
Parameters
----------
asset : zipline.asset.Asset
The asset for which to get the last traded minute.
dt : pd.Timestamp
The minute at which to start searching for the last traded minute.
Returns
-------
last_traded : pd.Timestamp
The minute of the last trade for the given asset, using the input
dt as a vantage point.
"""
pass

@abstractmethod
def load_raw_arrays(self, fields, start_dt, end_dt, sids):
"""
Retrieve the arrays of pricing data for the given coordinates of
``fields`` (OHLCV), minute range [``start_dt``, ``end_dt``] and sids.
Parameters
----------
fields : iterable of str
The OHLCV fields ('open', 'high', 'low', 'close', 'volume') for
which to read data.
start_dt : pd.Timestamp
The first minute of the date range for which to read data.
end_dt : pd.Timestamp
The last minute of the date range for which to read data.
sids : iterable of int
The sid identifiers for which to retrieve data.
Returns
-------
raw_arrays : list of ndarray
A list where each item corresponds with the fields in the order
the fields are given.
Each item is a 2D array with a shape of (minutes_in_range, sids)
The OHLC arrays are floats; the 'volume' array is ints.
"""
pass
return "minute"


def _calc_minute_index(market_opens, minutes_per_day):
Expand Down
3 changes: 3 additions & 0 deletions zipline/data/resample.py
Expand Up @@ -525,6 +525,9 @@ def last_available_dt(self):
def first_trading_day(self):
return self._minute_bar_reader.first_trading_day

def get_last_traded_dt(self, asset, dt):
return self._minute_bar_reader.get_last_traded_dt(asset, dt)


class ReindexBarReader(with_metaclass(ABCMeta)):
"""
Expand Down

0 comments on commit f461bc3

Please sign in to comment.