BUG: Fix calculation of cumulative risk stats.

- Use current dt instead of market_close.
- Handle intraday close
- Remove zeroing out of sharpe etc.
This commit is contained in:
fawce
2013-05-07 16:32:35 -04:00
committed by Eddie Hebert
parent 32835b87f3
commit 2d850d0970
3 changed files with 22 additions and 23 deletions
+18 -13
View File
@@ -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,
+3 -10
View File
@@ -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)
+1
View File
@@ -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