From 7eae960b218368376a2dc76f662e26d188072d33 Mon Sep 17 00:00:00 2001 From: Eddie Hebert Date: Thu, 17 Dec 2015 14:42:10 -0500 Subject: [PATCH] MAINT: Make commission methods coarse. In preparation for removal of widespread events, change the commission methods to use params for sid and cost, instead of an event, for compatibility with lazy branch. co-author: @jbredeche --- zipline/finance/performance/period.py | 4 ++-- zipline/finance/performance/position.py | 8 ++++---- zipline/finance/performance/position_tracker.py | 7 +++---- zipline/finance/performance/tracker.py | 10 ++++++---- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/zipline/finance/performance/period.py b/zipline/finance/performance/period.py index c292b191..67dec7a7 100644 --- a/zipline/finance/performance/period.py +++ b/zipline/finance/performance/period.py @@ -198,9 +198,9 @@ class PerformancePeriod(object): def handle_cash_payment(self, payment_amount): self.adjust_cash(payment_amount) - def handle_commission(self, commission): + def handle_commission(self, cost): # Deduct from our total cash pool. - self.adjust_cash(-commission.cost) + self.adjust_cash(-cost) def adjust_cash(self, amount): self.period_cash_flow += amount diff --git a/zipline/finance/performance/position.py b/zipline/finance/performance/position.py index 9a28ba86..2daf0039 100644 --- a/zipline/finance/performance/position.py +++ b/zipline/finance/performance/position.py @@ -165,7 +165,7 @@ class Position(object): self.amount = total_shares - def adjust_commission_cost_basis(self, commission): + def adjust_commission_cost_basis(self, sid, cost): """ A note about cost-basis in zipline: all positions are considered to share a cost basis, even if they were executed in different @@ -176,9 +176,9 @@ class Position(object): all shares in a position. """ - if commission.sid != self.sid: + if sid != self.sid: raise Exception('Updating a commission for a different sid?') - if commission.cost == 0.0: + if cost == 0.0: return # If we no longer hold this position, there is no cost basis to @@ -187,7 +187,7 @@ class Position(object): return prev_cost = self.cost_basis * self.amount - new_cost = prev_cost + commission.cost + new_cost = prev_cost + cost self.cost_basis = new_cost / self.amount def __repr__(self): diff --git a/zipline/finance/performance/position_tracker.py b/zipline/finance/performance/position_tracker.py index 8c5c3037..6ef069ad 100644 --- a/zipline/finance/performance/position_tracker.py +++ b/zipline/finance/performance/position_tracker.py @@ -317,11 +317,10 @@ class PositionTracker(object): position.update(txn) self._update_asset(sid) - def handle_commission(self, commission): + def handle_commission(self, sid, cost): # Adjust the cost basis of the stock if we own it - if commission.sid in self.positions: - self.positions[commission.sid].\ - adjust_commission_cost_basis(commission) + if sid in self.positions: + self.positions[sid].adjust_commission_cost_basis(sid, cost) def handle_split(self, split): if split.sid in self.positions: diff --git a/zipline/finance/performance/tracker.py b/zipline/finance/performance/tracker.py index 558b46cc..a6cf6bf0 100644 --- a/zipline/finance/performance/tracker.py +++ b/zipline/finance/performance/tracker.py @@ -314,11 +314,13 @@ class PerformanceTracker(object): self.cumulative_performance.record_order(event) self.todays_performance.record_order(event) - def process_commission(self, event): + def process_commission(self, commission): + sid = commission.sid + cost = commission.cost - self.position_tracker.handle_commission(event) - self.cumulative_performance.handle_commission(event) - self.todays_performance.handle_commission(event) + self.position_tracker.handle_commission(sid, cost) + self.cumulative_performance.handle_commission(cost) + self.todays_performance.handle_commission(cost) def process_benchmark(self, event): if self.sim_params.data_frequency == 'minute' and \