Определите дисбаланс покупки-продажи с помощью индекса затрат

В этом примере показано, как определить дисбаланс между покупками и продажами с помощью анализа транзакционных издержек исследовательской группы Kissell. Дисбаланс - это различие между объемом, инициированным покупкой и продажей, с учетом фактических рыночных условий в день и за указанный торговый период. Положительный дисбаланс указывает на давление покупки в акции, а отрицательный дисбаланс указывает на давление продажи. Индекс стоимости помогает инвесторам понять, как окружение торговых издержек влияет на поток порядков на рынке. Индекс может быть индексом, основанным на результатах, таким как S&P 500, который показывает движение и значение рынка или индекс волатильности, который показывает неопределенность рынка.

Дисбалансным количеством акций является значение x, такого что

0=|MICost|10000MI(x),

где

MI(x)=[b1(xVolume)a4+(1b1)][a1(xADV)a2σa3Pricea5].

MI - стоимость влияния на рынок для сделки с акциями. Предполагаемые торговые затраты представляют собой дополнительное движение цен акций по отношению к базовому движению индексных цен. Volume - фактический суточный объем запаса в корзине. ADV - среднесуточный объем акций в корзине. Price - цена акции в корзине. Другие переменные в уравнениях:

  • σ - Волатильность цен.

  • a1 - Ценовая чувствительность к потоку заказов.

  • a2 - Форма размера порядка.

  • a3 - Форма волатильности.

  • a4 - Процент формы объемной скорости.

  • a5 - Форма цены.

  • 1b1 - Процентная доля постоянного влияния на рынок. Постоянное влияние является неизбежной стоимостью влияния, которая возникает из-за информационного содержимого торговли.

  • b1 - Процентная доля воздействия на временный рынок. Временное влияние зависит от торговой стратегии. Временное влияние происходит из-за требований инвестора к ликвидности.

  • MICost=TotalCostBetaIndexCost, где:

    • TotalCost - изменение средневзвешенной цены объема по сравнению с открытой ценой для запасов.

    • Beta - Бета.

    • IndexCost - Изменение средневзвешенной цены по сравнению с открытой ценой для индекса. Индексные затраты корректируют цену движения рынка с помощью базовых индекса и беты.

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

Для текущего индекса затрат вы загружаете таблицу примеров TradeDataCurrent из файла KRGExampleData.mat. Для исторического индекса затрат загружается таблица примеров TradeDataHistorical из файла KRGExampleData.mat. В этом примере вычисляется текущий индекс затрат.

Для доступа к коду примера введите edit KRGCostIndexExample.m в командной строке.

После выполнения этого кода вы можете отправить порядок на выполнение с помощью Bloomberg®, для примера.

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

Извлечение параметров влияния рынка и данных о загрузке

Получите данные о влиянии рынка на 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);

Загрузите пример данных TradeDataCurrent, который входит в комплект поставки Datafeed Toolbox™. Вычислим количество акций в портфеле.

load KRGExampleData.mat TradeDataCurrent
TradeData = TradeDataCurrent;

numStocks = height(TradeData);

Описание примерных данных см. в разделе Наборы данных исследовательской группы Kissell.

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

Задайте максимальное количество итераций функции для оптимизации. Задайте 'MaxIterations' к большому значению так, что оптимизация может повторить много раз, чтобы решить систему нелинейных уравнений.

options = optimoptions('fsolve','MaxIterations',4000);

Оценка торговых издержек с использованием индекса затрат

Определите общую стоимость и бета-версию. Рассчитать сторону первоначальной оценки влияния на рынок. Определите начальный объем x0.

totalCost = TradeData.VWAP ./ TradeData.Open - 1;
indexCost = TradeData.Beta .* ...
    (TradeData.IndexVWAP ./ TradeData.IndexOpen - 1);
miCost = totalCost - indexCost;
sideIndicator = sign(miCost);
x0 = 0.5 * TradeData.Volume;

Составьте таблицу, в которой хранятся все выходные данные. Во-первых, добавьте эти переменные:

  • Symbol - Символ штока

  • Date - Дата сделки

  • Side - Боковой

  • TotalVolume - Объем транзакции

  • TotalCost - Общая стоимость транзакции

  • IndexCost - Индексные затраты

