exponenta event banner

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

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

См. также

|

Связанные темы