diff --git a/zipline/finance/performance.py b/zipline/finance/performance.py index f62d4f0d..81a3d8d9 100644 --- a/zipline/finance/performance.py +++ b/zipline/finance/performance.py @@ -81,6 +81,9 @@ Position Tracking | last_sale_date | datetime of the last trade of the position's | | | security on the exchange | +-----------------+----------------------------------------------------+ + | transactions | all the transactions that were acrued into this | + | | position. | + +-----------------+----------------------------------------------------+ | timestamp | System time event occurs in zipilne | +-----------------+----------------------------------------------------+ @@ -389,7 +392,7 @@ class Position(): 'cost_basis' : self.cost_basis, 'last_sale_price' : self.last_sale_price, 'last_sale_date' : self.last_sale_date, - 'timestamp' : datetime.datetime.now(), + 'timestamp' : datetime.datetime.now() } @@ -405,6 +408,7 @@ class PerformancePeriod(): #cash balance at start of period self.starting_cash = starting_cash self.ending_cash = starting_cash + self.processed_transactions = [] self.calculate_performance() @@ -426,6 +430,7 @@ class PerformancePeriod(): self.positions[txn.sid] = Position(txn.sid) self.positions[txn.sid].update(txn) self.period_capital_used += -1 * txn.price * txn.amount + self.processed_transactions.append(txn) def calculate_positions_value(self): mktValue = 0.0 @@ -456,7 +461,8 @@ class PerformancePeriod(): 'positions' : positions, 'timestamp' : datetime.datetime.now(), 'pnl' : self.pnl, - 'returns' : self.returns + 'returns' : self.returns, + 'transactions' : self.processed_transactions, } def to_namedict(self): diff --git a/zipline/protocol.py b/zipline/protocol.py index f8db09bc..17501c05 100644 --- a/zipline/protocol.py +++ b/zipline/protocol.py @@ -631,6 +631,28 @@ def PERF_FRAME(perf): tp = perf['todays_perf'] cp = perf['cumulative_perf'] risk = perf['cumulative_risk_metrics'] + + # aggregate the day's transactions, which are nested in their + # respsective positions. + transactions = [] + for txn in tp['transactions']: + cur = { + 'date':EPOCH(txn.dt), + 'amount': txn.amount, + 'price': txn.price, + 'sid':txn.sid + } + transactions.append(cur) + + positions = [] + for sid, pos in tp['positions'].iteritems(): + cur = { + 'cost_basis':pos['cost_basis'], + 'sid' :pos['sid'], + 'last_sale' :pos['last_sale_price'], + 'amount' :pos['amount'] + } + positions.append(cur) daily_perf = { 'date' : EPOCH(date), @@ -640,7 +662,9 @@ def PERF_FRAME(perf): 'portfolio_value' : tp['portfolio_value'], 'starting_cash' : tp['starting_cash'], 'ending_cash' : tp['ending_cash'], - 'capital_used' : tp['capital_used'] + 'capital_used' : tp['capital_used'], + 'transactions' : transactions, + 'positions' : positions } cumulative_perf = { diff --git a/zipline/protocol_utils.py b/zipline/protocol_utils.py index ba805b3b..4581d732 100644 --- a/zipline/protocol_utils.py +++ b/zipline/protocol_utils.py @@ -60,7 +60,7 @@ class namedict(object): def __getitem__(self, key): return self.__dict__[key] - + def keys(self): return self.__dict__.keys()