def example_market_data_non_usd_cross():
    """Example for loading market data which has more exotic crosses, which are unlikely to be collected. For these
    exotic crosses tcapy will calculate the cross rates via the USD legs, eg. NZDCAD would be calculated from
    NZDUSD and USDCAD data.
    """
    market_loader = Mediator.get_tca_market_trade_loader()

    tca_request = TCARequest(start_date=start_date,
                             finish_date=finish_date,
                             ticker='NZDUSD',
                             market_data_store=market_data_store)

    market_base_df = market_loader.get_market_data(tca_request)

    tca_request.ticker = 'USDCAD'
    market_terms_df = market_loader.get_market_data(tca_request)

    market_df = pd.DataFrame(market_base_df['mid'] *
                             market_terms_df['mid']).dropna()

    tca_request.ticker = 'NZDCAD'
    market_direct_df = market_loader.get_market_data(tca_request)

    market_df, market_direct_df = market_df.align(market_direct_df,
                                                  join='inner')

    # check time series are equal to each other
    assert (market_df['mid'] - market_direct_df['mid']).sum() == 0
Exemple #2
0
def test_full_detailed_tca_calculation(fill_market_trade_databases):
    """Tests a detailed TCA calculation, checking that it has the right tables returned.
    """

    tca_request = TCARequest(
        start_date=start_date,
        finish_date=finish_date,
        ticker=ticker,
        trade_data_store=trade_data_store,
        trade_data_database_name=trade_data_database_name,
        market_data_store=market_data_store,
        market_data_database_table=market_data_database_table,
        trade_order_mapping=trade_order_mapping,
        use_multithreading=use_multithreading)

    tca_engine = TCAEngineImpl(version=tcapy_version)

    dict_of_df = tca_engine.calculate_tca(tca_request=tca_request)

    assert ('trade_df' in dict_of_df and 'sparse_market_trade_df' in dict_of_df
            and 'market_df' in dict_of_df)

    # Missing ticker won't return any data, internally a DataMissingException is thrown
    tca_request.ticker = missing_ticker

    data_missing_exception = False

    try:
        dict_of_df = tca_engine.calculate_tca(tca_request=tca_request)
    except DataMissingException:
        data_missing_exception = True

    assert data_missing_exception
Exemple #3
0
def test_full_detailed_tca_calculation():
    """Tests a detailed TCA calculation, checking that it has the right tables returned.
    """

    tca_request = TCARequest(start_date=start_date,
                             finish_date=finish_date,
                             ticker=ticker,
                             trade_data_store=trade_data_store,
                             market_data_store=market_data_store,
                             trade_order_mapping=trade_order_mapping)

    tca_engine = TCAEngineImpl(version=tcapy_version)

    dict_of_df = tca_engine.calculate_tca(tca_request=tca_request)

    assert (trade_df_name in dict_of_df
            and 'sparse_market_' + trade_df_name in dict_of_df
            and 'market_df' in dict_of_df)

    tca_request.ticker = missing_ticker

    data_missing_exception = False

    try:
        dict_of_df = tca_engine.calculate_tca(tca_request=tca_request)
    except DataMissingException:
        data_missing_exception = True

    assert data_missing_exception
Exemple #4
0
    def _split_tca_request_into_list(self, tca_request):
        """Splits a TCA request by ticker.

        Parameters
        ----------
        tca_request : TCARequest
            TCA request to broken up into tickers

        Returns
        -------
        TCARequest(list)
        """

        ticker = tca_request.ticker

        if not (isinstance(ticker, list)):
            ticker = [ticker]

        tca_request_list = []

        # go through every ticker (and also split into list)
        for tick in ticker:
            tca_request_temp = TCARequest(tca_request=tca_request)
            tca_request_temp.ticker = tick

            tca_request_list.append(tca_request_temp)

        return self._util_func.flatten_list_of_lists(tca_request_list)
