From 1b98d23b912e9a68a20771d8f13c0d9a183aba42 Mon Sep 17 00:00:00 2001 From: jfkirk Date: Tue, 9 Jun 2015 16:11:52 -0400 Subject: [PATCH] PERF: Removes asset lookups on ever trade event --- .../finance/performance/position_tracker.py | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/zipline/finance/performance/position_tracker.py b/zipline/finance/performance/position_tracker.py index cc7581e6..fc2af4b7 100644 --- a/zipline/finance/performance/position_tracker.py +++ b/zipline/finance/performance/position_tracker.py @@ -36,6 +36,7 @@ class PositionTracker(object): self._position_last_sale_prices = OrderedDict() self._position_value_multipliers = OrderedDict() self._position_exposure_multipliers = OrderedDict() + self._position_payout_multipliers = OrderedDict() self._unpaid_dividends = pd.DataFrame( columns=zp.DIVIDEND_PAYMENT_FIELDS, ) @@ -57,16 +58,20 @@ class PositionTracker(object): try: self._position_value_multipliers[sid] self._position_exposure_multipliers[sid] + self._position_payout_multipliers[sid] except KeyError: # Collect the value multipliers from applicable sids asset = self._retrieve_asset(sid) if isinstance(asset, Equity): self._position_value_multipliers[sid] = 1 self._position_exposure_multipliers[sid] = 1 + self._position_payout_multipliers[sid] = 0 if isinstance(asset, Future): self._position_value_multipliers[sid] = 0 self._position_exposure_multipliers[sid] = \ asset.contract_multiplier + self._position_payout_multipliers[sid] = \ + asset.contract_multiplier def update_last_sale(self, event): # NOTE, PerformanceTracker already vetted as TRADE type @@ -86,17 +91,9 @@ class PositionTracker(object): self._position_last_sale_prices[sid] = price self._invalidate_cache() - asset = self._retrieve_asset(sid) - if asset is None: - return 0 - - # Calculate cash adjustment on futures - cash_adjustment = 0 - if isinstance(asset, Future): - price_change = price - old_price - cash_adjustment = \ - price_change * asset.contract_multiplier * pos.amount - return cash_adjustment + # Calculate cash adjustment on assets with multipliers + return (price - old_price) * self._position_payout_multipliers[sid] \ + * pos.amount def update_positions(self, positions): # update positions in batch @@ -381,6 +378,7 @@ class PositionTracker(object): self._position_last_sale_prices = OrderedDict() self._position_value_multipliers = OrderedDict() self._position_exposure_multipliers = OrderedDict() + self._position_payout_multipliers = OrderedDict() self._invalidate_cache() self.update_positions(state['positions'])