Main Content

Conduct Sensitivity Analysis to Estimate Trading Costs

This example shows how to evaluate changes in trading costs due to liquidity, volatility, and market sensitivity to order flow and trades. With transaction cost analysis from the Kissell Research Group, you can simulate the trading cost environment for a collection of stocks. Sensitivity analysis enables you to estimate future trading costs for different market conditions to determine the appropriate portfolio contents that meet the needs of the investors.

Here, evaluate changes in trading costs due to decreasing average daily volume by 50% and doubling volatility. The example data uses the percentage of volume (POV) trade strategy.

To access the example code, enter edit KRGSensitivityAnalysisExample.m at the command line.

Retrieve Market-Impact Parameters and Load Transaction Data

Retrieve the market-impact data from the Kissell Research Group FTP site. Connect to the FTP site using the ftp function with a user name and password. Navigate to the MI_Parameters folder and retrieve the market-impact data in the MI_Encrypted_Parameters.csv file. miData contains the encrypted market-impact date, code, and parameters.

f = ftp('ftp.kissellresearch.com','username','pwd');
mget(f,'MI_Encrypted_Parameters.csv');
close(f)

miData = readtable('MI_Encrypted_Parameters.csv','delimiter', ...
    ',','ReadRowNames',false,'ReadVariableNames',true);

Create a Kissell Research Group transaction cost analysis object k.

k = krg(miData);

Load the example data from the file KRGExampleData.mat, which is included with the Datafeed Toolbox™.

load KRGExampleData.mat

For a description of the example data, see Kissell Research Group Data Sets.

Estimate Initial Trading Costs

Estimate initial trading costs using the example data TradeData. The trading costs are:

  • Instantaneous trading cost itc

  • Market-impact cost mi

  • Timing risk tr

  • Price appreciation pa

Group all four trading costs into a numeric matrix initTCA.

itc = iStar(k,TradeData);
mi = marketImpact(k,TradeData);
tr = timingRisk(k,TradeData);
pa = priceAppreciation(k,TradeData);
initTCA = [itc mi tr pa];

Create Scenario

Set variables to create the scenario. Here, the scenario decreases average daily volume by 50% and doubles volatility. The stock price, volume, estimated alpha, and trade strategy remain unchanged from the example data. You can modify the values of these variables to create different scenarios. The fields are:

  • Average daily volume

  • Volatility

  • Stock price

  • Volume

  • Alpha estimate

  • POV trade strategy

  • Trade time trade strategy

adjADV = 0.5;
adjVolatility = 2.0;
adjPrice = 1.0;
adjVolume = 1.0;
adjAlpha = 1.0;
adjPOV = 1.0;
adjTradeTime = 1.0;

Adjust the example data based on the scenario variables.

TradeDataAdj = TradeData;
TradeDataAdj.Size = TradeData.Size .* (1./adjADV);
TradeDataAdj.ADV = TradeData.ADV .* adjADV;
TradeDataAdj.Volatility = TradeData.Volatility .* adjVolatility;
TradeDataAdj.Price = TradeData.Price .* adjPrice;
TradeDataAdj.Alpha_bp = TradeData.Alpha_bp .* adjAlpha;

TradeDataAdj contains the adjusted data. Size doubles because average daily volume decreases by 50%.

Convert POV trade strategy to the trade time trade strategy.

[~,povFlag,timeFlag] = krg.krgDataFlags(TradeData);
if povFlag
    TradeDataAdj.POV = TradeData.POV.*adjPOV;
    TradeDataAdj.TradeTime = TradeDataAdj.Size .* ...
        ((1-TradeDataAdj.POV) ./ TradeDataAdj.POV) .* (1./adjVolume);
elseif timeFlag
    TradeDataAdj.TradeTime = tradedata.TradeTime .* adjTradeTime;
    TradeDataAdj.POV = TradeDataAdj.Size ./ ...
        (TradeDataAdj.Size + TradeDataAdj.TradeTime .* adjVolume);
end

Estimate Trading Costs for Scenario

Estimate the trading costs based on the adjusted data. The numeric matrix newTCA contains the trading costs for the scenario.

itc = iStar(k,TradeDataAdj);
mi = marketImpact(k,TradeDataAdj);
tr = timingRisk(k,TradeDataAdj);
pa = priceAppreciation(k,TradeDataAdj);
newTCA = [itc mi tr pa];

Subtract the trading costs from the scenario from the initial trading costs.

rawWI = newTCA - initTCA;
wi = table(rawWI(:,1),rawWI(:,2),rawWI(:,3),rawWI(:,4), ...
    'VariableNames',{'ITC','MI','TR','PA'});

The table wi contains the full impact of this scenario on the trading costs.

Display trading costs for the first three rows in wi.

wi(1:3,:)
ans = 

     ITC        MI        TR       PA  
    ______    ______    ______    _____

     43.05      0.65    290.80    -9.49
    408.29    124.52    443.16     8.47
     80.92     13.79    114.97     0.93

The variables in wi are:

  • Instantaneous trading cost

  • Market-impact cost

  • Timing risk

  • Price appreciation

For details about the preceding calculations, contact the Kissell Research Group.

See Also

| | | |

Related Topics