MAINT: Add assertion for incompatible history freq specification. Supplying 1m frequency to history but only providing daily source data resulted in an odd non-descript exception. This adds a specific check and raises a more informative exception.

This commit is contained in:
Thomas Wiecki
2014-09-17 15:04:37 +02:00
parent 7eb1d719ed
commit 011f072fe2
4 changed files with 52 additions and 18 deletions
+14 -14
View File
@@ -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'),
]
+29 -1
View File
@@ -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
+4 -2
View File
@@ -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
+5 -1
View File
@@ -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):