diff --git a/zipline/finance/performance.py b/zipline/finance/performance.py index 6a08ddc2..492200f0 100644 --- a/zipline/finance/performance.py +++ b/zipline/finance/performance.py @@ -322,9 +322,7 @@ class PerformanceTracker(object): perf_period.calculate_performance() def handle_minute_close(self, dt): - - todays_date = self.market_close.replace(hour=0, minute=0, second=0, - microsecond=0) + todays_date = dt.replace(hour=0, minute=0, second=0, microsecond=0) minute_returns = self.minute_performance.returns self.minute_performance.rollover() @@ -335,22 +333,20 @@ class PerformanceTracker(object): self.intraday_risk_metrics.update(dt, algo_minute_returns, bench_minute_returns) - # the intraday risk metrics compound the minutely returns of the - # benchmark. - bench_since_open = self.intraday_risk_metrics.benchmark_returns[-1] - benchmark_returns = pd.Series({dt: bench_since_open}) + + bench_since_open = \ + self.intraday_risk_metrics.benchmark_period_returns[-1] + + benchmark_returns = pd.Series({todays_date: bench_since_open}) # if we've reached market close, check on dividends if dt == self.market_close: for perf_period in self.perf_periods: perf_period.update_dividends(todays_date) - algorithm_returns = pd.Series({dt: self.todays_performance.returns}) - - self.intraday_risk_metrics.update(dt, - algorithm_returns, - benchmark_returns) - + algorithm_returns = pd.Series({ + todays_date: self.todays_performance.returns + }) self.cumulative_risk_metrics.update(todays_date, algorithm_returns, benchmark_returns) @@ -364,6 +360,15 @@ class PerformanceTracker(object): ) self.returns.append(todays_return_obj) + def handle_intraday_close(self): + self.intraday_risk_metrics = \ + risk.RiskMetricsIterative(self.sim_params) + # increment the day counter before we move markers forward. + self.day_count += 1.0 + # move the market day markers forward + self.market_open, self.market_close = \ + trading.environment.next_open_and_close(self.market_open) + def handle_market_close(self): # add the return results from today to the list of DailyReturn objects. todays_date = self.market_close.replace(hour=0, minute=0, second=0, diff --git a/zipline/finance/risk.py b/zipline/finance/risk.py index d4a23a39..e5f99a00 100644 --- a/zipline/finance/risk.py +++ b/zipline/finance/risk.py @@ -693,16 +693,9 @@ algorithm_returns ({algo_count}) in range {start} : {end} on {dt}" 'period_label': period_label } - if self.sim_params.emission_rate == 'daily': - # Some risk metrics only make sense in a context of daily - # risk calculations. - rval['sharpe'] = self.sharpe[-1] - rval['sortino'] = self.sortino[-1] - rval['information'] = self.information[-1] - elif self.sim_params.emission_rate == 'minute': - rval['sharpe'] = 0.0 - rval['sortino'] = 0.0 - rval['information'] = 0.0 + rval['sharpe'] = self.sharpe[-1] + rval['sortino'] = self.sortino[-1] + rval['information'] = self.information[-1] return {k: None if check_entry(k, v) diff --git a/zipline/gens/tradesimulation.py b/zipline/gens/tradesimulation.py index 136cdd9c..8d4e0ecf 100644 --- a/zipline/gens/tradesimulation.py +++ b/zipline/gens/tradesimulation.py @@ -170,6 +170,7 @@ class AlgorithmSimulator(object): tp.rollover() if mkt_close < self.algo.perf_tracker.last_close: mkt_close = self.get_next_close(mkt_close) + self.algo.perf_tracker.handle_intraday_close() risk_message = self.algo.perf_tracker.handle_simulation_end() yield risk_message