Exposes the list of trading days contained in a trading environment.

Previously, the list was generated, but only used to calculate
the number of days in the environment.

With exposing this list, working towards a path where the simulation
uses the trading days to determine when to handle market closes.
This commit is contained in:
Eddie Hebert
2013-01-01 13:01:49 -05:00
parent 7b1b9887ba
commit a25590b0a1
2 changed files with 50 additions and 8 deletions
+42
View File
@@ -21,6 +21,8 @@ import pytz
from unittest import TestCase
from datetime import datetime, timedelta
import numpy as np
from nose.tools import timed
import zipline.utils.factory as factory
@@ -117,6 +119,46 @@ class FinanceTestCase(TestCase):
self.assertTrue(env.last_close.month == 12)
self.assertTrue(env.last_close.day == 31)
@timed(DEFAULT_TIMEOUT)
def test_trading_environment_days_in_period(self):
benchmark_returns, treasury_curves = \
factory.load_market_data()
# January 2008
# Su Mo Tu We Th Fr Sa
# 1 2 3 4 5
# 6 7 8 9 10 11 12
# 13 14 15 16 17 18 19
# 20 21 22 23 24 25 26
# 27 28 29 30 31
env = TradingEnvironment(
benchmark_returns,
treasury_curves,
period_start=datetime(2007, 12, 31, tzinfo=pytz.utc),
period_end=datetime(2008, 1, 7, tzinfo=pytz.utc),
capital_base=100000,
)
expected_trading_days = (
datetime(2007, 12, 31, tzinfo=pytz.utc),
# Skip new years
#holidays taken from: http://www.nyse.com/press/1191407641943.html
datetime(2008, 1, 2, tzinfo=pytz.utc),
datetime(2008, 1, 3, tzinfo=pytz.utc),
datetime(2008, 1, 4, tzinfo=pytz.utc),
# Skip Saturday
# Skip Sunday
datetime(2008, 1, 7, tzinfo=pytz.utc)
)
num_expected_trading_days = 5
self.assertEquals(num_expected_trading_days, env.days_in_period)
np.testing.assert_array_equal(expected_trading_days,
env.period_trading_days)
@timed(EXTENDED_TIMEOUT)
def test_full_zipline(self):
#provide enough trades to ensure all orders are filled.
+8 -8
View File
@@ -73,7 +73,7 @@ class TradingEnvironment(object):
self.period_start = period_start
self.period_end = period_end
self.capital_base = capital_base
self.period_trading_days = None
self._period_trading_days = None
assert self.period_start <= self.period_end, \
"Period start falls after period end."
@@ -170,19 +170,19 @@ class TradingEnvironment(object):
)
@property
def days_in_period(self):
"""return the number of trading days within the period [start, end)"""
assert self.period_start is not None
assert self.period_end is not None
if self.period_trading_days is None:
self.period_trading_days = []
def period_trading_days(self):
if self._period_trading_days is None:
self._period_trading_days = []
for date in self.trading_day_map.iterkeys():
if date > self.period_end:
break
if date >= self.period_start:
self.period_trading_days.append(date)
return self._period_trading_days
@property
def days_in_period(self):
"""return the number of trading days within the period [start, end)"""
return len(self.period_trading_days)
def is_market_hours(self, test_date):