В этом примере показано, как провести стресс-тест для набора акций с использованием анализа операционных затрат от Исследовательской группы Kissell.
Оцените исторические рыночные затраты и соответствующие долларовые значения для указанного диапазона дат.
Используйте торговые затраты для проверки акций в портфеле и оценки затрат на ликвидацию или покупку определенного количества акций.
Проанализируйте торговые издержки в нестабильные периоды времени, такие как финансовый кризис, внезапный крах или долговой кризис.
Для вызова кода примера введите edit KRGStressTestingExample.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);
Загрузка данных примера TradeDataStressTest из файла KRGExampleData.mat, который входит в состав Toolbox™ Datafeed.
load KRGExampleData TradeDataStressTest
Описание данных примера см. в разделе Наборы данных исследовательской группы Kissell.
Создание объекта анализа затрат транзакции Kissell Research Group k. Укажите начальные параметры для даты, кода влияния на рынок и количества торговых дней.
k = krg(miData,datetime('today'),1,250);Укажите диапазон дат с 1 мая 2015 года по 31 июля 2015 года.
startDate = '5/1/2015'; endDate = '7/31/2015';
Определение количества запасов numStocks в портфеле. Создание диапазона дат dateRange от указанных дат. Найти количество дней numDates в диапазоне дат.
numStocks = length(TradeDataStressTest.Symbol); dateRange = (datenum(startDate):datenum(endDate))'; numDates = length(dateRange);
Предварительно распределить таблицу выходных данных o.
outLength = numStocks*numDates; symbols = TradeDataStressTest.Symbol(:,ones(1,numDates)); sides = TradeDataStressTest.Side(:,ones(1,numDates)); dates = dateRange(:,ones(1,numStocks))'; o = table(symbols(:),sides(:),dates(:),NaN(outLength,1),NaN(outLength,1), ... 'VariableNames',{'Symbol','Side','Date','MI','MIDollar'});
Убедитесь, что количество общих ресурсов является положительным значением с помощью abs функция.
TradeDataStressTest.Shares = abs(TradeDataStressTest.Shares);
Преобразование торговой стратегии в процентное отношение к объемной торговой стратегии.
TradeDataStressTest.TradeTime = TradeDataStressTest.TradeTime ... .* TradeDataStressTest.ADV; TradeDataStressTest.POV = krg.tradetime2pov(TradeDataStressTest.TradeTime, ... TradeDataStressTest.Shares);
Оцените исторические рыночные затраты для каждого запаса в портфеле для диапазона дат с помощью marketImpact. Преобразование затрат, влияющих на рынок, из десятичных в местные доллары. Получение результирующих данных в таблице выходных данных o.
kk = 1; for ii = dateRange(1):dateRange(end) for jj = 1:numStocks k.MiCode = TradeDataStressTest.MICode(jj); k.MiDate = ii; o.MI(kk) = marketImpact(k,TradeDataStressTest(jj,:)); o.MIDollar(kk) = (TradeDataStressTest.Shares(jj) ... * TradeDataStressTest.Price(jj)) ... * o.MI(kk) /10000 * TradeDataStressTest.FXRate(jj); kk = kk + 1; end end
Просмотрите первые три строки выходных данных.
o(1:3,:)
ans =
Symbol Side Date MI MIDollar
______ ____ _________ _____ ________
'A' 1.00 736085.00 3.84 384.31
'B' 1.00 736085.00 11.43 14292.24
'C' 1.00 736085.00 32.69 20430.65Выходные данные содержат следующие переменные:
Символ запаса
Сторона
Историческая дата торговли
Стоимость влияния на рынок за прошлые периоды в базисных точках
Стоимость за прошлые периоды воздействия на рынок в местных долларах
Получение ежедневных затрат, влияющих на рынок dailyCost. Определение количества дней numDays в выходных данных. Циклический анализ данных и суммирование затрат на рыночное воздействие для отдельных запасов за каждый день.
numDays = length(o.Date)/numStocks; idx = 1; for i = 1:numDays dailyCost.Date(i) = o.Date(idx); dailyCost.DailyMiCost(i) = sum(o.MI(idx:idx+(numStocks-1))); idx = idx+numStocks; end
Просмотрите ежедневные затраты, влияющие на рынок, в указанном диапазоне дат. Эта цифра показывает, как со временем изменяются издержки, влияющие на рынок.
plot(b.Date,b.DailyMiCost)
ylabel({'Daily Cost','(bps)'})
title('Daily Market-Impact Cost Stress Test')
xlabel('Date')
grid on
xData = linspace(b.Date(1),b.Date(92),11);
a = gca;
a.XAxis.TickLabels = datestr(xData,'mm/dd/yyyy');
a.XTickLabelRotation = 45;

[1] Кисселл, Роберт. «Создание динамических предпродажных моделей: за черным ящиком». Журнал торгов. Том 6, номер 4, осень 2011, стр. 8-15.
[2] Кисселл, Роберт. «TCA в инвестиционном процессе: обзор». Журнал индексного инвестирования. Том 2, номер 1, лето 2011, стр. 60-64.
[3] Кисселл, Роберт. Наука алгоритмической торговли и управления портфелем. Кембридж, Массачусетс: Elsevier/Академическая пресса, 2013.
[4] Чон, Грейс и Роберт Кисселл. «Применение транзакционных издержек в процессе оптимизации портфеля». Журнал торгов. Том 11, номер 2, весна 2016, стр. 11-20.