class WithInternationalDailyBarData(zf.WithAssetFinder): """ Fixture for generating international daily bars. Eventually this should be moved into zipline.testing.fixtures and should replace most of the existing machinery """ DAILY_BAR_START_DATE = zf.alias("START_DATE") DAILY_BAR_END_DATE = zf.alias("END_DATE") DAILY_BAR_LOOKBACK_DAYS = 0 INTERNATIONAL_PRICING_STARTING_PRICES = { "XNYS": 100, # NYSE "XTSE": 50, # Toronto Stock Exchange "XLON": 25, # London Stock Exchange } # Assets in these countries will be quoted in one of the listed currencies. INTERNATIONAL_PRICING_CURRENCIES = { "XNYS": ["USD"], "XTSE": ["CAD"], "XLON": ["GBP", "EUR", "USD"], } assert (INTERNATIONAL_PRICING_STARTING_PRICES.keys() == INTERNATIONAL_PRICING_CURRENCIES.keys()) FX_RATES_CURRENCIES = ["USD", "CAD", "GBP", "EUR"] @classmethod def make_daily_bar_data(cls, assets, calendar, sessions): # Generate prices corresponding to uniform random returns with a slight # positive tendency. start = cls.INTERNATIONAL_PRICING_STARTING_PRICES[calendar.name] closes = random_tick_prices(start, len(sessions)) opens = closes - 0.05 highs = closes + 0.10 lows = closes - 0.10 volumes = np.arange(10000, 10000 + len(closes)) base_frame = pd.DataFrame( { "close": closes, "open": opens, "high": highs, "low": lows, "volume": volumes, }, index=sessions, ) for asset in assets: sid = asset.sid yield sid, base_frame + sid @classmethod def make_currency_codes(cls, calendar, assets): currencies = cls.INTERNATIONAL_PRICING_CURRENCIES[calendar.name] return pd.Series(index=assets, data=list(islice(cycle(currencies), len(assets)))) @classmethod def init_class_fixtures(cls): super(WithInternationalDailyBarData, cls).init_class_fixtures() cls.daily_bar_sessions = {} cls.daily_bar_data = {} cls.daily_bar_readers = {} cls.daily_bar_currency_codes = {} for ( calendar, assets, ) in cls.assets_by_calendar.items(): name = calendar.name start_delta = cls.DAILY_BAR_LOOKBACK_DAYS * calendar.day start_session = cls.DAILY_BAR_START_DATE - start_delta sessions = calendar.sessions_in_range( start_session, cls.DAILY_BAR_END_DATE, ) cls.daily_bar_sessions[name] = sessions cls.daily_bar_data[name] = dict( cls.make_daily_bar_data( assets=assets, calendar=calendar, sessions=sessions, )) bar_data = cls.daily_bar_data[name] df = (pd.concat( bar_data, keys=bar_data.keys()).stack().unstack(0).swaplevel()) frames = { field: frame.reset_index(level=0, drop=True) for field, frame in df.groupby(level=0) } # panel = (pd.Panel.from_dict(cls.daily_bar_data[name]) # .transpose(2, 1, 0)) cls.daily_bar_currency_codes[name] = cls.make_currency_codes( calendar, assets, ) cls.daily_bar_readers[name] = InMemoryDailyBarReader( frames=frames, calendar=calendar, currency_codes=cls.daily_bar_currency_codes[name], )
class TestDataPortalExplicitLastAvailable(DataPortalTestBase, ZiplineTestCase): DATA_PORTAL_LAST_AVAILABLE_SESSION = alias("START_DATE") DATA_PORTAL_LAST_AVAILABLE_MINUTE = alias("END_DATE")
class TestDataPortalExplicitLastAvailable(DataPortalTestBase): DATA_PORTAL_LAST_AVAILABLE_SESSION = alias('START_DATE') DATA_PORTAL_LAST_AVAILABLE_MINUTE = alias('END_DATE')
class WithInternationalDailyBarData(zf.WithAssetFinder): """ Fixture for generating international daily bars. Eventually this should be moved into zipline.testing.fixtures and should replace most of the existing machinery """ DAILY_BAR_START_DATE = zf.alias('START_DATE') DAILY_BAR_END_DATE = zf.alias('END_DATE') DAILY_BAR_LOOKBACK_DAYS = 0 INTERNATIONAL_PRICING_STARTING_PRICES = { 'XNYS': 100, # NYSE 'XTSE': 50, # Toronto Stock Exchange 'XLON': 25, # London Stock Exchange } # Assets in these countries will be quoted in one of the listed currencies. INTERNATIONAL_PRICING_CURRENCIES = { 'XNYS': ['USD'], 'XTSE': ['CAD'], 'XLON': ['GBP', 'EUR', 'USD'], } assert (INTERNATIONAL_PRICING_STARTING_PRICES.keys() == INTERNATIONAL_PRICING_CURRENCIES.keys()) FX_RATES_CURRENCIES = ["USD", "CAD", "GBP", "EUR"] @classmethod def make_daily_bar_data(cls, assets, calendar, sessions): # Generate prices corresponding to uniform random returns with a slight # positive tendency. start = cls.INTERNATIONAL_PRICING_STARTING_PRICES[calendar.name] closes = random_tick_prices(start, len(sessions)) opens = closes - 0.05 highs = closes + 0.10 lows = closes - 0.10 volumes = np.arange(10000, 10000 + len(closes)) base_frame = pd.DataFrame( { 'close': closes, 'open': opens, 'high': highs, 'low': lows, 'volume': volumes, }, index=sessions) for asset in assets: sid = asset.sid yield sid, base_frame + sid @classmethod def make_currency_codes(cls, calendar, assets): currencies = cls.INTERNATIONAL_PRICING_CURRENCIES[calendar.name] return pd.Series(index=assets, data=list(islice(cycle(currencies), len(assets)))) @classmethod def init_class_fixtures(cls): super(WithInternationalDailyBarData, cls).init_class_fixtures() cls.daily_bar_sessions = {} cls.daily_bar_data = {} cls.daily_bar_readers = {} cls.daily_bar_currency_codes = {} for calendar, assets, in cls.assets_by_calendar.items(): name = calendar.name start_delta = cls.DAILY_BAR_LOOKBACK_DAYS * calendar.day start_session = cls.DAILY_BAR_START_DATE - start_delta sessions = calendar.sessions_in_range( start_session, cls.DAILY_BAR_END_DATE, ) cls.daily_bar_sessions[name] = sessions cls.daily_bar_data[name] = dict( cls.make_daily_bar_data( assets=assets, calendar=calendar, sessions=sessions, )) panel = pd.concat(cls.daily_bar_data[name], axis=0) dict_data = {} for column in panel.columns: dict_data[column] = pd.DataFrame( panel[column]).unstack(level=0) dict_data[column].columns = dict_data[ column].columns.droplevel(0) cls.daily_bar_currency_codes[name] = cls.make_currency_codes( calendar, assets, ) cls.daily_bar_readers[name] = InMemoryDailyBarReader.from_panel( dict_data, calendar, currency_codes=cls.daily_bar_currency_codes[name], )
class WithInternationalDailyBarData(zf.WithAssetFinder): """ Fixture for generating international daily bars. Eventually this should be moved into zipline.testing.fixtures and should replace most of the existing machinery """ DAILY_BAR_START_DATE = zf.alias('START_DATE') DAILY_BAR_END_DATE = zf.alias('END_DATE') DAILY_BAR_LOOKBACK_DAYS = 0 INTERNATIONAL_PRICING_STARTING_PRICES = { 'NYSE': 100, 'TSX': 50, 'LSE': 25, } @classmethod def make_daily_bar_data(cls, assets, calendar, sessions): # Generate prices corresponding to uniform random returns with a slight # positive tendency. start = cls.INTERNATIONAL_PRICING_STARTING_PRICES[calendar.name] closes = random_tick_prices(start, len(sessions)) opens = closes - 0.05 highs = closes + 0.10 lows = closes - 0.10 volumes = np.arange(10000, 10000 + len(closes)) base_frame = pd.DataFrame( { 'close': closes, 'open': opens, 'high': highs, 'low': lows, 'volume': volumes, }, index=sessions) for asset in assets: sid = asset.sid yield sid, base_frame + sid @classmethod def init_class_fixtures(cls): super(WithInternationalDailyBarData, cls).init_class_fixtures() cls.daily_bar_sessions = {} cls.daily_bar_data = {} cls.daily_bar_readers = {} for calendar, assets, in cls.assets_by_calendar.items(): name = calendar.name start_delta = cls.DAILY_BAR_LOOKBACK_DAYS * calendar.day start_session = cls.DAILY_BAR_START_DATE - start_delta sessions = calendar.sessions_in_range( start_session, cls.DAILY_BAR_END_DATE, ) cls.daily_bar_sessions[name] = sessions cls.daily_bar_data[name] = dict( cls.make_daily_bar_data( assets=assets, calendar=calendar, sessions=sessions, )) panel = (pd.Panel.from_dict(cls.daily_bar_data[name]).transpose( 2, 1, 0)) cls.daily_bar_readers[name] = InMemoryDailyBarReader.from_panel( panel, calendar, )