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

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

См. также

|

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте