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
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
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
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
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