def test_overlapping_full_detailed_tca_calculation(): """Tests a detailed TCA calculation works with caching and overlapping dates, checking that it has the right tables returned. """ logger = LoggerManager.getLogger(__name__) tca_request = TCARequest(start_date=start_date, finish_date=finish_date, ticker=ticker, tca_type='detailed', trade_data_store=trade_data_store, market_data_store=market_data_store, trade_order_mapping=trade_order_mapping, use_multithreading=True) tca_engine = TCAEngineImpl(version=tcapy_version) dict_of_df = tca_engine.calculate_tca(tca_request=tca_request) sparse_market_trade_df = dict_of_df['sparse_market_' + trade_df_name] logger.info("Running second TCA calculation, extending dates...") # Extend sample tca_request.start_date = pd.Timestamp(start_date) - timedelta(days=10) dict_of_df = tca_engine.calculate_tca(tca_request=tca_request) sparse_market_trade_df = dict_of_df['sparse_market_' + trade_df_name] assert len(sparse_market_trade_df.index[sparse_market_trade_df.index < '01 Feb 2018']) > 0
def test_overlapping_full_detailed_tca_calculation(): """Tests a detailed TCA calculation works with caching and overlapping dates, checking that it has the right tables returned. """ tca_request = TCARequest(start_date=start_date, finish_date=finish_date, ticker=ticker, tca_type='detailed', 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) # Extend sample tca_request.start_date = pd.Timestamp(start_date) - timedelta(days=10) dict_of_df = tca_engine.calculate_tca(tca_request=tca_request) sparse_market_trade_df = dict_of_df['sparse_market_trade_df'] assert len(sparse_market_trade_df.index[sparse_market_trade_df.index < '01 Jun 2017']) > 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