diff --git a/zipline/test_algorithms.py b/zipline/test_algorithms.py index e4d9b559..0d2a158b 100644 --- a/zipline/test_algorithms.py +++ b/zipline/test_algorithms.py @@ -274,8 +274,8 @@ def uses_ufunc(data, *args, **kwargs): @batch_transform -def price_multiple(data, multiplier, keyarg=1): - return data.price * multiplier * keyarg +def price_multiple(data, multiplier, extra_arg=1): + return data.price * multiplier * extra_arg class BatchTransformAlgorithm(TradingAlgorithm): @@ -383,24 +383,24 @@ class BatchTransformAlgorithm(TradingAlgorithm): # check that calling transforms with the same arguments # is idempotent - self.price_multiple.handle_data(data, 1, keyarg=1) + self.price_multiple.handle_data(data, 1, extra_arg=1) if self.price_multiple.full: pre = len(self.price_multiple.ticks) - result1 = self.price_multiple.handle_data(data, 1, keyarg=1) + result1 = self.price_multiple.handle_data(data, 1, extra_arg=1) post = len(self.price_multiple.ticks) assert pre == post, "batch transform is appending redundant events" - result2 = self.price_multiple.handle_data(data, 1, keyarg=1) + result2 = self.price_multiple.handle_data(data, 1, extra_arg=1) assert result1 is result2, "batch transform is not idempotent" # check that calling transform with the same data, but # different supplemental arguments results in new # results. - result3 = self.price_multiple.handle_data(data, 2, keyarg=1) + result3 = self.price_multiple.handle_data(data, 2, extra_arg=1) assert result1 is not result3, \ "batch transform is not updating for new args" - result4 = self.price_multiple.handle_data(data, 1, keyarg=2) + result4 = self.price_multiple.handle_data(data, 1, extra_arg=2) assert result1 is not result4,\ "batch transform is not updating for new kwargs" diff --git a/zipline/transforms/utils.py b/zipline/transforms/utils.py index cac1c119..7b47d9f7 100644 --- a/zipline/transforms/utils.py +++ b/zipline/transforms/utils.py @@ -520,14 +520,18 @@ class BatchTransform(EventWindow): if self.compute_only_full and not self.full: return None + recalculate_needed = False if self.updated: # Create new pandas panel self.window = self.get_data() # reset our counter for refresh_period self.trading_days_since_update = 0 + recalculate_needed = True + else: + recalculate_needed = \ + args != self.last_args or kwargs != self.last_kwargs - args_changed = args != self.last_args or kwargs != self.last_kwargs - if self.updated or args_changed: + if recalculate_needed: self.cached = self.compute_transform_value( self.window, *args,