В этом примере показано, как определить дисбаланс между покупками и продажами с помощью анализа транзакционных издержек исследовательской группы Kissell. Дисбаланс - это различие между объемом, инициированным покупкой и продажей, с учетом фактических рыночных условий в день и за указанный торговый период. Положительный дисбаланс указывает на давление покупки в акции, а отрицательный дисбаланс указывает на давление продажи. Индекс стоимости помогает инвесторам понять, как окружение торговых издержек влияет на поток порядков на рынке. Индекс может быть индексом, основанным на результатах, таким как S&P 500, который показывает движение и значение рынка или индекс волатильности, который показывает неопределенность рынка.
Дисбалансным количеством акций является значение x, такого что
где
MI - стоимость влияния на рынок для сделки с акциями. Предполагаемые торговые затраты представляют собой дополнительное движение цен акций по отношению к базовому движению индексных цен. Volume - фактический суточный объем запаса в корзине. ADV - среднесуточный объем акций в корзине. Price - цена акции в корзине. Другие переменные в уравнениях:
- Волатильность цен.
- Ценовая чувствительность к потоку заказов.
- Форма размера порядка.
- Форма волатильности.
- Процент формы объемной скорости.
- Форма цены.
- Процентная доля постоянного влияния на рынок. Постоянное влияние является неизбежной стоимостью влияния, которая возникает из-за информационного содержимого торговли.
- Процентная доля воздействия на временный рынок. Временное влияние зависит от торговой стратегии. Временное влияние происходит из-за требований инвестора к ликвидности.
где:
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.
krg
| marketImpact
| fsolve
(Optimization Toolbox) | optimoptions
(Optimization Toolbox)