В этом примере показано, как провести стресс-тест на наборе запасов с помощью анализа транзакционных издержек от исследовательской группы 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
, который входит в комплект поставки Datafeed Toolbox™.
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] Кисселл, Роберт. Создание динамических моделей 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.