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