В этом примере показано, как провести стресс-тест на наборе запасов с помощью анализа операционных издержек от Kissell Research Group.
Оцените исторические затраты влияния на рынок и соответствующую долларовую стоимость для заданного диапазона дат.
Используйте торговые издержки, чтобы экранировать запасы в портфеле и оценить, что стоимость ликвидирует или покупает конкретное количество долей.
Анализируйте торговые издержки в течение энергозависимых промежутков времени, таких как финансовый кризис, мгновенный обвал или долговой кризис.
Чтобы получить доступ к примеру кода, введите 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 Research Group.
Создайте аналитический объект k
операционных издержек Kissell Research Group. Задайте начальные установки для даты, кода влияния на рынок и номера торговых дней.
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] 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.