From 28df9ec4232cdd692b67100f61441ffe5c98b127 Mon Sep 17 00:00:00 2001 From: fawce Date: Tue, 30 Apr 2013 16:45:19 -0400 Subject: [PATCH] MAINT: Refactor performance tracker as part of algorithm. Instead of having the performance tracker as part of the tradesimulation class, hold on to it inside of the algorithm object, so that the perf_tracker is more easily accessed for reset behavior, etc. --- zipline/algorithm.py | 3 ++- zipline/gens/tradesimulation.py | 41 +++++++++++++++------------------ 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/zipline/algorithm.py b/zipline/algorithm.py index 9f8b325f..bdd20ef4 100644 --- a/zipline/algorithm.py +++ b/zipline/algorithm.py @@ -29,6 +29,7 @@ from zipline.errors import ( UnsupportedCommissionModel, OverrideCommissionPostInit ) +from zipline.finance.performance import PerformanceTracker from zipline.sources import DataFrameSource, DataPanelSource from zipline.utils.factory import create_simulation_parameters from zipline.transforms.utils import StatefulTransform @@ -171,7 +172,7 @@ class TradingAlgorithm(object): skipped. """ self.data_gen = self._create_data_generator(source_filter, sim_params) - + self.perf_tracker = PerformanceTracker(sim_params) self.trading_client = AlgorithmSimulator(self, sim_params) transact_method = transact_partial(self.slippage, self.commission) diff --git a/zipline/gens/tradesimulation.py b/zipline/gens/tradesimulation.py index 8859b1b7..3bad1dcd 100644 --- a/zipline/gens/tradesimulation.py +++ b/zipline/gens/tradesimulation.py @@ -17,7 +17,6 @@ from itertools import chain from logbook import Logger, Processor from zipline.protocol import BarData, DATASOURCE_TYPE -from zipline.finance.performance import PerformanceTracker from zipline.gens.utils import hash_args log = Logger('Trade Simulation') @@ -45,15 +44,6 @@ class AlgorithmSimulator(object): # ============== self.sim_params = sim_params - # ============== - # Perf Tracker - # Setup - # ============== - self.perf_tracker = PerformanceTracker(self.sim_params) - - self.perf_key = self.EMISSION_TO_PERF_KEY_MAP[ - self.perf_tracker.emission_rate] - # ============== # Algo Setup # ============== @@ -63,6 +53,9 @@ class AlgorithmSimulator(object): second=0, microsecond=0) + self.perf_key = self.EMISSION_TO_PERF_KEY_MAP[ + self.algo.perf_tracker.emission_rate] + # ============== # Snapshot Setup # ============== @@ -108,7 +101,7 @@ class AlgorithmSimulator(object): updated = False bm_updated = False for date, snapshot in stream: - self.perf_tracker.set_date(date) + self.algo.perf_tracker.set_date(date) self.algo.blotter.set_date(date) # If we're still in the warmup period. Use the event to # update our universe, but don't yield any perf messages, @@ -118,7 +111,7 @@ class AlgorithmSimulator(object): if event.type in (DATASOURCE_TYPE.TRADE, DATASOURCE_TYPE.CUSTOM): self.update_universe(event) - self.perf_tracker.process_event(event) + self.algo.perf_tracker.process_event(event) else: @@ -131,10 +124,12 @@ class AlgorithmSimulator(object): bm_updated = True txns, orders = self.algo.blotter.process_trade(event) for data in chain([event], txns, orders): - self.perf_tracker.process_event(data) + self.algo.perf_tracker.process_event(data) # Update our portfolio. - self.algo.set_portfolio(self.perf_tracker.get_portfolio()) + self.algo.set_portfolio( + self.algo.perf_tracker.get_portfolio() + ) # Send the current state of the universe # to the user's algo. @@ -147,7 +142,7 @@ class AlgorithmSimulator(object): # the perf packet, so that the perf includes # placed orders for order in self.algo.blotter.new_orders: - self.perf_tracker.process_event(order) + self.algo.perf_tracker.process_event(order) self.algo.blotter.new_orders = [] # The benchmark is our internal clock. When it @@ -156,12 +151,12 @@ class AlgorithmSimulator(object): bm_updated = False yield self.get_message(date) - risk_message = self.perf_tracker.handle_simulation_end() + risk_message = self.algo.perf_tracker.handle_simulation_end() # When emitting minutely, it is still useful to have a final # packet with the entire days performance rolled up. - if self.perf_tracker.emission_rate == 'minute': - daily_rollup = self.perf_tracker.to_dict( + if self.algo.perf_tracker.emission_rate == 'minute': + daily_rollup = self.algo.perf_tracker.to_dict( emission_type='daily' ) daily_rollup['daily_perf']['recorded_vars'] = \ @@ -172,15 +167,15 @@ class AlgorithmSimulator(object): def get_message(self, date): rvars = self.algo.recorded_vars - if self.perf_tracker.emission_rate == 'daily': + if self.algo.perf_tracker.emission_rate == 'daily': perf_message = \ - self.perf_tracker.handle_market_close() + self.algo.perf_tracker.handle_market_close() perf_message['daily_perf']['recorded_vars'] = rvars return perf_message - elif self.perf_tracker.emission_rate == 'minute': - self.perf_tracker.handle_minute_close(date) - perf_message = self.perf_tracker.to_dict() + elif self.algo.perf_tracker.emission_rate == 'minute': + self.algo.perf_tracker.handle_minute_close(date) + perf_message = self.algo.perf_tracker.to_dict() perf_message['intraday_perf']['recorded_vars'] = rvars return perf_message