В этом примере показано, как ликвидировать долларовую стоимость из портфеля при минимизации рыночных издержек с помощью анализа операционных издержек Исследовательской группы Kissell. Этот пример всегда приводит к сокращению портфеля. Минимизация издержек, влияющих на рынок, выражается как
|],
где MI - стоимость воздействия на рынок для торгуемых акций, а x обозначает окончательные веса для каждой акции.
В этом примере требуется лицензия Optimization Toolbox™. Дополнительные сведения см. в разделе Обзор теории оптимизации (панель инструментов оптимизации).
Оптимизация позволяет найти локальный минимум затрат на ликвидацию долларовой стоимости из портфеля. Способы поиска глобального минимума см. в разделе Локальная и глобальная оптимизация (панель инструментов оптимизации).
Для вызова кода примера введите edit KRGLiquidityOptimizationExample.m в командной строке.
Извлеките данные о влиянии на рынок с FTP-сайта Kissell Research Group. Подключитесь к FTP-сайту с помощью ftp с именем пользователя и паролем. Перейдите к MI_Parameters и получить данные о влиянии на рынок в MI_Encrypted_Parameters.csv файл. miData содержит зашифрованную дату влияния на рынок, код и параметры.
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);
Создание объекта анализа затрат транзакции Kissell Research Group k. Укажите начальные параметры для даты, кода влияния на рынок и количества торговых дней.
k = krg(miData,datetime('today'),1,250);Загрузка данных примера TradeDataPortOpt и ковариационные данные CovarianceData из файла KRGExampleData.mat, который входит в состав Toolbox™ Datafeed. Ограничьте набор данных первыми 10 строками.
load KRGExampleData.mat TradeDataPortOpt CovarianceData n = 10; TradeDataPortOpt = TradeDataPortOpt(1:n,:); CovarianceData = CovarianceData(1:n,1:n); C = table2array(CovarianceData);
Описание данных примера см. в разделе Наборы данных исследовательской группы Kissell.
Установите стоимость ликвидации портфеля в 100 000 000 долларов США. Установите границы рисков портфеля от 90% до 110%. Установите максимальную общую стоимость влияния на рынок в 50 базисных пунктов. Определите количество запасов в портфеле. Извлеките ограничение верхней границы для максимальной стоимости влияния на рынок для ликвидации акций в каждой акции.
PortLiquidationValue = 100000000; PortRiskBounds = [0.9 1.10]; maxTotalMI = 0.005; numPortStocks = length(TradeDataPortOpt.Symbol); maxMI = TradeDataPortOpt.UB_MaxMI;
Определение целевой стоимости портфеля PortfolioTargetValue путем вычитания стоимости ликвидации портфеля из общей стоимости портфеля.
PortfolioValue = sum(TradeDataPortOpt.Value); absPortValue = abs(TradeDataPortOpt.Value); PortfolioAbsValue = sum(absPortValue); PortfolioTargetValue = PortfolioValue-PortLiquidationValue;
Определение текущего веса портфеля w на основе стоимости каждого запаса в портфеле.
w = sign(TradeDataPortOpt.Shares).*absPortValue/PortfolioAbsValue;
Указание ограничений Aeq и beq чтобы указать, что веса должны быть равны единице. Инициализация линейных ограничений неравенства A и b.
Aeq = ones(1,numPortStocks); beq = 1; A = []; b = [];
Извлеките нижнюю и верхнюю границы для окончательного веса портфеля в TradeDataPortOpt.
LB = TradeDataPortOpt.LB_Wt; UB = TradeDataPortOpt.UB_Wt;
Определите нижнюю и верхнюю границы для количества акций в конечном портфеле, используя другие необязательные ограничения в примере набора данных.
lbShares = max([TradeDataPortOpt.LB_MinShares, ... TradeDataPortOpt.LB_MinValue./TradeDataPortOpt.Price, ... TradeDataPortOpt.LB_MinPctADV.*TradeDataPortOpt.ADV],[],2); ubShares = min([TradeDataPortOpt.UB_MaxShares, ... TradeDataPortOpt.UB_MaxValue./TradeDataPortOpt.Price, ... TradeDataPortOpt.UB_MaxPctADV.*TradeDataPortOpt.ADV],[],2);
Укажите начальные веса портфеля.
x0 = TradeDataPortOpt.Value./sum(TradeDataPortOpt.Value); x = x0;
Определение параметров оптимизации. Установите алгоритм оптимизации на последовательное квадратичное программирование. Установите допуск окончания для значения функции и x. Задайте допуск для нарушения ограничения. Установите допуск окончания для итерации PCG. Установка максимального количества аналитических отчетов по функциям 'MaxFunEvals' и итерации 'MaxIter'. Варианты 'MaxFunEvals' и 'MaxIter' имеют большие значения, так что оптимизация может повторяться много раз, чтобы найти локальный минимум. Установите минимальное изменение переменных для конечных разностей.
options = optimoptions('fmincon','Algorithm','sqp', ... 'TolFun',10E-8,'TolX',10E-16,'TolCon',10E-8,'TolPCG',10E-8, ... 'MaxFunEvals',50000,'MaxIter',50000,'DiffMinChange',10E-8);
Определение дескриптора функции objectivefun для выборочной целевой функции krgLiquidityFunction. Для доступа к коду этой функции введите edit krgLiquidityFunction.m. Определение дескриптора функции constraintsfun для функции образца krgLiquidityConstraint которая устанавливает дополнительные ограничения. Для доступа к коду этой функции введите edit krgLiquidityConstraint.m.
objectivefun = @(x) krgLiquidityFunction(x,TradeDataPortOpt, ... PortfolioTargetValue,k); constraintsfun = @(x) krgLiquidityConstraint(x,w,C,TradeDataPortOpt, ... PortfolioTargetValue,PortRiskBounds,lbShares,ubShares,maxMI,maxTotalMI,k);
Минимизация рыночных затрат на ликвидацию портфеля. fmincon находит оптимальное значение веса портфеля для каждого запаса на основе значений нижней и верхней границы. Это достигается путем определения локального минимума затрат, влияющих на рынок.
[x,~,exitflag] = fmincon(objectivefun,x0,A,b,Aeq,beq,LB,UB, ...
constraintsfun,options);Чтобы проверить, fmincon найдено локальное минимальное значение, отображается причина остановки функции.
exitflag
exitflag =
1.00
fmincon прибыль 1 при нахождении локального минимума. Для получения более подробной информации см. exitflag(Панель инструментов оптимизации).
Определение оптимизированного значения веса x1 каждого запаса в портфеле в десятичном формате.
x1 = x.*PortfolioTargetValue/PortfolioValue;
Определение целевого значения оптимизированного портфеля TargetValue и количество акций SharesToTrade для каждого запаса в портфеле.
TargetShares = x*PortfolioTargetValue./TradeDataPortOpt.Price; SharesToTrade = TradeDataPortOpt.Shares-TargetShares; TargetValue = x*PortfolioTargetValue; TradeDataPortOpt.Shares = abs(SharesToTrade);
Определите оптимизированный процент стратегии объема.
TradeDataPortOpt.TradeTime = TradeDataPortOpt.TradeTime ... .* TradeDataPortOpt.ADV; TradeDataPortOpt.POV = krg.tradetime2pov(TradeDataPortOpt.TradeTime, ... TradeDataPortOpt.Shares);
Оценка затрат, влияющих на рынок MI на количество ликвидируемых акций.
MI = marketImpact(k,TradeDataPortOpt)/10000;
Для просмотра затрат, влияющих на рынок, в десятичном формате укажите формат отображения. Просмотрите рыночные затраты для первых трех запасов в портфеле.
format MI(1:3)
ans =
1.0e-03 *
0.1477
0.1405
0.1405Для просмотра целевого количества общих ресурсов с двумя десятичными разрядами укажите формат отображения. Просмотрите целевое количество акций для первых трех акций в портфеле.
format bank
TargetShares(1:3)ans =
-23640.11
-154656.73
-61193.04Отрицательные значения означают продажи акций из портфеля.
Просмотрите стоимость торгов для первых трех акций в портфеле.
TargetValue(1:3)
ans =
-968062.45
-1521760.41
-2448131.64Для моделирования торговли целевым количеством акций в историческом диапазоне дат теперь можно провести стресс-тест оптимизированного портфеля. Дополнительные сведения о проведении стресс-теста см. в разделе Проведение стресс-теста в портфолио.
[1] Кисселл, Роберт. «Создание динамических предпродажных моделей: за черным ящиком». Журнал торгов. Том 6, номер 4, осень 2011, стр. 8-15.
[2] Кисселл, Роберт. «TCA в инвестиционном процессе: обзор». Журнал индексного инвестирования. Том 2, номер 1, лето 2011, стр. 60-64.
[3] Кисселл, Роберт. Наука алгоритмической торговли и управления портфелем. Кембридж, Массачусетс: Elsevier/Академическая пресса, 2013.
[4] Чон, Грейс и Роберт Кисселл. «Применение транзакционных издержек в процессе оптимизации портфеля». Журнал торгов. Том 11, номер 2, весна 2016, стр. 11-20.
krg | marketImpact | fmincon (Панель инструментов оптимизации) | optimoptions(Панель инструментов оптимизации)