MAINT: Remove perf_periods member.

Refer to cumulative and todays performance explicitly instead of always
looping through.

The third value (minute) for which this was useful, has been removed.

Also, there are some actions where only cumulative may need application,
e.g. application of dividends. (However, this patch does not remove
dividend processing from todays performance, but opens up later patches
to make that distinction.)
This commit is contained in:
Eddie Hebert
2015-12-15 13:47:38 -05:00
parent 6106cb98a5
commit 06d4d7e74b
2 changed files with 20 additions and 27 deletions
+5 -1
View File
@@ -256,7 +256,11 @@ def check_perf_tracker_serialization(perf_tracker):
for k in scalar_keys:
nt.assert_equal(getattr(test, k), getattr(perf_tracker, k), k)
for period in test.perf_periods:
perf_periods = (
test.cumulative_performance,
test.todays_performance
)
for period in perf_periods:
nt.assert_true(hasattr(period, '_position_tracker'))
+15 -26
View File
@@ -111,8 +111,6 @@ class PerformanceTracker(object):
self.position_tracker = PositionTracker(asset_finder=env.asset_finder)
self.perf_periods = []
if self.emission_rate == 'daily':
self.all_benchmark_returns = pd.Series(
index=self.trading_days)
@@ -145,7 +143,6 @@ class PerformanceTracker(object):
asset_finder=self.env.asset_finder,
)
self.cumulative_performance.position_tracker = self.position_tracker
self.perf_periods.append(self.cumulative_performance)
# this performance period will span just the current market day
self.todays_performance = PerformancePeriod(
@@ -161,8 +158,6 @@ class PerformanceTracker(object):
)
self.todays_performance.position_tracker = self.position_tracker
self.perf_periods.append(self.todays_performance)
self.saved_dt = self.period_start
# one indexed so that we reach 100%
self.day_count = 0.0
@@ -239,8 +234,8 @@ class PerformanceTracker(object):
def update_performance(self):
# calculate performance as of last trade
for perf_period in self.perf_periods:
perf_period.calculate_performance()
self.cumulative_performance.calculate_performance()
self.todays_performance.calculate_performance()
def get_portfolio(self, performance_needs_update):
if performance_needs_update:
@@ -292,8 +287,8 @@ class PerformanceTracker(object):
# updates last sale, and pays out a cash adjustment if applicable
cash_adjustment = self.position_tracker.update_last_sale(event)
if cash_adjustment != 0:
for perf_period in self.perf_periods:
perf_period.handle_cash_payment(cash_adjustment)
self.cumulative_performance.handle_cash_payment(cash_adjustment)
self.todays_performance.handle_cash_payment(cash_adjustment)
def process_trade(self, event):
self._handle_event_price(event)
@@ -302,8 +297,8 @@ class PerformanceTracker(object):
self._handle_event_price(event)
self.txn_count += 1
self.position_tracker.execute_transaction(event)
for perf_period in self.perf_periods:
perf_period.handle_execution(event)
self.cumulative_performance.handle_execution(event)
self.todays_performance.handle_execution(event)
def process_dividend(self, dividend):
@@ -312,18 +307,18 @@ class PerformanceTracker(object):
def process_split(self, event):
leftover_cash = self.position_tracker.handle_split(event)
if leftover_cash > 0:
for perf_period in self.perf_periods:
perf_period.handle_cash_payment(leftover_cash)
self.cumulative_performance.handle_cash_payment(leftover_cash)
self.todays_performance.handle_cash_payment(leftover_cash)
def process_order(self, event):
for perf_period in self.perf_periods:
perf_period.record_order(event)
self.cumulative_performance.record_order(event)
self.todays_performance.record_order(event)
def process_commission(self, event):
self.position_tracker.handle_commission(event)
for perf_period in self.perf_periods:
perf_period.handle_commission(event)
self.cumulative_performance.handle_commission(event)
self.todays_performance.handle_commission(event)
def process_benchmark(self, event):
if self.sim_params.data_frequency == 'minute' and \
@@ -394,9 +389,8 @@ class PerformanceTracker(object):
net_cash_payment = position_tracker.pay_dividends(dividends_payable)
for period in self.perf_periods:
# notify periods to update their stats
period.handle_dividends_paid(net_cash_payment)
self.cumulative_performance.handle_dividends_paid(net_cash_payment)
self.todays_performance.handle_dividends_paid(net_cash_payment)
def check_asset_auto_closes(self, next_trading_day):
"""
@@ -553,9 +547,6 @@ class PerformanceTracker(object):
state_dict['_dividend_count'] = self._dividend_count
# we already store perf periods as attributes
del state_dict['perf_periods']
STATE_VERSION = 4
state_dict[VERSION_LABEL] = STATE_VERSION
@@ -575,12 +566,10 @@ class PerformanceTracker(object):
self.dividend_frame = pickle.loads(state['dividend_frame'])
# properly setup the perf periods
self.perf_periods = []
p_types = ['cumulative', 'todays', 'minute']
p_types = ['cumulative', 'todays']
for p_type in p_types:
name = p_type + '_performance'
period = getattr(self, name, None)
if period is None:
continue
period._position_tracker = self.position_tracker
self.perf_periods.append(period)