def example_calculate_market_impact(): """Calculates the transient market impact for a trade """ from tcapy.analysis.algos.metric import MetricTransientMarketImpact market_df, trade_df = get_sample_data() metric_market_impact = MetricTransientMarketImpact() metric_market_impact.calculate_metric(trade_df, market_df) print(trade_df)
def test_metric_calculation(fill_market_trade_databases): """Tests slippage calculation on a test set of market and trade data """ market_df, trade_df, order_df = get_sample_data() #### Calculate slippage market_df.index = market_df.index + timedelta(milliseconds=5) # Add a mid point (in case it doesn't exist) market_df = BenchmarkMarketSpreadToMid().calculate_benchmark( market_df=market_df) trade_df, _ = MetricSlippage().calculate_metric(trade_order_df=trade_df, market_df=market_df, bid_benchmark='mid', ask_benchmark='mid') # a selection of points to try ind_list = [0, 1, 2, -2 - 1] for i in ind_list: # Now replicate slippage calculation from first principles (get the last available point if no match) mid_index = market_df['mid'].index.get_loc(trade_df.index[i], method='ffill') trade = trade_df['executed_price'][i] side = trade_df['side'][i] slippage = trade_df['slippage'][i] market_slippage = trade_df['slippage_benchmark'][i] # market = market_df.ix[mid_index]['mid'] market = market_df['mid'][mid_index] # Do slippage calculation for comparison with our method slippage_comp = -side * (trade - market) # Check that the 'slippage' column exists and is consistent assert ('slippage' in trade_df.columns and abs(slippage - slippage_comp) < eps) ### Check anomalous trade identification market_df, trade_df, order_df = get_sample_data() market_df.index = market_df.index + timedelta(milliseconds=10) # Force spread to mid to be 0.25bp anomalous_spread_to_mid_bp = 0.25 market_df = BenchmarkMarketSpreadToMid().calculate_benchmark( market_df=market_df, bid_mid_bp=anomalous_spread_to_mid_bp, ask_mid_bp=anomalous_spread_to_mid_bp, overwrite_bid_ask=True) trade_df, _ = MetricSlippage().calculate_metric(trade_order_df=trade_df, market_df=market_df) anomalous_metric = trade_df[trade_df['slippage_anomalous'] == 1] anomalous_comparison = trade_df[ trade_df['slippage'] <= -(anomalous_spread_to_mid_bp / (100.0 * 100.0))] # Now test if the correct trades have been identified as anomalous assert_frame_equal(anomalous_metric[['slippage_anomalous']], anomalous_comparison[['slippage_anomalous']]) #### Calculate market impact (using bid/ask) market_df, trade_df, order_df = get_sample_data() trade_df, _ = MetricTransientMarketImpact(transient_market_impact_gap={ 'ms': 1250 }).calculate_metric(trade_order_df=trade_df, market_df=market_df, bid_benchmark='bid', ask_benchmark='ask') for i in ind_list: # Now replicate transient market impact calculation from first principles (get the NEXT available point if not available) time_to_search = trade_df.index[i] + timedelta(milliseconds=1250) index = market_df.index.get_loc(time_to_search, method='bfill') index_time = market_df.index[index] trade = trade_df['executed_price'][i] side = trade_df['side'][i] if 'bid' in market_df.columns and 'ask' in market_df.columns: if side == 1: # market = market_df.ix[index]['ask'] market = market_df.iloc[index]['ask'] elif side == -1: # market = market_df.ix[index]['bid'] market = market_df.iloc[index]['bid'] else: # market = market_df.ix[index]['mid'] market = market_df.iloc[index]['mid'] market_transient_impact_benchmark = trade_df[ 'transient_market_impact_benchmark'][i] transient_market_impact = trade_df['transient_market_impact'][i] # do transient market impact calculation for comparison with our method transient_market_impact_comp = side * (trade - market) # check that the 'transient_market_impact' column exists and is consistent assert ('transient_market_impact' in trade_df.columns) and \ (abs(transient_market_impact - transient_market_impact_comp) < eps)