diff --git a/zipline/utils/security_list.py b/zipline/utils/security_list.py index 4de9dbaf..0cb24a4b 100644 --- a/zipline/utils/security_list.py +++ b/zipline/utils/security_list.py @@ -1,11 +1,13 @@ -import os.path -import pytz -import pandas as pd from datetime import datetime from os import listdir +import os.path + +import pandas as pd +import pytz +import zipline + DATE_FORMAT = "%Y%m%d" -import zipline zipline_dir = os.path.join(*zipline.__path__) SECURITY_LISTS_DIR = os.path.join(zipline_dir, 'resources', 'security_lists') @@ -14,27 +16,6 @@ def loopback(symbol, *args, **kwargs): return symbol -class SecurityListSet(object): - - def __init__(self, current_date_func, lookup_func=None): - if lookup_func is None: - self.lookup_func = loopback - else: - self.lookup_func = lookup_func - self.current_date_func = current_date_func - self._leveraged_etf = None - - @property - def leveraged_etf_list(self): - if self._leveraged_etf is None: - self._leveraged_etf = SecurityList( - self.lookup_func, - load_from_directory('leveraged_etf_list'), - self.current_date_func - ) - return self._leveraged_etf - - class SecurityList(object): def __init__(self, lookup_func, data, current_date_func): @@ -102,6 +83,30 @@ class SecurityList(object): change_func(sid) +class SecurityListSet(object): + # provide a cut point to substitute other security + # list implementations. + security_list_type = SecurityList + + def __init__(self, current_date_func, lookup_func=None): + if lookup_func is None: + self.lookup_func = loopback + else: + self.lookup_func = lookup_func + self.current_date_func = current_date_func + self._leveraged_etf = None + + @property + def leveraged_etf_list(self): + if self._leveraged_etf is None: + self._leveraged_etf = self.security_list_type( + self.lookup_func, + load_from_directory('leveraged_etf_list'), + self.current_date_func + ) + return self._leveraged_etf + + def load_from_directory(list_name): """ To resolve the symbol in the LEVERAGED_ETF list,