예제 #1
0
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],
            )
예제 #2
0
class TestDataPortalExplicitLastAvailable(DataPortalTestBase, ZiplineTestCase):
    DATA_PORTAL_LAST_AVAILABLE_SESSION = alias("START_DATE")
    DATA_PORTAL_LAST_AVAILABLE_MINUTE = alias("END_DATE")
예제 #3
0
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],
            )
예제 #5
0
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,
            )