diff --git a/zipline/finance/performance.py b/zipline/finance/performance.py index 90b84cbc..05af596f 100644 --- a/zipline/finance/performance.py +++ b/zipline/finance/performance.py @@ -144,8 +144,9 @@ class PerformanceTracker(): self.market_open = self.period_start self.market_close = self.market_open + self.trading_day self.progress = 0.0 - self.total_days = (self.period_end - self.period_start).days - self.day_count = 0 + self.total_days = self.trading_environment.days_in_period + # one indexed so that we reach 100% + self.day_count = 0.0 self.cumulative_capital_used = 0.0 self.max_capital_used = 0.0 self.capital_base = self.trading_environment.capital_base diff --git a/zipline/finance/trading.py b/zipline/finance/trading.py index 200a50d5..e39bde7d 100644 --- a/zipline/finance/trading.py +++ b/zipline/finance/trading.py @@ -366,6 +366,7 @@ class TradingEnvironment(object): self.period_start = period_start self.period_end = period_end self.capital_base = capital_base + self.period_trading_days = None for bm in benchmark_returns: self.trading_days.append(bm.date) @@ -378,6 +379,24 @@ class TradingEnvironment(object): day=test_date.day, tzinfo=pytz.utc ) + + @property + def days_in_period(self): + """return the number of trading days within the period [start, end)""" + assert(self.period_start != None) + assert(self.period_end != None) + + if self.period_trading_days == None: + self.period_trading_days = [] + for date in self.trading_days: + if date > self.period_end: + break + if date >= self.period_start: + self.period_trading_days.append(date) + + return len(self.period_trading_days) + + def is_trading_day(self, test_date): dt = self.normalize_date(test_date) diff --git a/zipline/protocol.py b/zipline/protocol.py index f8cd1435..d373ca9e 100644 --- a/zipline/protocol.py +++ b/zipline/protocol.py @@ -676,8 +676,10 @@ def PERF_UNFRAME(msg): # ----------------------- def EPOCH(some_date): - return time.mktime(some_date.timetuple()) - + seconds = time.mktime(some_date.timetuple()) + ms = seconds * 1000 + return ms + def PACK_DATE(event): """ Packs the datetime property of event into msgpack'able longs. diff --git a/zipline/sources.py b/zipline/sources.py index e3ec8800..42ec2367 100644 --- a/zipline/sources.py +++ b/zipline/sources.py @@ -39,7 +39,7 @@ class RandomEquityTrades(TradeDataSource): self.incr = 0 self.sid = sid self.trade_start = datetime.datetime.now().replace(tzinfo=pytz.utc) - self.minute = datetime.timedelta(minutes=1) + self.day = datetime.timedelta(days=1) self.price = random.uniform(5.0, 50.0) @@ -59,7 +59,7 @@ class RandomEquityTrades(TradeDataSource): "sid" : self.sid, "price" : self.price, "volume" : volume, - "dt" : self.trade_start + (self.minute * self.incr), + "dt" : self.trade_start + (self.day * self.incr), }) self.send(event) self.incr += 1 diff --git a/zipline/test/test_finance.py b/zipline/test/test_finance.py index 1771b5c9..b4538bfd 100644 --- a/zipline/test/test_finance.py +++ b/zipline/test/test_finance.py @@ -37,6 +37,20 @@ class FinanceTestCase(TestCase): 'sid':133 } + @timed(DEFAULT_TIMEOUT) + def test_factory(self): + trading_environment = factory.create_trading_environment() + trade_source = factory.create_daily_trade_source( + [133], + 200, + trading_environment + ) + prev = None + for trade in trade_source.event_list: + if prev: + self.assertTrue(trade.dt > prev.dt) + prev = trade + @timed(DEFAULT_TIMEOUT) def test_orders(self):