Merge pull request #890 from grundgruen/future_chain_order

BUG: orders future chain by min of notice and expiry
This commit is contained in:
James Kirk
2016-01-21 11:18:57 -05:00
2 changed files with 18 additions and 8 deletions
+5 -5
View File
@@ -727,14 +727,14 @@ class AssetFinderTestCase(TestCase):
0: {
'symbol': 'ADN15',
'root_symbol': 'AD',
'notice_date': pd.Timestamp('2015-05-14', tz='UTC'),
'expiration_date': pd.Timestamp('2015-06-14', tz='UTC'),
'notice_date': pd.Timestamp('2015-06-14', tz='UTC'),
'expiration_date': pd.Timestamp('2015-08-14', tz='UTC'),
'start_date': pd.Timestamp('2015-01-01', tz='UTC')
},
1: {
'symbol': 'ADV15',
'root_symbol': 'AD',
'notice_date': pd.Timestamp('2015-08-14', tz='UTC'),
'notice_date': pd.Timestamp('2015-05-14', tz='UTC'),
'expiration_date': pd.Timestamp('2015-09-14', tz='UTC'),
'start_date': pd.Timestamp('2015-01-01', tz='UTC')
},
@@ -781,8 +781,8 @@ class AssetFinderTestCase(TestCase):
# right order
ad_contracts = finder.lookup_future_chain('AD', dt)
self.assertEqual(len(ad_contracts), 6)
self.assertEqual(ad_contracts[0].sid, 0)
self.assertEqual(ad_contracts[1].sid, 1)
self.assertEqual(ad_contracts[0].sid, 1)
self.assertEqual(ad_contracts[1].sid, 0)
self.assertEqual(ad_contracts[5].sid, 5)
# Check that, when some contracts have expired, the chain has advanced
+13 -3
View File
@@ -631,16 +631,26 @@ class AssetFinder(object):
)
)
).order_by(
# Sort using expiration_date if valid. If it's NaT,
# use notice_date instead.
# If both dates exist sort using minimum of
# expiration_date and notice_date
# else if one is NaT use the other.
sa.case(
[
(
fc_cols.expiration_date == pd.NaT.value,
fc_cols.notice_date
),
(
fc_cols.notice_date == pd.NaT.value,
fc_cols.expiration_date
)
],
else_=fc_cols.expiration_date
else_=(
sa.func.min(
fc_cols.notice_date,
fc_cols.expiration_date
)
)
).asc()
).execute().fetchall()
))