diff --git a/tests/test_assets.py b/tests/test_assets.py index 11b92d31..a619283b 100644 --- a/tests/test_assets.py +++ b/tests/test_assets.py @@ -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 diff --git a/zipline/assets/assets.py b/zipline/assets/assets.py index 149cb8c9..9e0489e7 100644 --- a/zipline/assets/assets.py +++ b/zipline/assets/assets.py @@ -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() ))