www.gusucode.com > trading工具箱matlab源码程序 > trading/trading/@krg/costCurves.m

    function cc = costCurves(k,tradeData,tradeQuantity,tqRange,tradeStrategy,tsRange)
%COSTCURVES Market impact cost of order execution.
%   CC = COSTCURVES(K,TRADEDATA,TRADEQUANTITY,TQRANGE,TRADESTRATEGY,TSRANGE)
%   calculates the market impact cost curves given TRADEDATA, the trade
%   quantity TQRANGE, and trade strategy TSRANGE.  TRADEQUANTITY can be
%   specified as Size, Shares or Dollars.    TRADESTRATEGY can be specified
%   as POV or TradeTime.   The values of TQRANGE and TSRANGE should match
%   these inputs.  K is the KRG object containing the market impact
%   parameters.
%
%   For example,
%
%   newData = 
%
%       Symbol    Price         ADV        Volatility
%       ______    ______    ___________    __________
%   
%       'IBM'     162.72     4174150.00    0.20      
%       'MSFT'     48.19    27617780.00    0.20      
%       'AAPL'    115.50    45887368.00    0.22      
%       'HSNI'     72.58      329700.00    0.24      
%       'GE'       26.37    28131680.00    0.15    
%
%   cc = costCurves(k,newData,'Size',(0:.01:2),'POV',(.05:.05:.5));
%
%   cc = 
%   
%       Symbol    Size      Shares          Dollars        POV     TradeTime       Cost_BP       Cost_DollarsPerShare    Cost_Dollars 
%       ______    ____    ___________    ______________    ____    _________    _____________    ____________________    _____________
%   
%       'IBM'     0.00           0.00              0.00    0.05     0.00        [1x10 single]    [1x10 single]           [1x10 single]
%       'IBM'     0.01       41741.50        6792177.00    0.05     0.19        [1x10 single]    [1x10 single]           [1x10 single]
%       'IBM'     0.02       83483.00       13584354.00    0.05     0.38        [1x10 single]    [1x10 single]           [1x10 single]
%       'IBM'     0.03      125224.50       20376530.00    0.05     0.57        [1x10 single]    [1x10 single]           [1x10 single]
%       ...
%
%    References:   The Science of Algorithmic Trading
%                  Optimal Trading Strategy
%                  Multi-Asset Risk Modeling
%
%   See also iStar, marketImpact, timingRisk.

%   Copyright 2016 The MathWorks, Inc.

% Dimensions needed to expand data into all possible combinations
numStocks = length(tradeData.Symbol);
numSizes = length(tqRange);
numPOVs = length(tsRange);

% Create symbol, volatility and price lists corresponding to size and pov arrays
symbols = tradeData.Symbol(:)';
symbolArray = symbols(ones(numSizes*numPOVs,1),:);
vols = tradeData.Volatility(:)';
volArray = vols(ones(numSizes*numPOVs,1),:);
prices = tradeData.Price(:)';
priceArray = prices(ones(numSizes*numPOVs,1),:);
advs = tradeData.ADV(:)';
advArray = advs(ones(numSizes*numPOVs,1),:);

% Determine trade quantity and trade strategy input types
switch lower(tradeQuantity)
  case 'size'
    sizeRange = tqRange(:)';
    sizeArray = sizeRange(ones(numPOVs,1),:);
    sizeArray = sizeArray(:);
    sizeArray = sizeArray(:,ones(1,numStocks));
    sharesArray = sizeArray .* advArray;
    dollarsArray = sharesArray .* priceArray;
  case 'shares'
    sharesRange = tqRange(:)';
    sharesArray = sharesRange(ones(numPOVs,1),:);
    sharesArray = sharesArray(:);
    sharesArray = sharesArray(:,ones(1,numStocks));
    sizeArray = sharesArray ./ advArray;
    dollarsArray = sharesArray .* priceArray;
  case 'dollars'
    tradeDollarsRange = tqRange(:)';
    dollarsArray = tradeDollarsRange(ones(numPOVs,1),:);
    dollarsArray = dollarsArray(:);
    dollarsArray = dollarsArray(:,ones(1,numStocks));
    sharesArray = dollarsArray ./ priceArray;
    sizeArray = sharesArray ./ advArray;
end

switch lower(tradeStrategy)
  case 'pov'
    tsRange = tsRange(:)';
    povArray = tsRange(ones(numSizes,1),:)';
    povArray = povArray(:);
    povArray = povArray(:,ones(1,numStocks));
    tradeTimeArray = sizeArray .* (1 - povArray) ./ povArray;
  case 'tradetime'
    tradeTimeRange = tsRange(:)';
    tradeTimeArray = tradeTimeRange(ones(numSizes,1),:)';
    tradeTimeArray = tradeTimeArray(:);
    tradeTimeArray = tradeTimeArray(:,ones(1,numStocks));
    povArray = sizeArray ./ (tradeTimeArray + sizeArray);
end

% Create struct needed for iStar and marketImpact calculations
calcStruct = struct('Size',sizeArray(:),'POV',povArray(:),...
                    'Volatility',volArray(:),'Price',priceArray(:));             
                  
% Market impact calculation
calcStruct.MarketImpact_bp = marketImpact(k,calcStruct);
calcStruct.MarketImpact_dollarspershare = calcStruct.MarketImpact_bp/10000 .* priceArray(:);

% Add additional fields
calcStruct.Symbol = symbolArray(:);    
calcStruct.ADV = advArray(:);
calcStruct.TradeTime = tradeTimeArray(:);

% Calculate Shares and Dollars
calcStruct.Shares = sharesArray(:);
calcStruct.Dollars = dollarsArray(:);
calcStruct.MarketImpact_dollars = calcStruct.MarketImpact_dollarspershare .* calcStruct.Shares;

% Create output table or structure based on input type
switch class(tradeData)
  case 'table'
    cc = table(calcStruct.Symbol,calcStruct.Size,calcStruct.Shares,calcStruct.Dollars,calcStruct.POV,calcStruct.TradeTime,calcStruct.MarketImpact_bp,calcStruct.MarketImpact_dollarspershare,calcStruct.MarketImpact_dollars,'VariableNames',{'Symbol','Size','Shares','Dollars','POV','TradeTime','Cost_BP','Cost_DollarsPerShare','Cost_Dollars'});
  case 'struct'
    cc.Symbol = calcStruct.Symbol;
    cc.Size = calcStruct.Size;
    cc.Shares = calcStruct.Shares;
    cc.Dollars = calcStruct.Dollars;
    cc.POV = calcStruct.POV;
    cc.TradeTime = calcStruct.TradeTime;
    cc.Cost_BP = calcStruct.MarketImpact_bp;
    cc.Cost_DollarsPerShare = calcStruct.MarketImpact_dollarspershare;
    cc.Cost_Dollars = calcStruct.MarketImpact_dollars;
end