mirror of
https://github.com/wassname/catalyst.git
synced 2026-06-30 03:45:15 +08:00
ENH: Add futures support for generic asset lookup.
Attempt to lookup up the symbol in the futures table, after attempting to look up the symbol in the equities table.
This commit is contained in:
+35
-3
@@ -102,7 +102,7 @@ def build_lookup_generic_cases(asset_finder_type):
|
||||
dupe_1_start = pd.Timestamp('2013-01-03', tz='UTC')
|
||||
dupe_1_end = dupe_1_start + timedelta(days=1)
|
||||
|
||||
frame = pd.DataFrame.from_records(
|
||||
equities = pd.DataFrame.from_records(
|
||||
[
|
||||
{
|
||||
'sid': 0,
|
||||
@@ -126,13 +126,30 @@ def build_lookup_generic_cases(asset_finder_type):
|
||||
'exchange': 'TEST',
|
||||
},
|
||||
],
|
||||
index='sid')
|
||||
with tmp_assets_db(equities=frame) as assets_db:
|
||||
index='sid'
|
||||
)
|
||||
|
||||
fof14_sid = 10000
|
||||
|
||||
futures = pd.DataFrame.from_records(
|
||||
[
|
||||
{
|
||||
'sid': fof14_sid,
|
||||
'symbol': 'FOF14',
|
||||
'start_date': unique_start.value,
|
||||
'end_date': unique_end.value,
|
||||
'exchange': 'FUT',
|
||||
},
|
||||
],
|
||||
index='sid'
|
||||
)
|
||||
with tmp_assets_db(equities=equities, futures=futures) as assets_db:
|
||||
finder = asset_finder_type(assets_db)
|
||||
dupe_0, dupe_1, unique = assets = [
|
||||
finder.retrieve_asset(i)
|
||||
for i in range(3)
|
||||
]
|
||||
fof14 = finder.retrieve_asset(fof14_sid)
|
||||
|
||||
dupe_0_start = dupe_0.start_date
|
||||
dupe_1_start = dupe_1.start_date
|
||||
@@ -155,6 +172,18 @@ def build_lookup_generic_cases(asset_finder_type):
|
||||
(finder, 'UNIQUE', unique_start, unique),
|
||||
(finder, 'UNIQUE', None, unique),
|
||||
|
||||
# Futures
|
||||
(finder, 'FOF14', None, fof14),
|
||||
# Future symbols should be unique, but including as_of date
|
||||
# make sure that code path is exercised.
|
||||
(finder, 'FOF14', unique_start, fof14),
|
||||
|
||||
# Futures int
|
||||
(finder, fof14_sid, None, fof14),
|
||||
# Future symbols should be unique, but including as_of date
|
||||
# make sure that code path is exercised.
|
||||
(finder, fof14_sid, unique_start, fof14),
|
||||
|
||||
##
|
||||
# Iterables
|
||||
|
||||
@@ -172,6 +201,9 @@ def build_lookup_generic_cases(asset_finder_type):
|
||||
('DUPLICATED', 2, 'UNIQUE', 1, dupe_1),
|
||||
dupe_0_start,
|
||||
[dupe_0, assets[2], unique, assets[1], dupe_1]),
|
||||
|
||||
# Futures and Equities
|
||||
(finder, ['FOF14', 0], None, [fof14, assets[0]]),
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -1081,6 +1081,24 @@ class AssetFinder(object):
|
||||
)
|
||||
del _make_sids
|
||||
|
||||
@lazyval
|
||||
def _symbol_lookups(self):
|
||||
"""
|
||||
An iterable of symbol lookup functions to use with ``lookup_generic``
|
||||
|
||||
Attempts equities lookup, then futures.
|
||||
"""
|
||||
return (
|
||||
self.lookup_symbol,
|
||||
# lookup_future_symbol method does not use as_of date, since
|
||||
# symbols are unique.
|
||||
#
|
||||
# Wrap the function in a lambda so that both methods share a
|
||||
# signature, so that when the functions are iterated over
|
||||
# the consumer can use the same arguments with both methods.
|
||||
lambda symbol, _: self.lookup_future_symbol(symbol)
|
||||
)
|
||||
|
||||
def _lookup_generic_scalar(self,
|
||||
asset_convertible,
|
||||
as_of_date,
|
||||
@@ -1104,11 +1122,13 @@ class AssetFinder(object):
|
||||
matches.append(result)
|
||||
|
||||
elif isinstance(asset_convertible, string_types):
|
||||
try:
|
||||
matches.append(
|
||||
self.lookup_symbol(asset_convertible, as_of_date)
|
||||
)
|
||||
except SymbolNotFound:
|
||||
for lookup in self._symbol_lookups:
|
||||
try:
|
||||
matches.append(lookup(asset_convertible, as_of_date))
|
||||
return
|
||||
except SymbolNotFound:
|
||||
continue
|
||||
else:
|
||||
missing.append(asset_convertible)
|
||||
return None
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user