From 49c168b3d0d8314824c4fca48eee4a2d56547929 Mon Sep 17 00:00:00 2001 From: warren-oneill Date: Mon, 23 Mar 2015 11:52:34 +0100 Subject: [PATCH 1/6] adding trading_day and trading_days as variables to load_market_data --- zipline/data/loader.py | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/zipline/data/loader.py b/zipline/data/loader.py index 3884cb7c..009a73d0 100644 --- a/zipline/data/loader.py +++ b/zipline/data/loader.py @@ -31,10 +31,6 @@ from six import iteritems from . import benchmarks from . benchmarks import get_benchmark_returns -from zipline.utils.tradingcalendar import ( - trading_day, - trading_days -) logger = logbook.Logger('Loader') @@ -154,7 +150,7 @@ def get_benchmark_filename(symbol): return "%s_benchmark.csv" % symbol -def load_market_data(bm_symbol='^GSPC'): +def load_market_data(trading_day, trading_days, bm_symbol='^GSPC'): bm_filepath = get_data_filepath(get_benchmark_filename(bm_symbol)) try: saved_benchmarks = pd.Series.from_csv(bm_filepath) @@ -180,18 +176,21 @@ Fetching data from Yahoo Finance. # If more than 1 trading days has elapsed since the last day where # we have data,then we need to update - # We're doing "> 2" rather than "> 1" because we're subtracting an array - # _length_ from an array _index_, and therefore even if we had data up to - # and including the current day, the difference would still be 1. - if len(days_up_to_now) - last_bm_date_offset > 2: + if len(days_up_to_now) - last_bm_date_offset > 1: benchmark_returns = update_benchmarks(bm_symbol, last_bm_date) - if benchmark_returns.index.tz is None or \ - benchmark_returns.index.tz.zone != 'UTC': + if ( + benchmark_returns.index.tz is None + or + benchmark_returns.index.tz.zone != 'UTC' + ): benchmark_returns = benchmark_returns.tz_localize('UTC') else: benchmark_returns = saved_benchmarks - if benchmark_returns.index.tz is None or\ - benchmark_returns.index.tz.zone != 'UTC': + if ( + benchmark_returns.index.tz is None + or + benchmark_returns.index.tz.zone != 'UTC' + ): benchmark_returns = benchmark_returns.tz_localize('UTC') # Get treasury curve module, filename & source from mapping. @@ -218,8 +217,7 @@ Fetching data from {0} # If more than 1 trading days has elapsed since the last day where # we have data,then we need to update - # Comment above explains why this is "> 2". - if len(days_up_to_now) - last_tr_date_offset > 2: + if len(days_up_to_now) - last_tr_date_offset > 1: treasury_curves = dump_treasury_curves(module, filename) else: treasury_curves = saved_curves.tz_localize('UTC') From 358d2a3b5984eaf53e6b3b764fe475c049429daf Mon Sep 17 00:00:00 2001 From: warren-oneill Date: Mon, 23 Mar 2015 11:55:44 +0100 Subject: [PATCH 2/6] remove hardcoding of get_early_closes and passing trading_day and trading_days from env to load() --- zipline/finance/trading.py | 41 ++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/zipline/finance/trading.py b/zipline/finance/trading.py index 44b516b6..8214fefc 100644 --- a/zipline/finance/trading.py +++ b/zipline/finance/trading.py @@ -23,7 +23,6 @@ import numpy as np from zipline.data.loader import load_market_data from zipline.utils import tradingcalendar -from zipline.utils.tradingcalendar import get_early_closes log = logbook.Logger('Trading') @@ -93,13 +92,34 @@ class TradingEnvironment(object): max_date=None, env_trading_calendar=tradingcalendar ): + # `tc_tdays` is short for "trading calendar trading days" + # `tc_tday` is short for "trading calendar trading day" + tc_tdays = env_trading_calendar.trading_days + tc_tday = env_trading_calendar.trading_day + + if max_date: + self.trading_days = tc_tdays[tc_tdays <= max_date].copy() + self.trading_day = tc_tday[tc_tday <= max_date].copy() + else: + self.trading_days = tc_tdays.copy() + self.trading_day = tc_tday.copy() + + self.first_trading_day = self.trading_days[0] + self.last_trading_day = self.trading_days[-1] + + self.early_closes = env_trading_calendar.get_early_closes( + self.first_trading_day, self.last_trading_day) + + self.open_and_closes = env_trading_calendar.open_and_closes.loc[ + self.trading_days] + self.prev_environment = self self.bm_symbol = bm_symbol if not load: load = load_market_data self.benchmark_returns, treasury_curves_map = \ - load(self.bm_symbol) + load(self.trading_day, self.trading_days, self.bm_symbol) self.treasury_curves = pd.DataFrame(treasury_curves_map).T if max_date: @@ -112,23 +132,6 @@ class TradingEnvironment(object): self.exchange_tz = exchange_tz - # `tc_td` is short for "trading calendar trading days" - tc_td = env_trading_calendar.trading_days - - if max_date: - self.trading_days = tc_td[tc_td <= max_date].copy() - else: - self.trading_days = tc_td.copy() - - self.first_trading_day = self.trading_days[0] - self.last_trading_day = self.trading_days[-1] - - self.early_closes = get_early_closes(self.first_trading_day, - self.last_trading_day) - - self.open_and_closes = env_trading_calendar.open_and_closes.loc[ - self.trading_days] - def __enter__(self, *args, **kwargs): global environment self.prev_environment = environment From 6432631981632159a17eeffd772fea64b07542b5 Mon Sep 17 00:00:00 2001 From: warren-oneill Date: Mon, 23 Mar 2015 11:58:12 +0100 Subject: [PATCH 3/6] uncommenting out test_calendar_vs_environment --- tests/test_tradingcalendar.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_tradingcalendar.py b/tests/test_tradingcalendar.py index c5a43227..4ea8e498 100644 --- a/tests/test_tradingcalendar.py +++ b/tests/test_tradingcalendar.py @@ -26,7 +26,6 @@ from nose.tools import nottest class TestTradingCalendar(TestCase): - @nottest def test_calendar_vs_environment(self): """ test_calendar_vs_environment checks whether the From aa872afdf4bde19aff288aba84d92e0d1d5350cf Mon Sep 17 00:00:00 2001 From: warren-oneill Date: Mon, 23 Mar 2015 12:19:10 +0100 Subject: [PATCH 4/6] adding updates from master --- zipline/data/loader.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/zipline/data/loader.py b/zipline/data/loader.py index 009a73d0..7ff6b5ae 100644 --- a/zipline/data/loader.py +++ b/zipline/data/loader.py @@ -176,21 +176,18 @@ Fetching data from Yahoo Finance. # If more than 1 trading days has elapsed since the last day where # we have data,then we need to update - if len(days_up_to_now) - last_bm_date_offset > 1: + # We're doing "> 2" rather than "> 1" because we're subtracting an array + # _length_ from an array _index_, and therefore even if we had data up to + # and including the current day, the difference would still be 1. + if len(days_up_to_now) - last_bm_date_offset > 2: benchmark_returns = update_benchmarks(bm_symbol, last_bm_date) - if ( - benchmark_returns.index.tz is None - or - benchmark_returns.index.tz.zone != 'UTC' - ): + if benchmark_returns.index.tz is None or \ + benchmark_returns.index.tz.zone != 'UTC': benchmark_returns = benchmark_returns.tz_localize('UTC') else: benchmark_returns = saved_benchmarks - if ( - benchmark_returns.index.tz is None - or - benchmark_returns.index.tz.zone != 'UTC' - ): + if benchmark_returns.index.tz is None or\ + benchmark_returns.index.tz.zone != 'UTC': benchmark_returns = benchmark_returns.tz_localize('UTC') # Get treasury curve module, filename & source from mapping. @@ -217,7 +214,8 @@ Fetching data from {0} # If more than 1 trading days has elapsed since the last day where # we have data,then we need to update - if len(days_up_to_now) - last_tr_date_offset > 1: + # Comment above explains why this is "> 2". + if len(days_up_to_now) - last_tr_date_offset > 2: treasury_curves = dump_treasury_curves(module, filename) else: treasury_curves = saved_curves.tz_localize('UTC') From b62fadc76fef58e68793488ce6ecbec83d3cda05 Mon Sep 17 00:00:00 2001 From: warren-oneill Date: Wed, 25 Mar 2015 09:21:53 +0100 Subject: [PATCH 5/6] adding NYSE trading_day and trading_days as default in load_market_data() --- zipline/data/loader.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/zipline/data/loader.py b/zipline/data/loader.py index 7ff6b5ae..9b6d7d21 100644 --- a/zipline/data/loader.py +++ b/zipline/data/loader.py @@ -31,6 +31,8 @@ from six import iteritems from . import benchmarks from . benchmarks import get_benchmark_returns +from zipline.utils.tradingcalendar import trading_day as trading_day_nyse +from zipline.utils.tradingcalendar import trading_days as trading_days_nyse logger = logbook.Logger('Loader') @@ -150,7 +152,8 @@ def get_benchmark_filename(symbol): return "%s_benchmark.csv" % symbol -def load_market_data(trading_day, trading_days, bm_symbol='^GSPC'): +def load_market_data(trading_day=trading_day_nyse, + trading_days=trading_days_nyse, bm_symbol='^GSPC'): bm_filepath = get_data_filepath(get_benchmark_filename(bm_symbol)) try: saved_benchmarks = pd.Series.from_csv(bm_filepath) From 61571601acac90057cbbb15847513af6950f1432 Mon Sep 17 00:00:00 2001 From: warren-oneill Date: Tue, 31 Mar 2015 09:24:42 +0200 Subject: [PATCH 6/6] added test for initialization of max_date in TradingEnvironment and removed trading_day from max_date if statement. --- tests/test_finance.py | 8 ++++++++ zipline/finance/trading.py | 16 +++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/tests/test_finance.py b/tests/test_finance.py index b511347f..87ac9858 100644 --- a/tests/test_finance.py +++ b/tests/test_finance.py @@ -526,3 +526,11 @@ class TradingEnvironmentTestCase(TestCase): self.assertTrue(all(today == minutes[:31])) self.assertTrue(all(friday == minutes[31:421])) self.assertTrue(all(thursday == minutes[421:])) + + def test_max_date(self): + max_date = datetime(2008, 8, 1, tzinfo=pytz.utc) + env = TradingEnvironment(max_date=max_date) + + self.assertLessEqual(env.last_trading_day, max_date) + self.assertLessEqual(env.treasury_curves.index[-1], + max_date) diff --git a/zipline/finance/trading.py b/zipline/finance/trading.py index 8214fefc..6c3a1e47 100644 --- a/zipline/finance/trading.py +++ b/zipline/finance/trading.py @@ -92,17 +92,15 @@ class TradingEnvironment(object): max_date=None, env_trading_calendar=tradingcalendar ): - # `tc_tdays` is short for "trading calendar trading days" - # `tc_tday` is short for "trading calendar trading day" - tc_tdays = env_trading_calendar.trading_days - tc_tday = env_trading_calendar.trading_day + self.trading_day = env_trading_calendar.trading_day.copy() + + # `tc_td` is short for "trading calendar trading days" + tc_td = env_trading_calendar.trading_days if max_date: - self.trading_days = tc_tdays[tc_tdays <= max_date].copy() - self.trading_day = tc_tday[tc_tday <= max_date].copy() + self.trading_days = tc_td[tc_td <= max_date].copy() else: - self.trading_days = tc_tdays.copy() - self.trading_day = tc_tday.copy() + self.trading_days = tc_td.copy() self.first_trading_day = self.trading_days[0] self.last_trading_day = self.trading_days[-1] @@ -124,7 +122,7 @@ class TradingEnvironment(object): self.treasury_curves = pd.DataFrame(treasury_curves_map).T if max_date: tr_c = self.treasury_curves - # Mask the treasury curvers down to the current date. + # Mask the treasury curves down to the current date. # In the case of live trading, the last date in the treasury # curves would be the day before the date considered to be # 'today'.