BUG: ensure perf stats are generated for all days

When running with minutely emissions the simulator would report to the
user that it simulated 'n - 1' days (where n is the number of days
specified in the simulation params).  Now the correct number of trading
days are reported as being simulated.
This commit is contained in:
Jamie Kirkpatrick
2014-01-02 13:30:31 +00:00
committed by twiecki
parent 45844bac31
commit 147242339d
4 changed files with 36 additions and 2 deletions
+28
View File
@@ -0,0 +1,28 @@
#
# Copyright 2014 Quantopian, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from unittest import TestCase
from zipline.test_algorithms import NoopAlgorithm
from zipline.utils import factory
class TestTradeSimulation(TestCase):
def test_minutely_emissions_generate_performance_stats_for_last_day(self):
params = factory.create_simulation_parameters(num_days=1)
params.emission_rate = 'minute'
algo = NoopAlgorithm()
algo.run(source=[], sim_params=params)
self.assertEqual(algo.perf_tracker.day_count, 1.0)
+4 -1
View File
@@ -59,6 +59,7 @@ DEFAULT_CAPITAL_BASE = float("1.0e5")
class TradingAlgorithm(object):
"""
Base class for trading algorithms. Inherit and overload
initialize() and handle_data(data).
@@ -83,6 +84,7 @@ class TradingAlgorithm(object):
stats = my_algo.run(data)
"""
def __init__(self, *args, **kwargs):
"""Initialize sids and other state variables.
@@ -228,7 +230,8 @@ class TradingAlgorithm(object):
"""
if self.benchmark_return_source is None:
env = trading.environment
if self.data_frequency == 'minute':
if (self.data_frequency == 'minute'
or sim_params.emission_rate == 'minute'):
update_time = lambda date: env.get_open_and_close(date)[1]
else:
update_time = lambda date: date
+1 -1
View File
@@ -188,7 +188,7 @@ class AlgorithmSimulator(object):
yield daily_rollup
tp = self.algo.perf_tracker.todays_performance
tp.rollover()
if mkt_close < self.algo.perf_tracker.last_close:
if mkt_close <= self.algo.perf_tracker.last_close:
_, mkt_close = \
trading.environment.next_open_and_close(
mkt_close
+3
View File
@@ -134,6 +134,9 @@ class NoopAlgorithm(TradingAlgorithm):
def set_transact_setter(self, txn_sim_callable):
pass
def handle_data(self, data):
pass
class ExceptionAlgorithm(TradingAlgorithm):
"""