mirror of
https://github.com/wassname/catalyst.git
synced 2026-07-08 17:50:34 +08:00
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:
+14
-14
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user