exponenta event banner

Ликвидировать долларовую стоимость из портфеля

В этом примере показано, как ликвидировать долларовую стоимость из портфеля при минимизации рыночных издержек с помощью анализа операционных издержек Исследовательской группы Kissell. Этот пример всегда приводит к сокращению портфеля. Минимизация издержек, влияющих на рынок, выражается как

argminx [MI '| x |],

где 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.

См. также

| | (Панель инструментов оптимизации) | (Панель инструментов оптимизации)

Связанные темы