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)
Exemplo n.º 2
0
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)