diff --git a/tests/modelling/test_engine.py b/tests/modelling/test_engine.py index 6cfcd05c..fa82f4d0 100644 --- a/tests/modelling/test_engine.py +++ b/tests/modelling/test_engine.py @@ -39,6 +39,7 @@ from zipline.data.ffc.loaders.us_equity_pricing import ( BcolzDailyBarReader, USEquityPricingLoader, ) +from zipline.finance import trading from zipline.finance.trading import TradingEnvironment from zipline.modelling.engine import SimpleFFCEngine from zipline.modelling.factor import TestingFactor @@ -93,7 +94,9 @@ class ConstantInputTestCase(TestCase): start_date=self.dates[0], end_date=self.dates[-1], ) - self.asset_finder = AssetFinder(self.asset_info) + trading.environment = trading.TradingEnvironment() + trading.environment.write_data(equities_df=self.asset_info) + self.asset_finder = AssetFinder(trading.environment.engine) def test_bad_dates(self): loader = self.loader @@ -222,12 +225,13 @@ class ConstantInputTestCase(TestCase): class FrameInputTestCase(TestCase): - def setUp(self): - env = TradingEnvironment.instance() - day = env.trading_day + @classmethod + def setUpClass(cls): + cls.env = trading.TradingEnvironment() + day = cls.env.trading_day - self.assets = Int64Index([1, 2, 3]) - self.dates = date_range( + cls.assets = Int64Index([1, 2, 3]) + cls.dates = date_range( '2015-01-01', '2015-01-31', freq=day, @@ -235,11 +239,16 @@ class FrameInputTestCase(TestCase): ) asset_info = make_simple_asset_info( - self.assets, - start_date=self.dates[0], - end_date=self.dates[-1], + cls.assets, + start_date=cls.dates[0], + end_date=cls.dates[-1], ) - self.asset_finder = AssetFinder(asset_info) + cls.env.write_data(equities_df=asset_info) + + def setUp(self): + self.asset_finder = AssetFinder(FrameInputTestCase.env.engine) + self.dates = FrameInputTestCase.dates + self.assets = FrameInputTestCase.assets @lazyval def base_mask(self): @@ -329,7 +338,7 @@ class SyntheticBcolzTestCase(TestCase): @classmethod def setUpClass(cls): cls.first_asset_start = Timestamp('2015-04-01', tz='UTC') - cls.env = TradingEnvironment.instance() + cls.env = trading.TradingEnvironment() cls.trading_day = cls.env.trading_day cls.asset_info = make_rotating_asset_info( num_assets=6, @@ -345,7 +354,8 @@ class SyntheticBcolzTestCase(TestCase): freq=cls.trading_day, ) - cls.finder = AssetFinder(cls.asset_info) + cls.env.write_data(equities_df=cls.asset_info) + cls.finder = AssetFinder(cls.env.engine) cls.temp_dir = TempDirectory() cls.temp_dir.create() diff --git a/tests/modelling/test_modelling_algo.py b/tests/modelling/test_modelling_algo.py index b7fce006..e589ed04 100644 --- a/tests/modelling/test_modelling_algo.py +++ b/tests/modelling/test_modelling_algo.py @@ -42,6 +42,7 @@ from zipline.data.ffc.loaders.us_equity_pricing import ( USEquityPricingLoader, ) # from zipline.modelling.factor import CustomFactor +from zipline.finance import trading from zipline.modelling.factor.technical import VWAP from zipline.utils.test_utils import ( make_simple_asset_info, @@ -84,7 +85,9 @@ class FFCAlgorithmTestCase(TestCase): Timestamp('2015'), ['AAPL', 'MSFT', 'BRK_A'], ) - cls.asset_finder = AssetFinder(asset_info) + cls.env = trading.TradingEnvironment() + cls.env.write_data(equities_df=asset_info) + cls.asset_finder = AssetFinder(cls.env.engine) cls.tempdir = tempdir = TempDirectory() tempdir.create() try: @@ -200,6 +203,11 @@ class FFCAlgorithmTestCase(TestCase): # Do the same checks in before_trading_start before_trading_start = handle_data + # Create fresh trading environment as the algo.run() + # method will attempt to write data to disk, and could + # violate SQL constraints. + trading.environment = trading.TradingEnvironment() + algo = TradingAlgorithm( initialize=initialize, handle_data=handle_data, diff --git a/tests/test_algorithm.py b/tests/test_algorithm.py index 1d4ffb84..e2984020 100644 --- a/tests/test_algorithm.py +++ b/tests/test_algorithm.py @@ -627,7 +627,6 @@ class TestTransformAlgorithm(TestCase): def test_order_instant(self): algo = TestOrderInstantAlgorithm(sim_params=self.sim_params, instant_fill=True) - algo.run(self.df) def test_minute_data(self): diff --git a/tests/test_algorithm_gen.py b/tests/test_algorithm_gen.py index d33abfd3..1aa5babd 100644 --- a/tests/test_algorithm_gen.py +++ b/tests/test_algorithm_gen.py @@ -85,6 +85,12 @@ class TestAlgo(TradingAlgorithm): class AlgorithmGeneratorTestCase(TestCase): + + @classmethod + def setUpClass(cls): + cls.env = trading.TradingEnvironment() + cls.env.write_data(equities_identifiers=[8229]) + def setUp(self): setup_logger(self) @@ -106,6 +112,8 @@ class AlgorithmGeneratorTestCase(TestCase): end=datetime(2012, 6, 30, tzinfo=pytz.utc) ) algo = TestAlgo(self, identifiers=[8229], sim_params=sim_params) + # This call appears inconsistent with + # the signature of create_daily_trade_source trade_source = factory.create_daily_trade_source( [8229], 200, @@ -127,11 +135,15 @@ class AlgorithmGeneratorTestCase(TestCase): Ensure the pipeline of generators are in sync, at least as far as their current dates. """ + # Ensure we are pointing to the TradingEnvironment for this class + trading.environment = AlgorithmGeneratorTestCase.env + sim_params = factory.create_simulation_parameters( start=datetime(2011, 7, 30, tzinfo=pytz.utc), end=datetime(2012, 7, 30, tzinfo=pytz.utc) ) - algo = TestAlgo(self, identifiers=[8229], sim_params=sim_params) + algo = TestAlgo(self, sim_params=sim_params, + env=AlgorithmGeneratorTestCase.env) trade_source = factory.create_daily_trade_source( [8229], sim_params @@ -158,7 +170,8 @@ class AlgorithmGeneratorTestCase(TestCase): period_end=datetime(2012, 7, 30, tzinfo=pytz.utc), data_frequency='minute' ) - algo = TestAlgo(self, identifiers=[8229], sim_params=sim_params) + algo = TestAlgo(self, sim_params=sim_params, + env=AlgorithmGeneratorTestCase.env) midnight_custom_source = [Event({ 'custom_field': 42.0, @@ -196,11 +209,15 @@ class AlgorithmGeneratorTestCase(TestCase): Ensure the pipeline of generators are in sync, at least as far as their current dates. """ + # Ensure we are pointing to the TradingEnvironment for this class + trading.environment = AlgorithmGeneratorTestCase.env + sim_params = factory.create_simulation_parameters( start=datetime(2008, 1, 1, tzinfo=pytz.utc), end=datetime(2008, 1, 5, tzinfo=pytz.utc) ) - algo = TestAlgo(self, sim_params=sim_params) + algo = TestAlgo(self, sim_params=sim_params, + env=AlgorithmGeneratorTestCase.env) trade_source = factory.create_daily_trade_source( [8229], sim_params @@ -222,6 +239,7 @@ class AlgorithmGeneratorTestCase(TestCase): """ sim_params = create_simulation_parameters(num_days=1, data_frequency='minute') - algo = TestAlgo(self, sim_params=sim_params, identifiers=[8229]) + algo = TestAlgo(self, sim_params=sim_params, + env=AlgorithmGeneratorTestCase.env) algo.run(source=[], overwrite_sim_params=False) self.assertEqual(algo.datetime, sim_params.last_close) diff --git a/tests/test_assets.py b/tests/test_assets.py index fb5de11f..bad5d914 100644 --- a/tests/test_assets.py +++ b/tests/test_assets.py @@ -24,7 +24,6 @@ from datetime import datetime, timedelta import pickle import uuid import warnings -import sqlite3 import pandas as pd from pandas.tseries.tools import normalize_date @@ -35,13 +34,13 @@ from numpy import full from zipline.assets import Asset, Equity, Future, AssetFinder from zipline.assets.futures import FutureChain -from zipline.assets.asset_writer import AssetDBWriterFromDataFrame from zipline.errors import ( SymbolNotFound, MultipleSymbolsFound, SidAssignmentError, RootSymbolNotFound, ) +from zipline.finance import trading from zipline.finance.trading import with_environment from zipline.utils.test_utils import ( all_subindices, @@ -67,32 +66,30 @@ def build_lookup_generic_cases(): [ { 'sid': 0, - 'asset_name': 'duplicated_0', + 'symbol': 'duplicated_0', 'start_date': dupe_0_start.value, 'end_date': dupe_0_end.value, 'exchange': '', }, { 'sid': 1, - 'asset_name': 'duplicated_1', + 'symbol': 'duplicated_1', 'start_date': dupe_1_start.value, 'end_date': dupe_1_end.value, 'exchange': '', }, { 'sid': 2, - 'asset_name': 'unique', + 'symbol': 'unique', 'start_date': unique_start.value, 'end_date': unique_end.value, 'exchange': '', }, ], index='sid') - db_path = '~/temp.db' - conn = sqlite3.connect(db_path) - asset_writer = AssetDBWriterFromDataFrame(equities=frame) - asset_writer.write_all(conn) - finder = AssetFinder(conn) + trading.environment = trading.TradingEnvironment() + trading.environment.write_data(equities_df=frame) + finder = AssetFinder(trading.environment.engine) dupe_0, dupe_1, unique = assets = [ finder.retrieve_asset(i) for i in range(3) @@ -113,8 +110,8 @@ def build_lookup_generic_cases(): (finder, 1, None, assets[1]), (finder, 2, None, assets[2]), # Duplicated symbol with resolution date - (finder, 'duplicated', dupe_0_start, dupe_0), - (finder, 'duplicated', dupe_1_start, dupe_1), + (finder, 'duplicated_0', dupe_0_start, dupe_0), + (finder, 'duplicated_1', dupe_1_start, dupe_1), # Unique symbol, with or without resolution date. (finder, 'unique', unique_start, unique), (finder, 'unique', None, unique), @@ -129,11 +126,11 @@ def build_lookup_generic_cases(): (finder, (0, 1), None, assets[:-1]), (finder, iter((0, 1)), None, assets[:-1]), # Iterables of symbols. - (finder, ('duplicated', 'unique'), dupe_0_start, [dupe_0, unique]), - (finder, ('duplicated', 'unique'), dupe_1_start, [dupe_1, unique]), + (finder, ('duplicated_0', 'unique'), dupe_0_start, [dupe_0, unique]), + (finder, ('duplicated_1', 'unique'), dupe_1_start, [dupe_1, unique]), # Mixed types (finder, - ('duplicated', 2, 'unique', 1, dupe_1), + ('duplicated_0', 2, 'unique', 1, dupe_1), dupe_0_start, [dupe_0, assets[2], unique, assets[1], dupe_1]), ] @@ -283,22 +280,27 @@ class TestFuture(TestCase): class AssetFinderTestCase(TestCase): + def setUp(self): + trading.environment = trading.TradingEnvironment() + def test_lookup_symbol_fuzzy(self): as_of = pd.Timestamp('2013-01-01', tz='UTC') frame = pd.DataFrame.from_records( [ { 'sid': i, - 'file_name': 'TEST@%d' % i, + 'symbol': 'TEST@%d' % i, 'company_name': "company%d" % i, - 'start_date_nano': as_of.value, - 'end_date_nano': as_of.value, + 'start_date_': as_of.value, + 'end_date': as_of.value, 'exchange': uuid.uuid4().hex, + 'fuzzy': 'TEST%d' % i } for i in range(3) ] ) - finder = AssetFinder(frame, fuzzy_char='@') + trading.environment.write_data(equities_df=frame) + finder = AssetFinder(trading.environment.engine, fuzzy_char='@') asset_0, asset_1, asset_2 = ( finder.retrieve_asset(i) for i in range(3) ) @@ -334,17 +336,16 @@ class AssetFinderTestCase(TestCase): [ { 'sid': i, - 'file_name': 'existing', - 'company_name': 'existing', - 'start_date_nano': date.value, - 'end_date_nano': (date + timedelta(days=1)).value, + 'symbol': 'existing', + 'start_date': date.value, + 'end_date': (date + timedelta(days=1)).value, 'exchange': 'NYSE', } for i, date in enumerate(dates) ] ) - - finder = AssetFinder(df) + trading.environment.write_data(equities_df=df) + finder = AssetFinder(trading.environment.engine) for _ in range(2): # Run checks twice to test for caching bugs. with self.assertRaises(SymbolNotFound): finder.lookup_symbol_resolve_multiple('non_existing', dates[0]) @@ -378,43 +379,40 @@ class AssetFinderTestCase(TestCase): [ { 'sid': 0, - 'file_name': 'real', - 'company_name': 'real', - 'start_date_nano': pd.Timestamp('2013-1-1', tz='UTC'), - 'end_date_nano': pd.Timestamp('2014-1-1', tz='UTC'), + 'symbol': 'real', + 'start_date': pd.Timestamp('2013-1-1', tz='UTC'), + 'end_date': pd.Timestamp('2014-1-1', tz='UTC'), 'exchange': '', }, { 'sid': 1, - 'file_name': 'also_real', - 'company_name': 'also_real', - 'start_date_nano': pd.Timestamp('2013-1-1', tz='UTC'), - 'end_date_nano': pd.Timestamp('2014-1-1', tz='UTC'), + 'symbol': 'also_real', + 'start_date': pd.Timestamp('2013-1-1', tz='UTC'), + 'end_date': pd.Timestamp('2014-1-1', tz='UTC'), 'exchange': '', }, # Sid whose end date is before our query date. We should # still correctly find it. { 'sid': 2, - 'file_name': 'real_but_old', - 'company_name': 'real_but_old', - 'start_date_nano': pd.Timestamp('2002-1-1', tz='UTC'), - 'end_date_nano': pd.Timestamp('2003-1-1', tz='UTC'), + 'symbol': 'real_but_old', + 'start_date': pd.Timestamp('2002-1-1', tz='UTC'), + 'end_date': pd.Timestamp('2003-1-1', tz='UTC'), 'exchange': '', }, # Sid whose start_date is **after** our query date. We should # **not** find it. { 'sid': 3, - 'file_name': 'real_but_in_the_future', - 'company_name': 'real_but_in_the_future', - 'start_date_nano': pd.Timestamp('2014-1-1', tz='UTC'), - 'end_date_nano': pd.Timestamp('2020-1-1', tz='UTC'), + 'symbol': 'real_but_in_the_future', + 'start_date': pd.Timestamp('2014-1-1', tz='UTC'), + 'end_date': pd.Timestamp('2020-1-1', tz='UTC'), 'exchange': 'THE FUTURE', }, ] ) - finder = AssetFinder(data) + trading.environment.write_data(equities_df=data) + finder = AssetFinder(trading.environment.engine) results, missing = finder.lookup_generic( ['real', 1, 'fake', 'real_but_old', 'real_but_in_the_future'], pd.Timestamp('2013-02-01', tz='UTC'), @@ -433,14 +431,13 @@ class AssetFinderTestCase(TestCase): self.assertEqual(missing[1], 'real_but_in_the_future') def test_insert_metadata(self): - finder = AssetFinder() - finder.insert_metadata(0, - asset_type='equity', - start_date='2014-01-01', - end_date='2015-01-01', - symbol="PLAY", - foo_data="FOO",) - + data = {0: {'asset_type': 'equity', + 'start_date': '2014-01-01', + 'end_date': '2015-01-01', + 'symbol': "PLAY", + 'foo_data': "FOO"}} + trading.environment.write_data(equities_data=data) + finder = AssetFinder(trading.environment.engine) # Test proper insertion equity = finder.retrieve_asset(0) self.assertIsInstance(equity, Equity) @@ -455,24 +452,24 @@ class AssetFinderTestCase(TestCase): def test_consume_metadata(self): # Test dict consumption - finder = AssetFinder() dict_to_consume = {0: {'symbol': 'PLAY'}, 1: {'symbol': 'MSFT'}} - finder.consume_metadata(dict_to_consume) + trading.environment.write_data(equities_data=dict_to_consume) + finder = AssetFinder(trading.environment.engine) equity = finder.retrieve_asset(0) self.assertIsInstance(equity, Equity) self.assertEqual('PLAY', equity.symbol) - finder = AssetFinder() - # Test dataframe consumption df = pd.DataFrame(columns=['asset_name', 'exchange'], index=[0, 1]) df['asset_name'][0] = "Dave'N'Busters" df['exchange'][0] = "NASDAQ" df['asset_name'][1] = "Microsoft" df['exchange'][1] = "NYSE" - finder.consume_metadata(df) + trading.environment = trading.TradingEnvironment() + trading.environment.write_data(equities_df=df) + finder = AssetFinder(trading.environment.engine) self.assertEqual('NASDAQ', finder.retrieve_asset(0).exchange) self.assertEqual('Microsoft', finder.retrieve_asset(1).asset_name) @@ -486,8 +483,9 @@ class AssetFinderTestCase(TestCase): future_asset = Future(200, symbol="TESTFUT", end_date=fut_end) # Consume the Assets - finder = AssetFinder() - finder.consume_identifiers([equity_asset, future_asset]) + trading.environment.write_data(equities_identifiers=[equity_asset], + futures_identifiers=[future_asset]) + finder = AssetFinder(trading.environment.engine) # Test equality with newly built Assets self.assertEqual(equity_asset, finder.retrieve_asset(1)) @@ -498,16 +496,16 @@ class AssetFinderTestCase(TestCase): def test_sid_assignment(self): # This metadata does not contain SIDs - metadata = {'PLAY': {'symbol': 'PLAY'}, - 'MSFT': {'symbol': 'MSFT'}} + metadata = ['PLAY', 'MSFT'] today = normalize_date(pd.Timestamp('2015-07-09', tz='UTC')) - # Build a finder that is allowed to assign sids - finder = AssetFinder(metadata=metadata, - allow_sid_assignment=True) + # Write data with sid assignment + trading.environment.write_data(equities_identifiers=metadata, + allow_sid_assignment=True) # Verify that Assets were built and different sids were assigned + finder = AssetFinder(trading.environment.engine) play = finder.lookup_symbol('PLAY', today) msft = finder.lookup_symbol('MSFT', today) self.assertEqual('PLAY', play.symbol) @@ -517,12 +515,12 @@ class AssetFinderTestCase(TestCase): def test_sid_assignment_failure(self): # This metadata does not contain SIDs - metadata = {'PLAY': {'symbol': 'PLAY'}, - 'MSFT': {'symbol': 'MSFT'}} + metadata = ['PLAY', 'MSFT'] - # Build a finder that is not allowed to assign sids, asserting failure + # Write data without sid assignment, asserting failure with self.assertRaises(SidAssignmentError): - AssetFinder(metadata=metadata, allow_sid_assignment=False) + trading.environment.write_data(equities_identifiers=metadata, + allow_sid_assignment=False) def test_security_dates_warning(self): @@ -579,8 +577,8 @@ class AssetFinderTestCase(TestCase): }, } - - finder = AssetFinder(metadata=metadata) + trading.environment.write_data(futures_data=metadata) + finder = AssetFinder(trading.environment.engine) dt = pd.Timestamp('2015-05-14', tz='UTC') last_year = pd.Timestamp('2014-01-01', tz='UTC') first_day = pd.Timestamp('2015-01-01', tz='UTC') @@ -611,7 +609,7 @@ class AssetFinderTestCase(TestCase): def test_map_identifier_index_to_sids(self): # Build an empty finder and some Assets dt = pd.Timestamp('2014-01-01', tz='UTC') - finder = AssetFinder() + finder = AssetFinder(trading.environment.engine) asset1 = Equity(1, symbol="AAPL") asset2 = Equity(2, symbol="GOOG") asset200 = Future(200, symbol="CLK15") @@ -642,7 +640,9 @@ class AssetFinderTestCase(TestCase): periods_between_starts=3, asset_lifetime=5 ) - finder = AssetFinder(frame) + + trading.environment.write_data(equities_df=frame) + finder = AssetFinder(trading.environment.engine) all_dates = pd.date_range( start=first_start, @@ -667,45 +667,50 @@ class AssetFinderTestCase(TestCase): expected_result = pd.DataFrame( data=expected_mask, index=dates, - columns=frame.sid.values, + columns=frame.index.values, ) + actual_result = finder.lifetimes(dates) assert_frame_equal(actual_result, expected_result) class TestFutureChain(TestCase): - metadata = { - 0: { - 'symbol': 'CLG06', - 'root_symbol': 'CL', - 'asset_type': 'future', - 'start_date': pd.Timestamp('2005-12-01', tz='UTC'), - 'notice_date': pd.Timestamp('2005-12-20', tz='UTC'), - 'expiration_date': pd.Timestamp('2006-01-20', tz='UTC')}, - 1: { - 'root_symbol': 'CL', - 'symbol': 'CLK06', - 'asset_type': 'future', - 'start_date': pd.Timestamp('2005-12-01', tz='UTC'), - 'notice_date': pd.Timestamp('2006-03-20', tz='UTC'), - 'expiration_date': pd.Timestamp('2006-04-20', tz='UTC')}, - 2: { - 'symbol': 'CLQ06', - 'root_symbol': 'CL', - 'asset_type': 'future', - 'start_date': pd.Timestamp('2005-12-01', tz='UTC'), - 'notice_date': pd.Timestamp('2006-06-20', tz='UTC'), - 'expiration_date': pd.Timestamp('2006-07-20', tz='UTC')}, - 3: { - 'symbol': 'CLX06', - 'root_symbol': 'CL', - 'asset_type': 'future', - 'start_date': pd.Timestamp('2006-02-01', tz='UTC'), - 'notice_date': pd.Timestamp('2006-09-20', tz='UTC'), - 'expiration_date': pd.Timestamp('2006-10-20', tz='UTC')} - } - asset_finder = AssetFinder(metadata=metadata) + def setUp(self): + metadata = { + 0: { + 'symbol': 'CLG06', + 'root_symbol': 'CL', + 'asset_type': 'future', + 'start_date': pd.Timestamp('2005-12-01', tz='UTC'), + 'notice_date': pd.Timestamp('2005-12-20', tz='UTC'), + 'expiration_date': pd.Timestamp('2006-01-20', tz='UTC')}, + 1: { + 'root_symbol': 'CL', + 'symbol': 'CLK06', + 'asset_type': 'future', + 'start_date': pd.Timestamp('2005-12-01', tz='UTC'), + 'notice_date': pd.Timestamp('2006-03-20', tz='UTC'), + 'expiration_date': pd.Timestamp('2006-04-20', tz='UTC')}, + 2: { + 'symbol': 'CLQ06', + 'root_symbol': 'CL', + 'asset_type': 'future', + 'start_date': pd.Timestamp('2005-12-01', tz='UTC'), + 'notice_date': pd.Timestamp('2006-06-20', tz='UTC'), + 'expiration_date': pd.Timestamp('2006-07-20', tz='UTC')}, + 3: { + 'symbol': 'CLX06', + 'root_symbol': 'CL', + 'asset_type': 'future', + 'start_date': pd.Timestamp('2006-02-01', tz='UTC'), + 'notice_date': pd.Timestamp('2006-09-20', tz='UTC'), + 'expiration_date': pd.Timestamp('2006-10-20', tz='UTC')} + } + + trading.environment = trading.TradingEnvironment() + trading.environment.write_data(futures_data=metadata) + self.asset_finder = AssetFinder(trading.environment.engine) def test_len(self): """ Test the __len__ method of FutureChain. diff --git a/tests/test_batchtransform.py b/tests/test_batchtransform.py index 4ef711e3..806cfbe8 100644 --- a/tests/test_batchtransform.py +++ b/tests/test_batchtransform.py @@ -33,6 +33,7 @@ from zipline.test_algorithms import (BatchTransformAlgorithm, BatchTransformAlgorithmMinute, ReturnPriceBatchTransform) +from zipline.finance import trading from zipline.algorithm import TradingAlgorithm from zipline.utils.tradingcalendar import trading_days from copy import deepcopy @@ -106,6 +107,8 @@ class DifferentSidSource(DataSource): class TestChangeOfSids(TestCase): def setUp(self): self.sids = range(90) + trading.environment = trading.TradingEnvironment() + trading.environment.write_data(equities_identifiers=self.sids) self.sim_params = factory.create_simulation_parameters( start=datetime(1990, 1, 1, tzinfo=pytz.utc), end=datetime(1990, 1, 8, tzinfo=pytz.utc) @@ -114,7 +117,6 @@ class TestChangeOfSids(TestCase): def test_all_sids_passed(self): algo = BatchTransformAlgorithmSetSid( sim_params=self.sim_params, - identifiers=[i for i in range(0, 90)] ) source = DifferentSidSource() algo.run(source) @@ -137,6 +139,8 @@ class TestBatchTransformMinutely(TestCase): start=start, end=end, ) + trading.environment = trading.TradingEnvironment() + trading.environment.write_data(equities_identifiers=[0]) self.sim_params.emission_rate = 'daily' self.sim_params.data_frequency = 'minute' self.source, self.df = \ @@ -164,12 +168,19 @@ class TestBatchTransformMinutely(TestCase): class TestBatchTransform(TestCase): + + @classmethod + def setUpClass(cls): + cls.env = trading.TradingEnvironment() + cls.env.write_data(equities_identifiers=[0]) + def setUp(self): setup_logger(self) self.sim_params = factory.create_simulation_parameters( start=datetime(1990, 1, 1, tzinfo=pytz.utc), end=datetime(1990, 1, 8, tzinfo=pytz.utc) ) + trading.environment = TestBatchTransform.env self.source, self.df = \ factory.create_test_df_source(self.sim_params) diff --git a/tests/test_blotter.py b/tests/test_blotter.py index 89226339..ebd36498 100644 --- a/tests/test_blotter.py +++ b/tests/test_blotter.py @@ -17,6 +17,7 @@ import datetime from nose_parameterized import parameterized from unittest import TestCase +from zipline.finance import trading from zipline.finance.blotter import Blotter, ORDER_STATUS from zipline.finance.trading import with_environment from zipline.finance.execution import ( @@ -35,10 +36,13 @@ from zipline.utils.test_utils import( class BlotterTestCase(TestCase): - @with_environment() + @classmethod + def setUpClass(cls): + cls.env = trading.TradingEnvironment() + cls.env.write_data(equities_identifiers=[24]) + def setUp(self, env=None): setup_logger(self) - env.write_data(equities_identifiers=[24]) def tearDown(self): teardown_logger(self) diff --git a/tests/test_events_through_risk.py b/tests/test_events_through_risk.py index b8d8ee24..b67b4209 100644 --- a/tests/test_events_through_risk.py +++ b/tests/test_events_through_risk.py @@ -45,6 +45,9 @@ class TestEventsThroughRisk(unittest.TestCase): def test_daily_buy_and_hold(self): + trading.environment = trading.TradingEnvironment() + trading.environment.write_data(equities_identifiers=[1]) + start_date = datetime.datetime( year=2006, month=1, @@ -68,7 +71,6 @@ class TestEventsThroughRisk(unittest.TestCase): ) algo = BuyAndHoldAlgorithm( - identifiers=[1], sim_params=sim_params) first_date = datetime.datetime(2006, 1, 3, tzinfo=pytz.utc) diff --git a/tests/test_examples.py b/tests/test_examples.py index 5c93547b..fa43d52f 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -31,6 +31,8 @@ from zipline.utils import parse_args, run_pipeline # Otherwise the next line sometimes complains about being run too late. _multiprocess_can_split_ = False +from zipline.finance import trading + matplotlib.use('Agg') @@ -45,6 +47,8 @@ class ExamplesTests(TestCase): @parameterized.expand(((os.path.basename(f).replace('.', '_'), f) for f in glob.glob(os.path.join(example_dir(), '*.py')))) def test_example(self, name, example): + # Create a new trading environment for each test. + trading.environment = trading.TradingEnvironment() imp.load_source('__main__', os.path.basename(example), open(example)) # Test algorithm as if scripts/run_algo.py is being used. diff --git a/tests/test_finance.py b/tests/test_finance.py index 05ba89b0..b9f831db 100644 --- a/tests/test_finance.py +++ b/tests/test_finance.py @@ -60,6 +60,8 @@ _multiprocess_can_split_ = False class FinanceTestCase(TestCase): def setUp(self): + trading.environment = trading.TradingEnvironment() + trading.environment.write_data(equities_identifiers=[1, 133]) self.zipline_test_config = { 'sid': 133, } @@ -92,6 +94,7 @@ class FinanceTestCase(TestCase): # No transactions can be filled on the first trade, so # we have one extra trade to ensure all orders are filled. self.zipline_test_config['trade_count'] = 101 + trading.environment = trading.TradingEnvironment() full_zipline = simfactory.create_test_zipline( **self.zipline_test_config) assert_single_position(self, full_zipline) diff --git a/tests/test_history.py b/tests/test_history.py index 5a515e23..2b77ac00 100644 --- a/tests/test_history.py +++ b/tests/test_history.py @@ -28,6 +28,7 @@ from zipline.history.history_container import HistoryContainer from zipline.protocol import BarData import zipline.utils.factory as factory from zipline import TradingAlgorithm +from zipline.finance import trading from zipline.finance.trading import ( SimulationParameters, TradingEnvironment, @@ -404,6 +405,12 @@ class TestHistoryContainer(TestCase): class TestHistoryAlgo(TestCase): + + @classmethod + def setUpClass(cls): + cls.env = trading.TradingEnvironment() + cls.env.write_data(equities_identifiers=[0, 1]) + def setUp(self): np.random.seed(123) @@ -442,7 +449,8 @@ def handle_data(context, data): test_algo = TradingAlgorithm( script=algo_text, data_frequency='daily', - sim_params=sim_params + sim_params=sim_params, + env=TestHistoryAlgo.env, ) output = test_algo.run(source) @@ -475,7 +483,8 @@ def handle_data(context, data): algo = TradingAlgorithm( script=algo_text, data_frequency='daily', - sim_params=sim_params + sim_params=sim_params, + env=TestHistoryAlgo.env, ) source = RandomWalkSource(start=start, end=end) algo.run(source) @@ -510,7 +519,7 @@ def handle_data(context, data): script=algo_text, data_frequency='minute', sim_params=sim_params, - identifiers=[0] + env=TestHistoryAlgo.env, ) source = RandomWalkSource(start=start, @@ -560,7 +569,8 @@ def handle_data(context, data): test_algo = TradingAlgorithm( script=algo_text, data_frequency='minute', - sim_params=sim_params + sim_params=sim_params, + env=TestHistoryAlgo.env, ) source = RandomWalkSource(start=start, @@ -616,7 +626,8 @@ def handle_data(context, data): test_algo = TradingAlgorithm( script=algo_text, data_frequency='minute', - sim_params=sim_params + sim_params=sim_params, + env=TestHistoryAlgo.env, ) source = RandomWalkSource(start=start, @@ -671,7 +682,8 @@ def handle_data(context, data): test_algo = TradingAlgorithm( script=algo_text, data_frequency='minute', - sim_params=sim_params + sim_params=sim_params, + env=TestHistoryAlgo.env, ) source = RandomWalkSource(start=start, @@ -716,7 +728,8 @@ def handle_data(context, data): test_algo = TradingAlgorithm( script=algo_text, data_frequency='minute', - sim_params=sim_params + sim_params=sim_params, + env=TestHistoryAlgo.env, ) source = RandomWalkSource(start=start, @@ -761,7 +774,8 @@ def handle_data(context, data): test_algo = TradingAlgorithm( script=algo_text, data_frequency='minute', - sim_params=sim_params + sim_params=sim_params, + env=TestHistoryAlgo.env, ) source = RandomWalkSource(start=start, @@ -806,7 +820,8 @@ def handle_data(context, data): test_algo = TradingAlgorithm( script=algo_text, data_frequency='minute', - sim_params=sim_params + sim_params=sim_params, + env=TestHistoryAlgo.env, ) source = RandomWalkSource(start=start, @@ -856,7 +871,8 @@ def handle_data(context, data): test_algo = TradingAlgorithm( script=algo_text, data_frequency='minute', - sim_params=sim_params + sim_params=sim_params, + env=TestHistoryAlgo.env, ) source = RandomWalkSource(start=start, @@ -915,7 +931,8 @@ def handle_data(context, data): test_algo = TradingAlgorithm( script=algo_text, data_frequency='minute', - sim_params=sim_params + sim_params=sim_params, + env=TestHistoryAlgo.env, ) source = RandomWalkSource(start=start, @@ -957,7 +974,8 @@ def handle_data(context, data): test_algo = TradingAlgorithm( script=algo_text, data_frequency=data_freq, - sim_params=sim_params + sim_params=sim_params, + env=TestHistoryAlgo.env, ) source = RandomWalkSource(start=start, end=end, freq=data_freq) @@ -1027,7 +1045,8 @@ def handle_data(context, data): test_algo = TradingAlgorithm( script=algo_text, data_frequency='minute', - sim_params=sim_params + sim_params=sim_params, + env=TestHistoryAlgo.env, ) test_algo.test_case = self @@ -1076,7 +1095,8 @@ def handle_data(context, data): test_algo = TradingAlgorithm( script=algo_text, data_frequency='minute', - sim_params=sim_params + sim_params=sim_params, + env=TestHistoryAlgo.env, ) test_algo.test_case = self diff --git a/tests/test_perf_tracking.py b/tests/test_perf_tracking.py index c04dc57e..f4468ced 100644 --- a/tests/test_perf_tracking.py +++ b/tests/test_perf_tracking.py @@ -41,6 +41,7 @@ from zipline.finance.slippage import Transaction, create_transaction import zipline.utils.math_utils as zp_math from zipline.gens.composites import date_sorted_sources +from zipline.finance import trading from zipline.finance.trading import SimulationParameters from zipline.finance.blotter import Order from zipline.finance.commission import PerShare, PerTrade, PerDollar @@ -261,7 +262,7 @@ class TestSplitPerformance(unittest.TestCase): def setUp(self): self.sim_params, self.dt, self.end_dt = \ create_random_simulation_parameters() - + trading.environment.write_data(equities_identifiers=[1]) # start with $10,000 self.sim_params.capital_base = 10e3 @@ -362,6 +363,8 @@ class TestCommissionEvents(unittest.TestCase): self.sim_params, self.dt, self.end_dt = \ create_random_simulation_parameters() + trading.environment.write_data(equities_identifiers=[0, 1, 133]) + logger.info("sim_params: %s, dt: %s, end_dt: %s" % (self.sim_params, self.dt, self.end_dt)) @@ -502,7 +505,7 @@ class TestDividendPerformance(unittest.TestCase): self.sim_params, self.dt, self.end_dt = \ create_random_simulation_parameters() - + trading.environment.write_data(equities_identifiers=[1, 2]) self.sim_params.capital_base = 10e3 self.benchmark_events = benchmark_events_in_range(self.sim_params) @@ -937,6 +940,7 @@ class TestPositionPerformance(unittest.TestCase): self.sim_params, self.dt, self.end_dt = \ create_random_simulation_parameters() + trading.environment.write_data(equities_identifiers=[1, 2]) self.benchmark_events = benchmark_events_in_range(self.sim_params) def test_long_short_positions(self): @@ -1689,6 +1693,10 @@ shares in position" class TestPerformanceTracker(unittest.TestCase): + def setUp(self): + trading.environment = trading.TradingEnvironment() + trading.environment.write_data(equities_identifiers=[133, 134]) + NumDaysToDelete = collections.namedtuple( 'NumDaysToDelete', ('start', 'middle', 'end')) @@ -1726,6 +1734,8 @@ class TestPerformanceTracker(unittest.TestCase): # 12 13 14 15 16 17 18 # 19 20 21 22 23 24 25 # 26 27 28 29 30 31 + trading.environment = trading.TradingEnvironment() + trading.environment.write_data(equities_identifiers=[133, 134]) start_dt = datetime(year=2008, month=10, day=9, @@ -2097,8 +2107,9 @@ class TestPosition(unittest.TestCase): class TestPositionTracker(unittest.TestCase): + def setUp(self): - pass + trading.environment = trading.TradingEnvironment() def test_empty_positions(self): """ @@ -2127,13 +2138,12 @@ class TestPositionTracker(unittest.TestCase): self.assertEquals(val, 0) self.assertNotIsInstance(val, (bool, np.bool_)) - @with_environment() def test_update_last_sale(self, env=None): - metadata = {1: {'asset_type': 'equity'}, - 2: {'asset_type': 'future', - 'contract_multiplier': 1000}} - asset_finder = AssetFinder() - env.write_data(equities_data=metadata) + equities_metadata = {1: {'asset_type': 'equity'}} + futures_metadata = {2: {'asset_type': 'future', + 'contract_multiplier': 1000}} + trading.environment.write_data(equities_data=equities_metadata, + futures_data=futures_metadata) pt = perf.PositionTracker() dt = pd.Timestamp("1984/03/06 3:00PM") pos1 = perf.Position(1, amount=np.float64(100.0), @@ -2153,15 +2163,15 @@ class TestPositionTracker(unittest.TestCase): self.assertEqual(0, pt.update_last_sale(event1)) self.assertEqual(100000, pt.update_last_sale(event2)) - @with_environment() def test_position_values_and_exposures(self, env=None): - metadata = {1: {'asset_type': 'equity'}, - 2: {'asset_type': 'equity'}, - 3: {'asset_type': 'future', - 'contract_multiplier': 1000}, - 4: {'asset_type': 'future', - 'contract_multiplier': 1000}} - env.write_data(equities_data=metadata) + equities_metadata = {1: {'asset_type': 'equity'}, + 2: {'asset_type': 'equity'}} + futures_metadata = {3: {'asset_type': 'future', + 'contract_multiplier': 1000}, + 4: {'asset_type': 'future', + 'contract_multiplier': 1000}} + trading.environment.write_data(equities_data=equities_metadata, + futures_data=futures_metadata) pt = perf.PositionTracker() dt = pd.Timestamp("1984/03/06 3:00PM") pos1 = perf.Position(1, amount=np.float64(10.0), @@ -2190,12 +2200,11 @@ class TestPositionTracker(unittest.TestCase): self.assertEqual(100 + 200 + 300000 + 400000, pt._gross_exposure()) self.assertEqual(100 - 200 + 300000 - 400000, pt._net_exposure()) - @with_environment() def test_serialization(self, env=None): metadata = {1: {'asset_type': 'equity'}, 2: {'asset_type': 'future', 'contract_multiplier': 1000}} - env.write_data(equities_data=metadata) + trading.environment.write_data(equities_data=metadata) pt = perf.PositionTracker() dt = pd.Timestamp("1984/03/06 3:00PM") pos1 = perf.Position(1, amount=np.float64(120.0), diff --git a/tests/test_security_list.py b/tests/test_security_list.py index 00b6a08a..4fb354db 100644 --- a/tests/test_security_list.py +++ b/tests/test_security_list.py @@ -6,9 +6,10 @@ from unittest import TestCase from zipline.algorithm import TradingAlgorithm from zipline.errors import TradingControlViolation from zipline.sources import SpecificEquityTrades +from zipline.finance import trading from zipline.finance.trading import with_environment from zipline.utils.test_utils import ( - setup_logger, teardown_logger, security_list_copy, add_security_data) + setup_logger, teardown_logger, security_list_copy, add_security_data,) from zipline.utils import factory from zipline.utils.security_list import ( SecurityListSet, load_from_directory) @@ -59,26 +60,24 @@ class IterateRLAlgo(TradingAlgorithm): class SecurityListTestCase(TestCase): - @with_environment() def setUp(self, env=None): + self.extra_knowledge_date = \ datetime(2015, 1, 27, 0, 0, tzinfo=pytz.utc) self.trading_day_before_first_kd = datetime( 2015, 1, 23, 0, 0, tzinfo=pytz.utc) - env.write_data( - equities_identifiers=["BZQ", "URTY", "JFT", "AAPL", "GOOG"] - ) - setup_logger(self) + trading.environment = trading.TradingEnvironment() + def tearDown(self): teardown_logger(self) def test_iterate_over_rl(self): sim_params = factory.create_simulation_parameters( start=list(LEVERAGED_ETFS.keys())[0], num_days=4) - + trading.environment.write_data(equities_identifiers=['BZQ']) trade_history = factory.create_trade_history( 'BZQ', [10.0, 10.0, 11.0, 11.0], @@ -99,6 +98,9 @@ class SecurityListTestCase(TestCase): def get_datetime(): return list(LEVERAGED_ETFS.keys())[0] + env.write_data(equities_identifiers=['AAPL', 'GOOG', 'BZQ', + 'URTY', 'JFT']) + rl = SecurityListSet(get_datetime) # assert that a sample from the leveraged list are in restricted should_exist = [ @@ -128,6 +130,8 @@ class SecurityListTestCase(TestCase): return datetime(2015, 1, 27, tzinfo=pytz.utc) with security_list_copy(): add_security_data(['AAPL', 'GOOG'], []) + env.write_data(equities_identifiers=['AAPL', 'GOOG', + 'BZQ', 'URTY']) rl = SecurityListSet(get_datetime) should_exist = [ asset.sid for asset in @@ -143,7 +147,8 @@ class SecurityListTestCase(TestCase): with security_list_copy(): def get_datetime(): return datetime(2015, 1, 27, tzinfo=pytz.utc) - add_security_data([], ['BZQ', 'URTY']) + trading.environment.write_data(equities_identifiers=['BZQ', + 'URTY']) rl = SecurityListSet(get_datetime) self.assertNotIn("BZQ", rl.leveraged_etf_list) self.assertNotIn("URTY", rl.leveraged_etf_list) @@ -151,7 +156,7 @@ class SecurityListTestCase(TestCase): def test_algo_without_rl_violation_via_check(self): sim_params = factory.create_simulation_parameters( start=list(LEVERAGED_ETFS.keys())[0], num_days=4) - + trading.environment.write_data(equities_identifiers=['BZQ']) trade_history = factory.create_trade_history( 'BZQ', [10.0, 10.0, 11.0, 11.0], @@ -167,7 +172,7 @@ class SecurityListTestCase(TestCase): def test_algo_without_rl_violation(self): sim_params = factory.create_simulation_parameters( start=list(LEVERAGED_ETFS.keys())[0], num_days=4) - + trading.environment.write_data(equities_identifiers=['AAPL']) trade_history = factory.create_trade_history( 'AAPL', [10.0, 10.0, 11.0, 11.0], @@ -182,7 +187,7 @@ class SecurityListTestCase(TestCase): def test_algo_with_rl_violation(self): sim_params = factory.create_simulation_parameters( start=list(LEVERAGED_ETFS.keys())[0], num_days=4) - + trading.environment.write_data(equities_identifiers=['BZQ', 'JFT']) trade_history = factory.create_trade_history( 'BZQ', [10.0, 10.0, 11.0, 11.0], @@ -199,7 +204,6 @@ class SecurityListTestCase(TestCase): self.check_algo_exception(algo, ctx, 0) # repeat with a symbol from a different lookup date - trade_history = factory.create_trade_history( 'JFT', [10.0, 10.0, 11.0, 11.0], @@ -219,7 +223,7 @@ class SecurityListTestCase(TestCase): sim_params = factory.create_simulation_parameters( start=list( LEVERAGED_ETFS.keys())[0] + timedelta(days=7), num_days=5) - + trading.environment.write_data(equities_identifiers=['BZQ']) trade_history = factory.create_trade_history( 'BZQ', [10.0, 10.0, 11.0, 11.0], @@ -253,6 +257,7 @@ class SecurityListTestCase(TestCase): timedelta(days=1), sim_params ) + trading.environment.write_data(equities_identifiers=['BZQ']) self.source = SpecificEquityTrades(event_list=trade_history) algo = RestrictedAlgoWithoutCheck( symbol='BZQ', sim_params=sim_params) @@ -266,9 +271,10 @@ class SecurityListTestCase(TestCase): # add a delete statement removing bzq # write a new delete statement file to disk add_security_data([], ['BZQ']) - sim_params = factory.create_simulation_parameters( start=self.extra_knowledge_date, num_days=3) + trading.environment.write_data(equities_identifiers=['BZQ']) + trade_history = factory.create_trade_history( 'BZQ', [10.0, 10.0, 11.0, 11.0], @@ -287,6 +293,7 @@ class SecurityListTestCase(TestCase): add_security_data(['AAPL'], []) sim_params = factory.create_simulation_parameters( start=self.trading_day_before_first_kd, num_days=4) + trading.environment.write_data(equities_identifiers=['AAPL']) trade_history = factory.create_trade_history( 'AAPL', [10.0, 10.0, 11.0, 11.0], diff --git a/tests/test_sources.py b/tests/test_sources.py index 3c330b3b..f4dd8114 100644 --- a/tests/test_sources.py +++ b/tests/test_sources.py @@ -12,9 +12,10 @@ # 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. +import numpy as np import pandas as pd import pytz -import numpy as np + from six import integer_types @@ -26,6 +27,7 @@ from zipline.sources import (DataFrameSource, RandomWalkSource) from zipline.utils import tradingcalendar as calendar_nyse from zipline.assets import AssetFinder +from zipline.finance import trading class TestDataFrameSource(TestCase): @@ -63,15 +65,16 @@ class TestDataFrameSource(TestCase): self.assertTrue(isinstance(event['arbitrary'], float)) def test_yahoo_bars_to_panel_source(self): - finder = AssetFinder() + trading.environment = trading.TradingEnvironment() + finder = AssetFinder(trading.environment.engine) stocks = ['AAPL', 'GE'] + trading.environment.write_data(equities_identifiers=stocks) start = pd.datetime(1993, 1, 1, 0, 0, 0, 0, pytz.utc) end = pd.datetime(2002, 1, 1, 0, 0, 0, 0, pytz.utc) data = factory.load_bars_from_yahoo(stocks=stocks, indexes={}, start=start, end=end) - check_fields = ['sid', 'open', 'high', 'low', 'close', 'volume', 'price'] diff --git a/tests/test_transforms.py b/tests/test_transforms.py index cedd2106..4d882d22 100644 --- a/tests/test_transforms.py +++ b/tests/test_transforms.py @@ -25,6 +25,7 @@ from unittest import TestCase import numpy as np from numpy.testing import assert_allclose +from zipline.finance.trading import TradingEnvironment from zipline.algorithm import TradingAlgorithm import zipline.utils.factory as factory from zipline.api import add_transform, get_datetime @@ -102,7 +103,6 @@ def with_algo(f): initialize=initialize_with(self, tfm_name, days), handle_data=handle_data_wrapper(f), sim_params=sim_params, - identifiers=[1, 2, 3] ) algo.run(source) @@ -117,7 +117,6 @@ class TransformTestCase(TestCase): def setUpClass(cls): random.seed(0) cls.sids = (1, 2, 3) - minute_sim_ps = factory.create_simulation_parameters( num_days=3, data_frequency='minute', @@ -128,6 +127,8 @@ class TransformTestCase(TestCase): data_frequency='daily', emission_rate='daily', ) + cls.env = TradingEnvironment.instance() + cls.env.write_data(equities_identifiers=[1, 2, 3]) cls.sim_and_source = { 'minute': (minute_sim_ps, factory.create_minutely_trade_source( cls.sids,