mirror of
https://github.com/wassname/catalyst.git
synced 2026-07-02 12:12:36 +08:00
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:
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user