Merge pull request #941 from quantopian/futures-tick-size

ENH: Adds tick_size and renames futures multiplier
This commit is contained in:
James Kirk
2016-01-25 11:18:31 -05:00
15 changed files with 195 additions and 37 deletions
+2 -2
View File
@@ -649,7 +649,7 @@ class TestTransformAlgorithm(TestCase):
cls.env = TradingEnvironment()
cls.env.write_data(equities_identifiers=[0, 1, 133])
futures_metadata = {0: {'contract_multiplier': 10}}
futures_metadata = {0: {'multiplier': 10}}
cls.futures_env = TradingEnvironment()
cls.futures_env.write_data(futures_data=futures_metadata)
@@ -1916,7 +1916,7 @@ class TestFutureFlip(TestCase):
def test_flip_algo(self):
metadata = {1: {'symbol': 'TEST',
'end_date': self.days[3],
'contract_multiplier': 5}}
'multiplier': 5}}
self.env.write_data(futures_data=metadata)
algo = FutureFlipAlgo(sid=1, amount=1, env=self.env,
+38 -7
View File
@@ -50,11 +50,15 @@ from zipline.assets.futures import (
from zipline.assets.asset_writer import (
check_version_info,
write_version_info,
_futures_defaults,
)
from zipline.assets.asset_db_schema import (
ASSET_DB_VERSION,
_version_table_schema,
)
from zipline.assets.asset_db_migrations import (
downgrade
)
from zipline.errors import (
EquitiesNotFound,
FutureContractsNotFound,
@@ -64,6 +68,7 @@ from zipline.errors import (
SidAssignmentError,
SidsNotFound,
SymbolNotFound,
AssetDBImpossibleDowngrade,
)
from zipline.finance.trading import TradingEnvironment, noop_load
from zipline.utils.test_utils import (
@@ -280,7 +285,8 @@ class TestFuture(TestCase):
notice_date=pd.Timestamp('2014-01-20', tz='UTC'),
expiration_date=pd.Timestamp('2014-02-20', tz='UTC'),
auto_close_date=pd.Timestamp('2014-01-18', tz='UTC'),
contract_multiplier=500
tick_size=.01,
multiplier=500
)
cls.future2 = Future(
0,
@@ -311,7 +317,8 @@ class TestFuture(TestCase):
in reprd)
self.assertTrue("auto_close_date=Timestamp('2014-01-18 00:00:00+0000'"
in reprd)
self.assertTrue("contract_multiplier=500" in reprd)
self.assertTrue("tick_size=0.01" in reprd)
self.assertTrue("multiplier=500" in reprd)
def test_reduce(self):
reduced = self.future.__reduce__()
@@ -319,11 +326,8 @@ class TestFuture(TestCase):
def test_to_and_from_dict(self):
dictd = self.future.to_dict()
self.assertTrue('root_symbol' in dictd)
self.assertTrue('notice_date' in dictd)
self.assertTrue('expiration_date' in dictd)
self.assertTrue('auto_close_date' in dictd)
self.assertTrue('contract_multiplier' in dictd)
for field in _futures_defaults.keys():
self.assertTrue(field in dictd)
from_dict = Future.from_dict(dictd)
self.assertTrue(isinstance(from_dict, Future))
@@ -1362,3 +1366,30 @@ class TestAssetDBVersioning(TestCase):
# Now that the versions match, this Finder should succeed
AssetFinder(engine=env.engine)
def test_downgrade(self):
# Attempt to downgrade a current assets db all the way down to v0
env = TradingEnvironment(load=noop_load)
conn = env.engine.connect()
downgrade(env.engine, 0)
# Verify that the db version is now 0
metadata = sa.MetaData(conn)
metadata.reflect(bind=env.engine)
version_table = metadata.tables['version_info']
check_version_info(version_table, 0)
# Check some of the v1-to-v0 downgrades
self.assertTrue('futures_contracts' in metadata.tables)
self.assertTrue('version_info' in metadata.tables)
self.assertFalse('tick_size' in
metadata.tables['futures_contracts'].columns)
self.assertTrue('contract_multiplier' in
metadata.tables['futures_contracts'].columns)
def test_impossible_downgrade(self):
# Attempt to downgrade a current assets db to a
# higher-than-current version
env = TradingEnvironment(load=noop_load)
with self.assertRaises(AssetDBImpossibleDowngrade):
downgrade(env.engine, ASSET_DB_VERSION + 5)
+3 -3
View File
@@ -1007,7 +1007,7 @@ class TestPositionPerformance(unittest.TestCase):
cls.env = TradingEnvironment()
# Sids 1 and 2 are equities, Sid 3 is a future
cls.env.write_data(equities_identifiers=[1, 2],
futures_data={3: {'contract_multiplier': 100}})
futures_data={3: {'multiplier': 100}})
@classmethod
def tearDownClass(cls):
@@ -2551,8 +2551,8 @@ class TestPositionTracker(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.env = TradingEnvironment()
futures_metadata = {3: {'contract_multiplier': 1000},
4: {'contract_multiplier': 1000}}
futures_metadata = {3: {'multiplier': 1000},
4: {'multiplier': 1000}}
cls.env.write_data(equities_identifiers=[1, 2],
futures_data=futures_metadata)