diff --git a/tests/test_perf_tracking.py b/tests/test_perf_tracking.py index 86996971..6757df57 100644 --- a/tests/test_perf_tracking.py +++ b/tests/test_perf_tracking.py @@ -298,7 +298,7 @@ class TestDividendPerformance(unittest.TestCase): [0, -1000, -1000, -1000, -1000] ) - def test_short_position_receives_no_dividend(self): + def test_short_position_pays_dividend(self): #post some trades in the market events = factory.create_trade_history( 1, @@ -337,14 +337,14 @@ class TestDividendPerformance(unittest.TestCase): self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] - self.assertEqual(cumulative_returns, [0.0, 0.0, 0.0, 0.0, 0.0]) + self.assertEqual(cumulative_returns, [0.0, 0.0, -0.1, -0.1, -0.1]) daily_returns = [event['daily_perf']['returns'] for event in results] - self.assertEqual(daily_returns, [0.0, 0.0, 0.0, 0.0, 0.0]) + self.assertEqual(daily_returns, [0.0, 0.0, -0.1, 0.0, 0.0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] - self.assertEqual(cash_flows, [0, 1000, 0, 0, 0]) + self.assertEqual(cash_flows, [0, 1000, -1000, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] - self.assertEqual(cumulative_cash_flows, [0, 1000, 1000, 1000, 1000]) + self.assertEqual(cumulative_cash_flows, [0, 1000, 0, 0, 0]) def test_no_position_receives_no_dividend(self): #post some trades in the market diff --git a/zipline/finance/performance.py b/zipline/finance/performance.py index d5e3a8cf..fe523121 100644 --- a/zipline/finance/performance.py +++ b/zipline/finance/performance.py @@ -265,8 +265,6 @@ class PerformanceTracker(object): del event['TRANSACTION'] elif event.type == zp.DATASOURCE_TYPE.DIVIDEND: - # TODO: confirm with @ehebert that positions objects - # are shared. (and that it is ok). self.cumulative_performance.add_dividend(event) self.todays_performance.add_dividend(event) @@ -371,8 +369,6 @@ class Position(object): self.dividends = [] def update_dividends(self, dt): - # TODO: should I have asserts for the dt to be at - # midnight? payment = 0.0 unpaid_dividends = [] for dividend in self.dividends: @@ -518,16 +514,18 @@ class PerformancePeriod(object): for sid, pos in self.positions.iteritems(): cash_payments += pos.update_dividends(todays_date) - if cash_payments > 0.0: - # credit our cash balance with the dividend payments - self.period_cash_flow += cash_payments - # debit our cumulative cash spent with the dividend - # payments - self.cumulative_capital_used -= cash_payments + # credit our cash balance with the dividend payments, or + # if we are short, debit our cash balance with the + # payments. + self.period_cash_flow += cash_payments + # debit our cumulative cash spent with the dividend + # payments, or credit our cumulative cash spent if we are + # short the stock. + self.cumulative_capital_used -= cash_payments - # recalculate performance, including the dividend - # paymtents - self.calculate_performance() + # recalculate performance, including the dividend + # paymtents + self.calculate_performance() def calculate_performance(self): self.ending_value = self.calculate_positions_value()