From e940a56b0842f9b80690eee78b6483b31b0cb4b3 Mon Sep 17 00:00:00 2001 From: Scott Sanderson Date: Tue, 23 Feb 2016 00:41:58 -0500 Subject: [PATCH] MAINT: Don't recompute portfolio in BTS. --- zipline/finance/performance/position_tracker.py | 3 +++ zipline/gens/tradesimulation.py | 10 +++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/zipline/finance/performance/position_tracker.py b/zipline/finance/performance/position_tracker.py index 1697002f..3ef364cc 100644 --- a/zipline/finance/performance/position_tracker.py +++ b/zipline/finance/performance/position_tracker.py @@ -335,6 +335,9 @@ class PositionTracker(object): positions.append(pos.to_dict()) return positions + def get_nonempty_position_sids(self): + return [sid for sid, pos in iteritems(self.positions) if pos.amount] + def stats(self): amounts = [] last_sale_prices = [] diff --git a/zipline/gens/tradesimulation.py b/zipline/gens/tradesimulation.py index e6dc8c54..1f9e54d3 100644 --- a/zipline/gens/tradesimulation.py +++ b/zipline/gens/tradesimulation.py @@ -443,11 +443,15 @@ class AlgorithmSimulator(object): # Remove positions in any sids that have reached their auto_close date. to_clear = [] finder = algo.asset_finder - position_assets = finder.retrieve_all(list(algo.portfolio.positions)) - for asset in position_assets: + perf_tracker = algo.perf_tracker + nonempty_position_assets = finder.retrieve_all( + # get_nonempty_position_sids us just the non-empty positions, and + # also avoids an unnecessary re-compuation of the portfolio. + perf_tracker.position_tracker.get_nonempty_position_sids() + ) + for asset in nonempty_position_assets: if past_auto_close_date(asset): to_clear.append(asset) - perf_tracker = algo.perf_tracker for close_event in map(create_close_position_event, to_clear): perf_tracker.process_close_position(close_event)