Проведите стресс-тест на портфеле

В этом примере показано, как провести стресс-тест на наборе запасов с помощью анализа операционных издержек от 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.

Смотрите также

|

Похожие темы