Ликвидация долларового значения из портфеля

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

argminx[MI'|x|],

где MI - стоимость влияния рынка на торгуемые акции, а x обозначает конечные веса для каждой акции.

Для этого примера требуется лицензия Optimization Toolbox™. Для получения справочной информации смотрите Обзор теории оптимизации (Optimization Toolbox).

Оптимизация находит локальный минимум затрат на влияние рынка на ликвидацию долларового значения из портфеля. Для способов поиска глобального минимума смотрите Локальный и Глобальный оптимумы (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, который входит в комплект поставки Datafeed Toolbox™. Ограничьте набор данных первыми 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 (Optimization Toolbox).

Определите оптимизированное значение веса 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] Кисселл, Роберт. Создание динамических моделей Pre-Trade: Beyond the Black Box (неопр.) (недоступная ссылка). Торговый журнал. Том 6, № 4, осень 2011, стр. 8-15.

[2] Кисселл, Роберт. «TCA в инвестиционном процессе: обзор». Журнал Индекса инвестиций. Том 2, № 1, лето 2011, с. 60-64.

[3] Кисселл, Роберт. Наука об алгоритмической торговле и управлении портфелем. Cambridge, MA: Elsevier/Academic Press, 2013.

[4] Чунг, Грейс и Роберт Кисселл. «Применение транзакционных издержек в процессе оптимизации портфеля». Торговый журнал. Том 11, номер 2, весна 2016, стр. 11-20.

См. также

| | (Optimization Toolbox) | (Optimization Toolbox)

Похожие темы