costIndexTable = table;
costIndexTable.Symbol = TradeData.Symbol;
costIndexTable.Date = TradeData.Date;
costIndexTable.Side = sideIndicator;
costIndexTable.TotalVolume = TradeData.Volume;
costIndexTable.TotalCost = totalCost;
costIndexTable.IndexCost = indexCost;

Использование for-цикл, чтобы вычислить индекс затрат для каждого запаса в портфеле. Каждый запас может иметь различные коды влияния на рынок и даты. Используйте costIndexExampleEq функция, которая содержит нелинейное уравнение, которое нужно решить. Для доступа к коду для costIndexExampleEq function, введите edit KRGCostIndexExample.m.

Добавьте эти переменные к выходу таблице:

  • Imbalance - Дисбаланс

  • ImbalancePctADV - Дисбаланс в процентах от среднесуточного объема

  • ImbalancePctDayVolume - Дисбаланс в процентах от суточного объема

  • BuyVolume - Объем покупки

  • SellVolume - Объем продаж

  • MI - Стоимость влияния на рынок

  • ExcessCost - Избыточные затраты

for i = 1:numStocks
    
  % Set the MiCode and MiDate of the object for each stock
  k.MiCode = TradeData.MICode(i);
  k.MiDate = TradeData.Date(i);
    
  % Solve for Shares for each stock that results in the target market
  % impact cost.
  
  % In this example, x is the number of shares (imbalance) that causes
  % the MI impact cost, the number of shares that result in a market 
  % impact cost of MI. Here use abs(MI) since market-impact 
  % cost is always positive. If the market-impact cost is 0.0050 then 
  % fsolve tries to find the number of shares x so that the market 
  % impact formula returns 0.0050.
  % Note that fsolve is using the cost in basis points.
  x = fsolve(@(x) costIndexExampleEq(x,miCost(i),TradeData(i,:),k), ...
      x0(i),options);
  
  % The imbalance must be between 0 and the actual traded volume.
  x = max(min(x,TradeData.Volume(i)),0);
  
  % Recalculate the percentage of volume and shares based on x.
  TradeData.POV(i) = x/TradeData.Volume(i);
  TradeData.Shares(i) = x;

  % Calculate the new cost as a decimal value.
  mi = marketImpact(k,TradeData(i,:))/10000;
  
  % imbalance is the share amount specified as buy or sell by the 
  % sideIndicator.
  imbalance = sideIndicator(i) * x;
  
  % Calculate the buy and sell volumes.
  % Knowing that:
  %
  % Volume = buyVolume + sellVolume;
  % Imbalance = buyVolume - sellVolume;
  %
  % Solve for buyVolume and sellVolume
  buyVolume = (TradeData.Volume(i) + imbalance) / 2;
  sellVolume = (TradeData.Volume(i) - imbalance) / 2;
  
  % Fill output table
  costIndexTable.Imbalance(i,1) = imbalance;
  costIndexTable.ImbalancePctADV(i,1) = imbalance/TradeData.ADV(i);
  costIndexTable.ImbalancePctDayVolume(i,1) = imbalance/TradeData.Volume(i); 
  costIndexTable.BuyVolume(i,1) = buyVolume;
  costIndexTable.SellVolume(i,1) = sellVolume;
  costIndexTable.MI(i,1) = mi * sideIndicator(i);
  costIndexTable.ExcessCost(i,1) = totalCost(i) - mi - indexCost(i);
  
end

Просмотрите сумму дисбаланса для первого запаса в выход данных.

costIndexTable.Imbalance(1)
ans =

  -8.7894e+04

Отрицательный дисбаланс указывает на давление продаж. Решает, покупать, удерживать или продавать акции этой акции в портфеле.

Для получения дополнительной информации о предыдущих расчетах обратитесь в исследовательскую группу Kissell.

Ссылки

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

[2] Маламут, Роберто. «Многопериодические методы оптимизации для планирования торговли». Презентация на Нью-Йоркской конференции КВАФАФЬЮ, апрель 2002 года.

[3] Кисселл, Роберт и Мортон Гланц. Оптимальные торговые стратегии. Нью-Йорк, Нью-Йорк: AMACOM, Inc., 2003.

См. также

| | (Optimization Toolbox) | (Optimization Toolbox)

Похожие темы