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

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

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);

Создайте аналитический объект k операционных издержек Kissell Research Group. Задайте начальные установки для даты, кода влияния на рынок и номера торговых дней.

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 Research Group.

Задайте параметры оптимизации

Установите значение ликвидации портфеля к 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] Kissell, Роберт. “Создавая Динамические Предторговые Модели: Вне Черного квадрата”. Журнал Торговли. Издание 6, Номер 4, Осень 2011 года, стр 8–15.

[2] Kissell, Роберт. “TCA в Инвестиционном Процессе: Обзор”. Журнал Инвестирования индекса. Издание 2, Номер 1, Лето 2011 года, стр 60–64.

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

[4] Чанг, Грэйс и Роберт Кисселл. “Приложение Операционных издержек в Процессе Оптимизации Портфеля”. Журнал Торговли. Издание 11, Номер 2, Spring 2016, стр 11–20.

Смотрите также

| | (Optimization Toolbox) | (Optimization Toolbox)

Похожие темы