def example_market_data_convention():
    """Loads market data in the correct convention
    """
    market_loader = Mediator.get_tca_market_trade_loader()

    tca_request = TCARequest(start_date=start_date,
                             finish_date=finish_date,
                             ticker=ticker,
                             market_data_store=market_data_store)

    market_correct_conv_df = market_loader.get_market_data(tca_request)

    tca_request.ticker = reverse_ticker
    market_reverse_conv_df = market_loader.get_market_data(tca_request)

    market_correct_conv_df, market_reverse_conv_df = \
        market_correct_conv_df.align(market_reverse_conv_df, join='inner')

    synthetic_market_df = market_correct_conv_df.copy()
    synthetic_market_df['mid'] = 1.0 / synthetic_market_df['mid']

    # Check time series are equal to each other
    assert (market_reverse_conv_df['mid'] -
            synthetic_market_df['mid']).sum() == 0
Exemple #6
0
    def _split_tca_request_by_date(self,
                                   tca_request,
                                   tick,
                                   split_dates=True,
                                   period='month'):

        tca_request_list = []

        dates = []

        # Break up dates into day/week/month chunks - our cache works on day/week/month chunks (can specify in constants)
        # Typically day chunks seem optimal
        # Careful to floor dates for midnight for caching purposes
        if split_dates:
            if period == 'month':
                split_dates_freq = 'MS'
            elif period == 'week':
                split_dates_freq = 'W-MON'
            elif period == 'day':
                split_dates_freq = 'D'

            start_date_floored = self._util_func.floor_tick_of_date(
                tca_request.start_date)
            finish_date_floored = self._util_func.floor_tick_of_date(
                tca_request.finish_date, add_day=True)

            dates = pd.date_range(start=start_date_floored,
                                  end=finish_date_floored,
                                  freq=split_dates_freq).tolist()

        # Add start date and finish date if necessary
        # if len(dates) > 0:
        #     if start_date_floored < dates[0]:
        #         dates.insert(0, start_date_floored)
        #
        #     if finish_date_floored > dates[-1]:
        #         dates.append(finish_date_floored)
        # else:
        #     dates = [start_date_floored, finish_date_floored]

        logger = LoggerManager().getLogger(__name__)

        # If our start/finish date ends up being more than a month
        # eg. Jan 8th - Mar 7th - split into
        # Jan 8th - Jan 31st 23:59:59.999, Feb 1st 00:00:00.000 - Feb 28th 23:59:59.999 etc
        if len(dates) > 0:

            # For the very first chunk in our series
            if tca_request.start_date < dates[0]:
                tca_request_temp = TCARequest(tca_request=tca_request)
                tca_request_temp.ticker = tick
                tca_request_temp.start_date = tca_request.start_date
                tca_request_temp.finish_date = dates[0] - timedelta(
                    microseconds=1)

                tca_request_list.append(tca_request_temp)

            # For full months in between during our request
            for i in range(0, len(dates) - 1):
                tca_request_temp = TCARequest(tca_request=tca_request)
                tca_request_temp.ticker = tick
                tca_request_temp.start_date = dates[i]
                tca_request_temp.finish_date = dates[i + 1] - timedelta(
                    microseconds=1)

                tca_request_list.append(tca_request_temp)

            # For the very last chunk of our series
            if dates[-1] < tca_request.finish_date:
                tca_request_temp = TCARequest(tca_request=tca_request)
                tca_request_temp.ticker = tick
                tca_request_temp.start_date = dates[-1]
                tca_request_temp.finish_date = tca_request.finish_date

                tca_request_list.append(tca_request_temp)
        else:
            tca_request_temp = TCARequest(tca_request=tca_request)
            tca_request_temp.ticker = tick

            tca_request_list.append(tca_request_temp)

        date_str = ''

        for t in tca_request_list:
            date_str = date_str + ' / ' + str(t.start_date) + ' to ' + str(
                t.finish_date)

        logger.debug("Split TCA request for " + str(tca_request.ticker) +
                     " dates " + date_str + " from original request " +
                     str(tca_request.start_date) + ' to ' +
                     str(tca_request.finish_date))

        return tca_request_list