diff --git a/tests/history_cases.py b/tests/history_cases.py index 83d18ece..02570976 100644 --- a/tests/history_cases.py +++ b/tests/history_cases.py @@ -45,28 +45,28 @@ MIXED_FREQUENCY_MINUTES = TradingEnvironment.instance().market_minute_window( to_utc('2013-07-03 9:31AM'), 600, ) ONE_MINUTE_PRICE_ONLY_SPECS = [ - HistorySpec(1, '1m', 'price', True), + HistorySpec(1, '1m', 'price', True, data_frequency='minute'), ] DAILY_OPEN_CLOSE_SPECS = [ - HistorySpec(3, '1d', 'open_price', False), - HistorySpec(3, '1d', 'close_price', False), + HistorySpec(3, '1d', 'open_price', False, data_frequency='minute'), + HistorySpec(3, '1d', 'close_price', False, data_frequency='minute'), ] ILLIQUID_PRICES_SPECS = [ - HistorySpec(3, '1m', 'price', False), - HistorySpec(5, '1m', 'price', True), + HistorySpec(3, '1m', 'price', False, data_frequency='minute'), + HistorySpec(5, '1m', 'price', True, data_frequency='minute'), ] MIXED_FREQUENCY_SPECS = [ - HistorySpec(1, '1m', 'price', False), - HistorySpec(2, '1m', 'price', False), - HistorySpec(2, '1d', 'price', False), + HistorySpec(1, '1m', 'price', False, data_frequency='minute'), + HistorySpec(2, '1m', 'price', False, data_frequency='minute'), + HistorySpec(2, '1d', 'price', False, data_frequency='minute'), ] MIXED_FIELDS_SPECS = [ - HistorySpec(3, '1m', 'price', True), - HistorySpec(3, '1m', 'open_price', True), - HistorySpec(3, '1m', 'close_price', True), - HistorySpec(3, '1m', 'high', True), - HistorySpec(3, '1m', 'low', True), - HistorySpec(3, '1m', 'volume', True), + HistorySpec(3, '1m', 'price', True, data_frequency='minute'), + HistorySpec(3, '1m', 'open_price', True, data_frequency='minute'), + HistorySpec(3, '1m', 'close_price', True, data_frequency='minute'), + HistorySpec(3, '1m', 'high', True, data_frequency='minute'), + HistorySpec(3, '1m', 'low', True, data_frequency='minute'), + HistorySpec(3, '1m', 'volume', True, data_frequency='minute'), ] diff --git a/tests/test_history.py b/tests/test_history.py index 71f1b37a..129b11f6 100644 --- a/tests/test_history.py +++ b/tests/test_history.py @@ -130,7 +130,8 @@ def get_index_at_dt(case_input): case_input['frequency'], None, False, - daily_at_midnight=False + daily_at_midnight=False, + data_frequency='minute', ) return history.index_at_dt(history_spec, case_input['algo_dt']) @@ -393,6 +394,33 @@ def handle_data(context, data): expected = df.iloc[i:i + bar_count] assert_frame_equal(expected, received) + def test_history_daily_data_1m_window(self): + bar_count = 3 + algo_text = """ +from zipline.api import history, add_history +from copy import deepcopy + +def initialize(context): + add_history(bar_count=1, frequency='1m', field='price') + +def handle_data(context, data): + prices = history(bar_count={bar_count}, frequency='1d', field='price') + context.history_trace.append(deepcopy(prices)) +""".format(bar_count=bar_count).strip() + + start = pd.Timestamp('2006-03-20', tz='UTC') + end = pd.Timestamp('2006-03-30', tz='UTC') + + sim_params = factory.create_simulation_parameters( + start=start, end=end) + + with self.assertRaises(ValueError): + TradingAlgorithm( + script=algo_text, + data_frequency='daily', + sim_params=sim_params + ) + def test_basic_history(self): algo_text = """ from zipline.api import history, add_history diff --git a/zipline/algorithm.py b/zipline/algorithm.py index 244d7552..0e2e67f5 100644 --- a/zipline/algorithm.py +++ b/zipline/algorithm.py @@ -841,10 +841,12 @@ class TradingAlgorithm(object): @api_method def add_history(self, bar_count, frequency, field, ffill=True): - daily_at_midnight = (self.sim_params.data_frequency == 'daily') + data_frequency = self.sim_params.data_frequency + daily_at_midnight = (data_frequency == 'daily') history_spec = HistorySpec(bar_count, frequency, field, ffill, - daily_at_midnight=daily_at_midnight) + daily_at_midnight=daily_at_midnight, + data_frequency=data_frequency) self.history_specs[history_spec.key_str] = history_spec @api_method diff --git a/zipline/history/history.py b/zipline/history/history.py index d869e0f4..846a82d4 100644 --- a/zipline/history/history.py +++ b/zipline/history/history.py @@ -241,7 +241,11 @@ class HistorySpec(object): bar_count, freq_str, field, ffill) def __init__(self, bar_count, frequency, field, ffill, - daily_at_midnight=False): + daily_at_midnight=False, data_frequency='daily'): + + if frequency == '1m' and data_frequency == 'daily': + raise ValueError('Minute history requires minute frequency input data.\ +Either use daily history or provide minute frequency data.') # Number of bars to look back. self.bar_count = bar_count if isinstance(frequency, str):