mirror of
https://github.com/wassname/catalyst.git
synced 2026-06-29 09:37:54 +08:00
Merge pull request #890 from grundgruen/future_chain_order
BUG: orders future chain by min of notice and expiry
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
))
|
||||
|
||||
Reference in New Issue
Block a user