From d5697cdf0a15aaf798422595bddcf5a6588d23a0 Mon Sep 17 00:00:00 2001 From: Eddie Hebert Date: Thu, 15 Nov 2012 13:18:46 -0500 Subject: [PATCH] Fixes under-incrementation of risk report. We were only incrementing the risk report by one day, and never checking to see if that day we incremented into was a trading day or not. We now increment by day until we are on a trading day. With an assist from @twiecki on: Adapted test_risk_compare_batch_iterative to work with fixed iterative risk class. --- tests/test_perf_tracking.py | 4 ++++ tests/test_risk_compare_batch_iterative.py | 13 ++++++++----- zipline/finance/performance.py | 2 +- zipline/finance/risk.py | 8 ++++++-- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/tests/test_perf_tracking.py b/tests/test_perf_tracking.py index 3d2cb7c8..5e1a1858 100644 --- a/tests/test_perf_tracking.py +++ b/tests/test_perf_tracking.py @@ -591,3 +591,7 @@ shares in position" cumulative_pos = perf_tracker.cumulative_performance.positions[sid] expected_size = txn_count / 2 * -25 self.assertEqual(cumulative_pos.amount, expected_size) + + self.assertEqual(perf_tracker.period_end. + replace(hour=0, minute=0, second=0), + perf_tracker.cumulative_risk_metrics.end_date) diff --git a/tests/test_risk_compare_batch_iterative.py b/tests/test_risk_compare_batch_iterative.py index ed25761a..a64ac59f 100644 --- a/tests/test_risk_compare_batch_iterative.py +++ b/tests/test_risk_compare_batch_iterative.py @@ -71,10 +71,15 @@ class RiskCompareIterativeToBatch(unittest.TestCase): cur_returns.append(todays_return_obj) + # Move forward day counter to next trading day + todays_date += self.oneday + while not self.trading_env.is_trading_day(todays_date): + todays_date += self.oneday + try: risk_metrics_original = risk.RiskMetricsBatch( start_date=self.start_date, - end_date=todays_date + self.oneday, + end_date=todays_date, returns=cur_returns, trading_environment=self.trading_env ) @@ -82,12 +87,10 @@ class RiskCompareIterativeToBatch(unittest.TestCase): #assert that when original raises exception, same #exception is raised by risk_metrics_refactor np.testing.assert_raises( - type(e), risk_metrics_refactor.update, ret, self.oneday) + type(e), risk_metrics_refactor.update, ret) continue - risk_metrics_refactor.update(ret, self.oneday) - - todays_date += self.oneday + risk_metrics_refactor.update(ret) self.assertEqual( risk_metrics_original.start_date, diff --git a/zipline/finance/performance.py b/zipline/finance/performance.py index d244b3eb..a65f4dd6 100644 --- a/zipline/finance/performance.py +++ b/zipline/finance/performance.py @@ -277,7 +277,7 @@ class PerformanceTracker(object): #update risk metrics for cumulative performance self.cumulative_risk_metrics.update( - self.todays_performance.returns, datetime.timedelta(days=1)) + self.todays_performance.returns) # increment the day counter before we move markers forward. self.day_count += 1.0 diff --git a/zipline/finance/risk.py b/zipline/finance/risk.py index 29893018..9260b9f3 100644 --- a/zipline/finance/risk.py +++ b/zipline/finance/risk.py @@ -386,7 +386,7 @@ class RiskMetricsIterative(RiskMetricsBase): if x.date >= self.start_date ] - def update(self, returns_in_period, dt): + def update(self, returns_in_period): if self.trading_environment.is_trading_day(self.end_date): self.algorithm_returns.append(returns_in_period) self.benchmark_returns.append( @@ -394,7 +394,11 @@ class RiskMetricsIterative(RiskMetricsBase): self.trading_days += 1 self.update_compounded_log_returns() - self.end_date += dt + self.end_date += datetime.timedelta(hours=24) + + while not self.trading_environment.is_trading_day(self.end_date): + self.end_date += datetime.timedelta(hours=24) + self.end_date = self.end_date.replace(hour=0, minute=0, second=0) self.algorithm_period_returns.append(