Ожидаемая оценка дефицита и обратная проверка

Этот пример показывает, как выполнить оценку и обратную проверку моделей Ожидаемого дефицита.

Значения риска (VaR) и ожидаемый дефицит (ES) должны быть оценены вместе, потому что оценка ES зависит от оценки VaR. Используя исторические данные, этот пример оценивает VaR и ES в тестовом окне, используя исторические и параметрические подходы VaR. Параметрический VaR вычисляется в предположении нормального и t распределений.

Этот пример запускает обратные тесты ES, поддерживаемые в esbacktest, esbacktestbysim, и esbacktestbyde функциональность для оценки эффективности моделей ES в тестовом окне.

The esbacktest объект не требует никакой информации о распределении. Как и varbacktest объект, esbacktest объект принимает только тестовые данные как входные. Входы для esbacktest включать портфельные данные, данные VaR и соответствующий уровень VaR, а также данные ES, поскольку это то, что проверено назад. Как varbacktest, esbacktest запускает тесты для одного портфолио, но может вернуть несколько моделей и несколько уровней VaR сразу. The esbacktest объект использует предварительно вычисленные таблицы критических значений, чтобы определить, должны ли модели быть отклонены. Эти табличные тесты могут быть применены в качестве приблизительных тестов для любой модели VaR. В этом примере они применяются к обратным тестовым историческим и параметрическим моделям VaR. Они могут использоваться для других подходов VaR, таких как модели Монте-Карло или Extreme-Value.

Напротив, esbacktestbysim и esbacktestbyde объектам требуется информация о распределении, а именно имя распределения (normal или t) и параметры распределения для каждого дня в тестовом окне. esbacktestbysim и esbacktestbyde можно вернуть только одну модель за раз, потому что они связаны с определенным распределением, хотя вы все еще можете вернуть несколько уровней VaR сразу. The esbacktestbysim объект реализует основанные на симуляции тесты и использует предоставленную информацию о распределении для запуска симуляций для определения критических значений. The esbacktestbyde объект реализует тесты, где критические значения получают либо из приближения с большой выборкой, либо из симуляции (конечная выборка). The conditionalDE тест в esbacktestbyde объектные тесты на независимость с течением времени, чтобы оценить, есть ли доказательства автокорреляции в серии потерь хвоста. Все другие тесты являются тестами серьезности, чтобы оценить, соответствует ли величина потерь хвоста предсказаниям модели. Оба esbacktestbysim и esbacktestbyde объекты поддерживают нормальные и t распределения. Эти тесты могут использоваться для любой модели, где базовое распределение результатов портфеля является нормальным или t, таких как экспоненциально взвешенное скользящее среднее значение (EWMA), дельта-гамма или обобщенные модели авторегрессивной условной гетероскедастичности (GARCH).

Для получения дополнительной информации о методологии обратного тестирования ES смотрите esbacktest, esbacktestbysim, и esbacktestbyde, также см. [1], [2], [3] и [5] в ссылках.

Оценка VaR и ES

Набор данных, использованный в этом примере, содержит исторические данные для индекса S&P, охватывающего приблизительно 10 лет, с середины 1993 года по середину 2003 года. Размер окна оценки определяется как 250 дней, так что полный год данных используется для оценки как исторического VaR, так и волатильности. Тестовое окно в этом примере проходит с начала 1995 года по конец 2002 года.

На протяжении всего этого примера используется уровень доверия VaR 97,5%, как того требует регламент Фундаментального обзора торговой книги (FRTB); см. [4].

load VaRExampleData.mat
Returns = tick2ret(sp);
DateReturns = dates(2:end);
SampleSize = length(Returns);

TestWindowStart = find(year(DateReturns)==1995,1);
TestWindowEnd = find(year(DateReturns)==2002,1,'last');
TestWindow = TestWindowStart:TestWindowEnd;
EstimationWindowSize = 250;

DatesTest = DateReturns(TestWindow);
ReturnsTest = Returns(TestWindow);

VaRLevel = 0.975;

Исторический VaR является непараметрическим подходом для оценки VaR и ES из исторических данных в окне оценки. VaR является процентилем, и существуют альтернативные способы оценить процентиль распределения на основе конечной выборки. Одним из распространенных подходов является использование prctile функция. Альтернативным подходом является сортировка данных и определение точки разреза на основе размера выборки и доверительного уровня VaR. Точно так же существуют альтернативные подходы к оценке ES на основе конечной выборки.

The hHistoricalVaRES локальная функция в нижней части этого примера использует подход с конечной выборкой для оценки VaR и ES согласно методологии, описанной в [7]. В конечной выборке количество наблюдений ниже VaR может не совпадать с общей вероятностью хвоста, соответствующей уровню VaR. Для примера для 100 наблюдений и уровня VaR 97,5%, хвостовые наблюдения составляют 2, что составляет 2% от выборки, однако желаемая вероятность хвоста составляет 2,5%. Это может быть еще хуже для выборок с повторяющимися наблюдаемыми значениями, например, если бы второе и третье сортированные значения были одинаковыми, оба равными VaR, тогда только наименьшее наблюдаемое значение в выборке имело бы значение меньше, чем VaR, и это 1% образца, а не желаемое 2,5%. Метод, реализованный в hHistoricalVaRES производит коррекцию так, чтобы конечная вероятность всегда соответствовала уровню VaR; для получения дополнительной информации см. раздел [7].

VaR_Hist = zeros(length(TestWindow),1);
ES_Hist = zeros(length(TestWindow),1);

for t = TestWindow
   
   i = t - TestWindowStart + 1;
   EstimationWindow = t-EstimationWindowSize:t-1;
   
   [VaR_Hist(i),ES_Hist(i)] = hHistoricalVaRES(Returns(EstimationWindow),VaRLevel);
   
end

Следующий график показывает ежедневные возвраты, и VaR и ES, оцененные с помощью исторического метода.

figure;
plot(DatesTest,ReturnsTest,DatesTest,-VaR_Hist,DatesTest,-ES_Hist)
legend('Returns','VaR','ES','Location','southeast')
title('Historical VaR and ES')
grid on

Figure contains an axes. The axes with title Historical VaR and ES contains 3 objects of type line. These objects represent Returns, VaR, ES.

Для параметрических моделей должна быть вычислена волатильность возвратов. Учитывая волатильность, VaR и ES могут быть вычислены аналитически.

В этом примере принято нулевое среднее, но может быть оценено подобным образом.

Для нормального распределения предполагаемая волатильность используется непосредственно для получения VaR и ES. Для распределения шкалы местоположения t параметр шкалы вычисляется из предполагаемой волатильности и степеней свободы.

The hNormalVaRES и hTVaRES локальные функции берут в качестве входов параметры распределения (которые могут быть переданы как массивы) и возвращают VaR и ES. Эти локальные функции используют аналитические выражения для VaR и ES для нормальных и t распределений шкалы местоположения, соответственно; для получения дополнительной информации см. [6].

% Estimate volatility over the test window
Volatility = zeros(length(TestWindow),1);

for t = TestWindow
   
   i = t - TestWindowStart + 1;
   EstimationWindow = t-EstimationWindowSize:t-1;
   
   Volatility(i) = std(Returns(EstimationWindow));
   
end

% Mu=0 in this example
Mu = 0;

% Sigma (standard deviation parameter) for normal distribution = Volatility
SigmaNormal = Volatility;
% Sigma (scale parameter) for t distribution = Volatility * sqrt((DoF-2)/DoF)
SigmaT10 = Volatility*sqrt((10-2)/10);
SigmaT5 = Volatility*sqrt((5-2)/5);

% Estimate VaR and ES, normal
[VaR_Normal,ES_Normal] = hNormalVaRES(Mu,SigmaNormal,VaRLevel);
% Estimate VaR and ES, t with 10 and 5 degrees of freedom
[VaR_T10,ES_T10] = hTVaRES(10,Mu,SigmaT10,VaRLevel);
[VaR_T5,ES_T5] = hTVaRES(5,Mu,SigmaT5,VaRLevel);

Следующий график показывает ежедневные возвраты, и VaR и ES, оцененные с помощью нормального метода.

figure;
plot(DatesTest,ReturnsTest,DatesTest,-VaR_Normal,DatesTest,-ES_Normal)
legend('Returns','VaR','ES','Location','southeast')
title('Normal VaR and ES')
grid on

Figure contains an axes. The axes with title Normal VaR and ES contains 3 objects of type line. These objects represent Returns, VaR, ES.

Для параметрического подхода те же шаги могут использоваться, чтобы оценить VaR и ES для альтернативных подходов, таких как EWMA, дельта-гамма- приближения и модели GARCH. Во всех этих параметрических подходах волатильность оценивается каждый день, либо из обновления EWMA, из дельта-гамма- приближения, либо как условная волатильность модели GARCH. Волатильность может затем использоваться, как выше, чтобы получить оценки VaR и ES для нормальных или t распределений шкалы местоположения.

ES Backtest без информации о распределении

The esbacktest объект предлагает два обратных теста для моделей ES. Оба теста используют безусловную статистику тестов, предложенную Acerbi и Szekely в [1], представленную

Zuncond=1NpVaRt=1NXtItESt+1

где

  • N - количество временных периодов в тестовом окне.

  • Xt - результат портфеля, то есть возврат портфеля или прибыль и убыток портфеля за период t.

  • pVaR - вероятность отказа VaR, заданная как 1-VaR уровень.

  • ESt - предполагаемый дефицит на период t.

  • It - индикатор отказа VaR на период t со значением 1, если Xt<-VaRt, и 0 в противном случае.

Ожидаемое значение для этой статистики теста 0, и это отрицательно, когда есть доказательства недооценки риска. Чтобы определить, насколько отрицательно должно быть отклонение модели, необходимы критические значения и для определения критических значений, необходимы распределительные допущения для результатов портфеля Xt.

Безусловная тестовая статистика оказывается стабильной в области значений распределительных допущений для Xtот тонкохвостых распределений, таких как normal, до тяжелохвостых распределений, таких как t с низкими степенями свободы (высокие одинарные цифры). Только самые тяжелые распределения t (низкие одинарные цифры) приводят к более заметным различиям в критических значениях. Для получения дополнительной информации см. раздел [1].

The esbacktest объект использует в своих интересах стабильность критических значений безусловной тестовой статистики и использует таблицы предварительно вычисленных критических значений для запуска обратных тестов ES. esbacktest имеет два набора таблиц критических значений. Первый набор критических значений принимает, что результаты портфеля Xt следовать стандартному нормальному распределению; это значение unconditionalNormal тест. Второй набор критических значений использует самые тяжелые хвосты, он принимает, что результаты портфеля Xt следовать распределению t с 3 степенями свободы; это значение unconditionalT тест.

Безусловная тестовая статистика чувствительна как к серьезности отказов VaR относительно оценки ES, так и к количеству отказов VaR (сколько раз нарушается VaR). Поэтому один, но очень большой отказ VaR относительно ES (или только очень мало больших потерь) может вызвать отказ модели в конкретном временном окне. Большие потери в день, когда оценка ES также велика, могут не повлиять на результаты теста так сильно, как большие потери, когда ES меньше. И модель также может быть отклонена в периоды со многими отказами VaR, даже если все нарушения VaR относительно малы и лишь немного выше VaR. Обе ситуации проиллюстрированы в этом примере.

The esbacktest объект принимает в качестве входов тестовые данные, но никакая информация о распределении не предоставляется esbacktest. Опционально можно задать идентификаторы для портфеля и для каждой из моделей VaR и ES, проверяемых назад. Хотя идентификаторы модели в этом примере действительно имеют ссылки на распределение (например "normal" или "t 10"), это только метки, используемые в целях отчетности. Тесты не используют тот факт, что первая модель является историческим методом VaR или что другие модели являются альтернативными параметрическими моделями VaR. Параметры распределения, используемые для оценки VaR и ES в предыдущем разделе, не передаются esbacktest, и никоим образом не используются в этом разделе. Эти параметры, однако, должны быть предусмотрены для основанных на симуляции тестов, поддерживаемых в esbacktestbysim объект, обсуждаемый в разделе Simulation-Based Tests, и для тестов, поддерживаемых в esbacktestbyde объект, обсуждаемый в разделе Large-Sample и Simulation Test.

ebt = esbacktest(ReturnsTest,[VaR_Hist VaR_Normal VaR_T10 VaR_T5],...
   [ES_Hist ES_Normal ES_T10 ES_T5],'PortfolioID',"S&P, 1995-2002",...
   'VaRID',["Historical" "Normal","T 10","T 5"],'VaRLevel',VaRLevel);
disp(ebt)
  esbacktest with properties:

    PortfolioData: [2087x1 double]
          VaRData: [2087x4 double]
           ESData: [2087x4 double]
      PortfolioID: "S&P, 1995-2002"
            VaRID: ["Historical"    "Normal"    "T 10"    "T 5"]
         VaRLevel: [0.9750 0.9750 0.9750 0.9750]

Запустите анализ, запустив summary функция.

s = summary(ebt);
disp(s)
      PortfolioID          VaRID        VaRLevel    ObservedLevel    ExpectedSeverity    ObservedSeverity    Observations    Failures    Expected    Ratio     Missing
    ________________    ____________    ________    _____________    ________________    ________________    ____________    ________    ________    ______    _______

    "S&P, 1995-2002"    "Historical"     0.975         0.96694            1.3711              1.4039             2087           69        52.175     1.3225       0   
    "S&P, 1995-2002"    "Normal"         0.975         0.97077            1.1928               1.416             2087           61        52.175     1.1691       0   
    "S&P, 1995-2002"    "T 10"           0.975         0.97173            1.2652              1.4063             2087           59        52.175     1.1308       0   
    "S&P, 1995-2002"    "T 5"            0.975         0.97173              1.37              1.4075             2087           59        52.175     1.1308       0   

The ObservedSeverity столбец показывает среднее отношение потерь к VaR за периоды, когда VaR был нарушен. The ExpectedSeverity столбец использует среднее отношение ES к VaR для периодов нарушения VaR. Для "Historical" и "T 5" модели, наблюдаемые и ожидаемые степени тяжести сопоставимы. Однако для "Historical" метод, наблюдаемое количество отказов (Failures столбец) значительно выше ожидаемого количества отказов (Expected столбец), примерно на 32% выше (см. Ratio столбец). Оба "Normal" и "T 10" модели наблюдали степени тяжести намного выше, чем ожидаемые степени тяжести.

figure;

subplot(2,1,1)
bar(categorical(s.VaRID),[s.ExpectedSeverity,s.ObservedSeverity])
ylim([1 1.5])
legend('Expected','Observed','Location','southeast')
title('Average Severity Ratio')

subplot(2,1,2)
bar(categorical(s.VaRID),[s.Expected,s.Failures])
ylim([40 70])
legend('Expected','Observed','Location','southeast')
title('Number of VaR Failures')

Figure contains 2 axes. Axes 1 with title Average Severity Ratio contains 2 objects of type bar. These objects represent Expected, Observed. Axes 2 with title Number of VaR Failures contains 2 objects of type bar. These objects represent Expected, Observed.

The runtests функция запускает все тесты и сообщает только о принятии или отклонении результата. Безусловный нормальный тест более строг. Для 8-летнего тестового окна здесь две модели проваливают оба теста ("Historical" и "Normal"), одна модель пропускает безусловный нормальный тест, но проходит безусловный тест t ("T 10"), и одна модель проходит оба теста ("T 5").

t = runtests(ebt);
disp(t)
      PortfolioID          VaRID        VaRLevel    UnconditionalNormal    UnconditionalT
    ________________    ____________    ________    ___________________    ______________

    "S&P, 1995-2002"    "Historical"     0.975            reject               reject    
    "S&P, 1995-2002"    "Normal"         0.975            reject               reject    
    "S&P, 1995-2002"    "T 10"           0.975            reject               accept    
    "S&P, 1995-2002"    "T 5"            0.975            accept               accept    

Дополнительные сведения о тестах можно получить, вызвав отдельные тестовые функции. Вот подробности для unconditionalNormal тест.

t = unconditionalNormal(ebt);
disp(t)
      PortfolioID          VaRID        VaRLevel    UnconditionalNormal     PValue      TestStatistic    CriticalValue    Observations    TestLevel
    ________________    ____________    ________    ___________________    _________    _____________    _____________    ____________    _________

    "S&P, 1995-2002"    "Historical"     0.975            reject           0.0047612      -0.37917         -0.23338           2087          0.95   
    "S&P, 1995-2002"    "Normal"         0.975            reject           0.0043287      -0.38798         -0.23338           2087          0.95   
    "S&P, 1995-2002"    "T 10"           0.975            reject            0.037528       -0.2569         -0.23338           2087          0.95   
    "S&P, 1995-2002"    "T 5"            0.975            accept             0.13069      -0.16179         -0.23338           2087          0.95   

Вот подробности для unconditionalT тест.

t = unconditionalT(ebt);
disp(t)
      PortfolioID          VaRID        VaRLevel    UnconditionalT     PValue     TestStatistic    CriticalValue    Observations    TestLevel
    ________________    ____________    ________    ______________    ________    _____________    _____________    ____________    _________

    "S&P, 1995-2002"    "Historical"     0.975          reject        0.017032      -0.37917         -0.27415           2087          0.95   
    "S&P, 1995-2002"    "Normal"         0.975          reject        0.015375      -0.38798         -0.27415           2087          0.95   
    "S&P, 1995-2002"    "T 10"           0.975          accept        0.062835       -0.2569         -0.27415           2087          0.95   
    "S&P, 1995-2002"    "T 5"            0.975          accept         0.16414      -0.16179         -0.27415           2087          0.95   

Использование тестов для более расширенного анализа

В этом разделе показано, как использовать esbacktest объект для запуска пользовательских тестов светофора, а также для запуска тестов в окнах качения.

Одним из способов определения теста светофора является объединение результатов безусловного нормального и безусловного тестов t. Поскольку безусловная норма является более строгой, можно задать тест светофора с этими уровнями:

  • Зеленый: Модель проходит как безусловные нормальные, так и безусловные t-тесты.

  • Желтый: Модель не проходит безусловный нормальный тест, но проходит безусловный тест t.

  • Красный: Модель отклоняется как безусловными нормальными, так и безусловными t-тестами.

t = runtests(ebt);
TLValue = (t.UnconditionalNormal=='reject')+(t.UnconditionalT=='reject');
t.TrafficLight = categorical(TLValue,0:2,{'green','yellow','red'},'Ordinal',true);
disp(t)
      PortfolioID          VaRID        VaRLevel    UnconditionalNormal    UnconditionalT    TrafficLight
    ________________    ____________    ________    ___________________    ______________    ____________

    "S&P, 1995-2002"    "Historical"     0.975            reject               reject           red      
    "S&P, 1995-2002"    "Normal"         0.975            reject               reject           red      
    "S&P, 1995-2002"    "T 10"           0.975            reject               accept           yellow   
    "S&P, 1995-2002"    "T 5"            0.975            accept               accept           green    

Альтернативный пользовательский тест светофора может использовать один тест, но на разных уровнях доверия теста:

  • Зеленый: Результатом является 'accept'с тестовым уровнем 95%.

  • Желтый: Результатом является 'reject' на 95% -ном тестовом уровне, но 'accept'на 99%.

  • Красный: Результат 'reject' при тестовом уровне 99%.

Аналогичный тест предложен в [1] с высоким уровнем тестирования 99,99%.

t95 = runtests(ebt); % 95% is the default test level value
t99 = runtests(ebt,'TestLevel',0.99);
TLValue = (t95.UnconditionalNormal=='reject')+(t99.UnconditionalNormal=='reject');
tRolling = t95(:,1:3);
tRolling.UnconditionalNormal95 = t95.UnconditionalNormal;
tRolling.UnconditionalNormal99 = t99.UnconditionalNormal;
tRolling.TrafficLight = categorical(TLValue,0:2,{'green','yellow','red'},'Ordinal',true);
disp(tRolling)
      PortfolioID          VaRID        VaRLevel    UnconditionalNormal95    UnconditionalNormal99    TrafficLight
    ________________    ____________    ________    _____________________    _____________________    ____________

    "S&P, 1995-2002"    "Historical"     0.975             reject                   reject               red      
    "S&P, 1995-2002"    "Normal"         0.975             reject                   reject               red      
    "S&P, 1995-2002"    "T 10"           0.975             reject                   accept               yellow   
    "S&P, 1995-2002"    "T 5"            0.975             accept                   accept               green    

Результаты теста могут отличаться в разных окнах тестирования. Здесь годичное скользящее окно используется для запуска обратных тестов ES в течение восьми отдельных лет, охватываемых исходным тестовым окном. Первый пользовательский светофор, описанный выше, добавляется к таблице результатов тестирования. The summary функция также вызывается для каждого отдельного года, чтобы просмотреть историю серьезности и количество отказов VaR.

sRolling = table;
tRolling = table;
for Year = 1995:2002
   Ind = year(DatesTest)==Year;
   PortID = ['S&P, ' num2str(Year)];
   PortfolioData = ReturnsTest(Ind);
   VaRData = [VaR_Hist(Ind) VaR_Normal(Ind) VaR_T10(Ind) VaR_T5(Ind)];
   ESData = [ES_Hist(Ind) ES_Normal(Ind) ES_T10(Ind) ES_T5(Ind)];
   ebt = esbacktest(PortfolioData,VaRData,ESData,...
      'PortfolioID',PortID,'VaRID',["Historical" "Normal" "T 10" "T 5"],...
      'VaRLevel',VaRLevel);
   if Year == 1995
      sRolling = summary(ebt);
      tRolling = runtests(ebt);
   else
      sRolling = [sRolling;summary(ebt)]; %#ok<AGROW> 
      tRolling = [tRolling;runtests(ebt)]; %#ok<AGROW> 
   end
end

% Optional: Add the first user-defined traffic light test described above
TLValue = (tRolling.UnconditionalNormal=='reject')+(tRolling.UnconditionalT=='reject');
tRolling.TrafficLight = categorical(TLValue,0:2,{'green','yellow','red'},'Ordinal',true);

Отобразите результаты, по одной модели за раз. The "T 5" модель имеет лучшую эффективность в этих тестах (два "yellow"), и "Normal" моделируйте худшее (три "red"и один "yellow").

disp(tRolling(tRolling.VaRID=="Historical",:))
    PortfolioID       VaRID        VaRLevel    UnconditionalNormal    UnconditionalT    TrafficLight
    ___________    ____________    ________    ___________________    ______________    ____________

    "S&P, 1995"    "Historical"     0.975            accept               accept           green    
    "S&P, 1996"    "Historical"     0.975            reject               accept           yellow   
    "S&P, 1997"    "Historical"     0.975            reject               reject           red      
    "S&P, 1998"    "Historical"     0.975            accept               accept           green    
    "S&P, 1999"    "Historical"     0.975            accept               accept           green    
    "S&P, 2000"    "Historical"     0.975            accept               accept           green    
    "S&P, 2001"    "Historical"     0.975            accept               accept           green    
    "S&P, 2002"    "Historical"     0.975            reject               reject           red      
disp(tRolling(tRolling.VaRID=="Normal",:))
    PortfolioID     VaRID      VaRLevel    UnconditionalNormal    UnconditionalT    TrafficLight
    ___________    ________    ________    ___________________    ______________    ____________

    "S&P, 1995"    "Normal"     0.975            accept               accept           green    
    "S&P, 1996"    "Normal"     0.975            reject               reject           red      
    "S&P, 1997"    "Normal"     0.975            reject               reject           red      
    "S&P, 1998"    "Normal"     0.975            reject               accept           yellow   
    "S&P, 1999"    "Normal"     0.975            accept               accept           green    
    "S&P, 2000"    "Normal"     0.975            accept               accept           green    
    "S&P, 2001"    "Normal"     0.975            accept               accept           green    
    "S&P, 2002"    "Normal"     0.975            reject               reject           red      
disp(tRolling(tRolling.VaRID=="T 10",:))
    PortfolioID    VaRID     VaRLevel    UnconditionalNormal    UnconditionalT    TrafficLight
    ___________    ______    ________    ___________________    ______________    ____________

    "S&P, 1995"    "T 10"     0.975            accept               accept           green    
    "S&P, 1996"    "T 10"     0.975            reject               reject           red      
    "S&P, 1997"    "T 10"     0.975            reject               accept           yellow   
    "S&P, 1998"    "T 10"     0.975            accept               accept           green    
    "S&P, 1999"    "T 10"     0.975            accept               accept           green    
    "S&P, 2000"    "T 10"     0.975            accept               accept           green    
    "S&P, 2001"    "T 10"     0.975            accept               accept           green    
    "S&P, 2002"    "T 10"     0.975            reject               reject           red      
disp(tRolling(tRolling.VaRID=="T 5",:))
    PortfolioID    VaRID    VaRLevel    UnconditionalNormal    UnconditionalT    TrafficLight
    ___________    _____    ________    ___________________    ______________    ____________

    "S&P, 1995"    "T 5"     0.975            accept               accept           green    
    "S&P, 1996"    "T 5"     0.975            reject               accept           yellow   
    "S&P, 1997"    "T 5"     0.975            accept               accept           green    
    "S&P, 1998"    "T 5"     0.975            accept               accept           green    
    "S&P, 1999"    "T 5"     0.975            accept               accept           green    
    "S&P, 2000"    "T 5"     0.975            accept               accept           green    
    "S&P, 2001"    "T 5"     0.975            accept               accept           green    
    "S&P, 2002"    "T 5"     0.975            reject               accept           yellow   

2002 год является примером года с относительно небольшой степенью тяжести, но многие отказы VaR. Все модели работают плохо в 2002 году, хотя наблюдаемая степень тяжести низкая. Однако количество отказов VaR для некоторых моделей более чем в два раза превышает ожидаемое количество отказов VaR.

disp(summary(ebt))
    PortfolioID       VaRID        VaRLevel    ObservedLevel    ExpectedSeverity    ObservedSeverity    Observations    Failures    Expected    Ratio     Missing
    ___________    ____________    ________    _____________    ________________    ________________    ____________    ________    ________    ______    _______

    "S&P, 2002"    "Historical"     0.975         0.94636            1.2022                 1.2             261            14        6.525      2.1456       0   
    "S&P, 2002"    "Normal"         0.975         0.94636            1.1928              1.2111             261            14        6.525      2.1456       0   
    "S&P, 2002"    "T 10"           0.975         0.95019            1.2652              1.2066             261            13        6.525      1.9923       0   
    "S&P, 2002"    "T 5"            0.975         0.95019              1.37              1.2077             261            13        6.525      1.9923       0   

Следующий рисунок показывает данные по всему 8-летнему окну и коэффициенту серьезности по годам (ожидаемому и наблюдаемому) для "Historical" модель. Абсолютный размер потерь не так важен, как относительный размер по сравнению с ES (или эквивалентно, по сравнению с VaR). И 1997, и 1998 годы имеют большие потери, сопоставимые по величине. Однако ожидаемая степень тяжести в 1998 году намного выше (большие оценки ES). В целом, "Historical" метод, по-видимому, хорошо относится к коэффициентам тяжести.

sH = sRolling(sRolling.VaRID=="Historical",:);

figure;

subplot(2,1,1)
FailureInd = ReturnsTest<-VaR_Hist;
plot(DatesTest,ReturnsTest,DatesTest,-VaR_Hist,DatesTest,-ES_Hist)
hold on
plot(DatesTest(FailureInd),ReturnsTest(FailureInd),'.')
hold off
legend('Returns','VaR','ES','Location','best')
title('Historical VaR and ES')
grid on

subplot(2,1,2)
bar(1995:2002,[sH.ExpectedSeverity,sH.ObservedSeverity])
ylim([1 1.8])
legend('Expected','Observed','Location','best')
title('Yearly Average Severity Ratio, Historical VaR')

Figure contains 2 axes. Axes 1 with title Historical VaR and ES contains 4 objects of type line. These objects represent Returns, VaR, ES. Axes 2 with title Yearly Average Severity Ratio, Historical VaR contains 2 objects of type bar. These objects represent Expected, Observed.

Однако аналогичная визуализация с ожидаемым сравнением наблюдаемого числа отказов VaR показывает, что "Historical" метод имеет тенденцию нарушаться гораздо больше раз, чем ожидалось. Например, хотя в 2002 году ожидаемый средний коэффициент серьезности очень близок к наблюдаемому, количество отказов VaR более чем в два раза превысило ожидаемое число. Это затем приводит к непройденным тестам как для безусловных нормальных, так и для безусловных t-тестов.

figure;

subplot(2,1,1)
plot(DatesTest,ReturnsTest,DatesTest,-VaR_Hist,DatesTest,-ES_Hist)
hold on
plot(DatesTest(FailureInd),ReturnsTest(FailureInd),'.')
hold off
legend('Returns','VaR','ES','Location','best')
title('Historical VaR and ES')
grid on

subplot(2,1,2)
bar(1995:2002,[sH.Expected,sH.Failures])
legend('Expected','Observed','Location','best')
title('Yearly VaR Failures, Historical VaR')

Figure contains 2 axes. Axes 1 with title Historical VaR and ES contains 4 objects of type line. These objects represent Returns, VaR, ES. Axes 2 with title Yearly VaR Failures, Historical VaR contains 2 objects of type bar. These objects represent Expected, Observed.

Основанные на симуляции тесты

The esbacktestbysim объект поддерживает пять основанных на симуляции ES обратных тестов. esbacktestbysim требуется информация о распределении для результатов портфеля, а именно имя распределения ("normal" или "t") и параметры распределения для каждого дня в тестовом окне. esbacktestbysim использует предоставленную информацию о распределении для выполнения симуляций для определения критических значений. Тесты, поддерживаемые в esbacktestbysim являются conditional, unconditional, quantile, minBiasAbsolute, и minBiasRelative. Это реализации тестов, предложенных Acerbi и Szekely в [1] и [2], [3] на 2017 и 2019 годы.

The esbacktestbysim объект поддерживает нормальные и t распределения. Эти тесты могут использоваться для любой модели, где базовое распределение результатов портфеля является нормальным или t, таких как экспоненциально взвешенное скользящее среднее значение (EWMA), дельта-гамма или обобщенные модели авторегрессивной условной гетероскедастичности (GARCH).

Бэктесты ES обязательно аппроксимируются в том, что они чувствительны к ошибкам в предсказанном VaR. Однако минимально смещенный тест имеет лишь небольшую чувствительность к ошибкам VaR и чувствительность пруденциальна, в том смысле, что ошибки VaR приводят к более карательному тесту ES. Для получения дополнительной информации см. Acerbi-Szekely ([2], [3] за 2017 и 2019 годы). Когда информация о распределении доступна, рекомендуется минимально смещенный тест (см minBiasAbsolute, minBiasRelative).

The "Normal", "T 10", и "T 5" модели могут быть проверены с помощью основанных на симуляции тестов в esbacktestbysim. В рисунок только "T 5" проверено назад. The распределения имени ("t") и параметры (степени свободы, местоположение и шкала) предоставляются при esbacktestbysim создается объект.

rng('default'); % for reproducibility; the esbacktestbysim constructor runs a simulation
ebts = esbacktestbysim(ReturnsTest,VaR_T5,ES_T5,"t",'DegreesOfFreedom',5,...
   'Location',Mu,'Scale',SigmaT5,...
   'PortfolioID',"S&P",'VaRID',"T 5",'VaRLevel',VaRLevel);

Рекомендуемый рабочий процесс тот же: сначала запустите summary , затем запустите runtests , а затем запустите отдельные тестовые функции.

The summary функция предоставляет точно такую же информацию, как и summary функция от esbacktest.

s = summary(ebts);
disp(s)
    PortfolioID    VaRID    VaRLevel    ObservedLevel    ExpectedSeverity    ObservedSeverity    Observations    Failures    Expected    Ratio     Missing
    ___________    _____    ________    _____________    ________________    ________________    ____________    ________    ________    ______    _______

       "S&P"       "T 5"     0.975         0.97173             1.37               1.4075             2087           59        52.175     1.1308       0   

The runtests функция показывает конечный результат принятия или отклонения.

t = runtests(ebts);
disp(t)
    PortfolioID    VaRID    VaRLevel    Conditional    Unconditional    Quantile    MinBiasAbsolute    MinBiasRelative
    ___________    _____    ________    ___________    _____________    ________    _______________    _______________

       "S&P"       "T 5"     0.975        accept          accept         accept         accept             accept     

Дополнительные подробности о результатах теста получаются по вызову отдельных тестовых функций. Для примера вызовите minBiasAbsolute тест. Первый выход, t, имеет результаты теста и дополнительные детали, такие как p-значение, статистика теста и так далее. Второй выход, s, содержит моделируемые тестовые статистические значения, предполагающие, что распределительные допущения верны. Для примера, esbacktestbysim сгенерировали 1000 сценариев результатов портфеля в этом случае, где каждый сценарий является серией 2087 наблюдений, моделируемых из t случайных переменных с 5 степенями свободы и заданными параметрами местоположения и шкалы. Моделируемые значения, возвращенные в необязательном s выходы показывают типичные значения тестовой статистики, если распределительные допущения верны. Это моделируемая статистика, используемая для определения значимости тестов, то есть сообщенные критические значения и p-значения.

[t,s] = minBiasAbsolute(ebts);
disp(t)
    PortfolioID    VaRID    VaRLevel    MinBiasAbsolute    PValue    TestStatistic    CriticalValue    Observations    Scenarios    TestLevel
    ___________    _____    ________    _______________    ______    _____________    _____________    ____________    _________    _________

       "S&P"       "T 5"     0.975          accept         0.299      -0.00080059      -0.0030373          2087          1000         0.95   
whos s
  Name      Size              Bytes  Class     Attributes

  s         1x1000             8000  double              

Выберите тест, чтобы показать результаты теста и визуализировать значимость тестов. Гистограмма показывает распределение моделируемой тестовой статистики, а звездочка - значение тестовой статистики для фактических возвратов портфеля.

ESTestChoice = "MinBiasAbsolute";

switch ESTestChoice
   case 'MinBiasAbsolute'
      [t, s] = minBiasAbsolute (ebts);
   case 'MinBiasRelative'
      [t, s] = minBiasRelative (ebts);
   case 'Conditional'
      [t, s] = условный (ebts);
   case 'Unconditional'
      [t, s] = безоговорочно (ebts);
   case 'Quantile'
      [t, s] = квантиль (ebts);
end

disp (t)
    PortfolioID    VaRID    VaRLevel    MinBiasAbsolute    PValue    TestStatistic    CriticalValue    Observations    Scenarios    TestLevel
    ___________    _____    ________    _______________    ______    _____________    _____________    ____________    _________    _________

       "S&P"       "T 5"     0.975          accept         0.299      -0.00080059      -0.0030373          2087          1000         0.95   
figure;
histogram(s);
hold on;
plot(t.TestStatistic,0,'*');
hold off;
Title = sprintf('%s: %s, p-value: %4.3f',ESTestChoice,t.VaRID,t.PValue);
title(Title)

Figure contains an axes. The axes with title MinBiasAbsolute: T 5, p-value: 0.299 contains 2 objects of type histogram, line.

Безусловная статистическая величина теста, представленная esbacktestbysim в точности совпадает с безусловной тестовой статистикой, сообщаемой esbacktest. Однако критические значения, сообщенные esbacktestbysim основаны на симуляции с использованием распределения t с 5 степенями свободы и заданными параметрами местоположения и шкалы. The esbacktest объект дает приблизительные результаты тестирования для "T 5" модель, в то время как результаты здесь специфичны для предоставляемой информации о распределении. Кроме того, для conditional тест, это визуализация автономного условного теста (ConditionalOnly результат в таблице выше). Конечный условный результат теста (Conditional столбец) также зависит от предварительного обратного теста VaR (VaRTestResult столбец).

The "T 5" модель принята пятью тестами.

The esbacktestbysim объект предоставляет simulate функция для запуска новой симуляции. Например, если существует результат пограничного теста, где тестовая статистика близка к критическому значению, можно использовать simulate функция для симуляции новых сценариев. В случаях, когда требуется большая точность, можно запустить большую симуляцию.

The esbacktestbysim тесты могут быть проведены над скользящим окном, следуя тому же подходу, который описан выше для esbacktest. Пользовательские тесты светофора также могут быть определены, например, с помощью двух различных уровней доверия теста, аналогичных тому, что было сделано выше для esbacktest.

Большие тесты образцов и симуляции

The esbacktestbyde объект поддерживает два обратных теста ES с критическими значениями, определенными либо с большой выборкой приближения, либо с симуляцией (конечная выборка). esbacktestbyde требуется информация о распределении для результатов портфеля, а именно имя распределения ("normal" или "t") и параметры распределения для каждого дня в тестовом окне. Это не требует VaR данных ES. esbacktestbyde использует предоставленную информацию о распределении для отображения результатов портфеля в «ранги», то есть для применения кумулятивной функции распределения для отображения возвратов на значения в модуль интервале, где задана тестовая статистика. esbacktestbyde может определять критические значения при помощи приближения с большой выборкой или симуляции с конечной выборкой.

Тесты, поддерживаемые в esbacktestbyde являются conditionalDE и unconditionalDE. Это реализации тестов, предложенных Du и Escanciano в [3]. The unconditionalDE тесты и все тесты, ранее обсуждавшиеся в этом примере, являются тестами серьезности, которые оценивают, соответствует ли величина потерь хвоста предсказаниям модели. The conditionalDE тест, однако, является тестом на независимость с течением времени, который оценивает, есть ли доказательства автокорреляции в серии потерь хвоста.

The esbacktestbyde объект поддерживает нормальные и t распределения. Эти тесты могут использоваться для любой модели, где базовое распределение результатов портфеля является нормальным или t, таких как экспоненциально взвешенное скользящее среднее значение (EWMA), дельта-гамма или обобщенные модели авторегрессивной условной гетероскедастичности (GARCH).

The "Normal", "T 10", и "T 5" модели могут быть проверены с тестами в esbacktestbyde. В рисунок только "T 5" проверено назад. The распределения имени ("t") и параметры (DegreesOfFreedom, Location, и Scale) предоставляются, когда esbacktestbyde создается объект.

rng('default'); % for reproducibility; the esbacktestbyde constructor runs a simulation
ebtde = esbacktestbyde(ReturnsTest,"t",'DegreesOfFreedom',5,...
   'Location',Mu,'Scale',SigmaT5,...
   'PortfolioID',"S&P",'VaRID',"T 5",'VaRLevel',VaRLevel);

Рекомендуемый рабочий процесс тот же: сначала запустите summary , затем запустите runtests , а затем запустите отдельные тестовые функции. The summary функция предоставляет точно такую же информацию, как и summary функция от esbacktest.

s = summary(ebtde);
disp(s)
    PortfolioID    VaRID    VaRLevel    ObservedLevel    ExpectedSeverity    ObservedSeverity    Observations    Failures    Expected    Ratio     Missing
    ___________    _____    ________    _____________    ________________    ________________    ____________    ________    ________    ______    _______

       "S&P"       "T 5"     0.975         0.97173             1.37               1.4075             2087           59        52.175     1.1308       0   

The runtests функция показывает конечный результат принятия или отклонения.

t = runtests(ebtde);
disp(t)
    PortfolioID    VaRID    VaRLevel    ConditionalDE    UnconditionalDE
    ___________    _____    ________    _____________    _______________

       "S&P"       "T 5"     0.975         reject            accept     

Дополнительные подробности о результатах теста получаются по вызову отдельных тестовых функций.

t = conditionalDE(ebtde);
disp(t)
    PortfolioID    VaRID    VaRLevel    ConditionalDE      PValue      TestStatistic    CriticalValue    AutoCorrelation    Observations    CriticalValueMethod    NumLags    Scenarios    TestLevel
    ___________    _____    ________    _____________    __________    _____________    _____________    _______________    ____________    ___________________    _______    _________    _________

       "S&P"       "T 5"     0.975         reject        0.00034769       12.794           3.8415           0.078297            2087          "large-sample"          1          NaN         0.95   

По умолчанию критические значения определяются приближением с большой выборкой. Критические значения, основанные на конечном выборочном распределении, оцененном с помощью симуляции, доступны при использовании 'CriticalValueMethod' необязательный аргумент пары "имя-значение".

[t,s] = conditionalDE(ebtde,'CriticalValueMethod','simulation');
disp(t)
    PortfolioID    VaRID    VaRLevel    ConditionalDE    PValue    TestStatistic    CriticalValue    AutoCorrelation    Observations    CriticalValueMethod    NumLags    Scenarios    TestLevel
    ___________    _____    ________    _____________    ______    _____________    _____________    _______________    ____________    ___________________    _______    _________    _________

       "S&P"       "T 5"     0.975         reject         0.01        12.794           3.7961           0.078297            2087           "simulation"           1         1000         0.95   

Второй выход, s, содержит моделируемые тестовые статистические значения. Следующая визуализация полезна для сравнения того, насколько хорошо моделируемое распределение конечной выборки совпадает с приближением большой выборки. График показывает, что конец распределения тестовой статистики немного тяжелее для основанного на симуляции (конечная выборка) распределения. Это означает, что основанная на симуляции версия тестов является более толерантной и не будет отклоняться в некоторых случаях, когда результаты приближения с большой выборкой отклоняются. Насколько близко совпадают большой выборки и распределения симуляции, зависит не только от количества наблюдений в тестовом окне, но и от доверительного уровня VaR (более высокие уровни VaR приводят к более тяжелым хвостам в распределении конечной выборки).

xLS = 0:0.05:30;
pdfLS = chi2pdf(xLS,t.NumLags);
histogram(s,'Normalization',"pdf")
hold on
plot(xLS,pdfLS)
hold off
ylim([0 0.1])
legend({'Simulation','Large-Sample'})
Title = sprintf('Conditional Test Distribution\nVaR Level: %g%%, Sample Size = %d',VaRLevel*100,t.Observations);
title(Title)

Figure contains an axes. The axes with title Conditional Test Distribution VaR Level: 97.5%, Sample Size = 2087 contains 2 objects of type histogram, line. These objects represent Simulation, Large-Sample.

Аналогичные шаги могут использоваться, чтобы увидеть детали на unconditionalDE тест, и сравнить результаты большой выборки и основанные на симуляции.

The esbacktestbyde объект предоставляет simulate функция для запуска новой симуляции. Например, если существует результат пограничного теста, где тестовая статистика близка к критическому значению, можно использовать simulate функция для симуляции новых сценариев. Кроме того, по умолчанию в симуляции сохраняются результаты до 5 лагов для условного теста, поэтому, если необходимы основанные на симуляции результаты для большего количества лагов, необходимо использовать simulate функция.

Если тесты приближения с большой выборкой являются единственными тестами, которые вам нужны, потому что они надежны для определенного размера выборки и уровня VaR, можно отключить симуляцию при создании esbacktestbyde объект при помощи 'Simulate' необязательный вход.

The esbacktestbyde тесты могут быть проведены над скользящим окном, следуя тому же подходу, который описан выше для esbacktest. Можно также задать тесты светофора, для примера можно использовать два различных уровня тестового доверия, аналогичных тому, что было сделано выше для esbacktest.

Заключения

Чтобы противопоставить три объекта обратного тестирования ES:

  • The esbacktest объект используется для широкой области значений распределительных допущений: исторических VaR, параметрических VaR, Monte-Carlo VaR или экстремально-ценностных моделей. Однако esbacktest предлагает приблизительные результаты тестирования, основанные на двух изменениях одного и того же теста: безусловная статистика теста с двумя различными наборами предварительно вычисленных критических значений (unconditionalNormal и unconditionalT).

  • The esbacktestbysim объект используется для параметрических методов с нормальным и t распределениями (который включает EWMA, GARCH и дельта-гамма) и требует параметров распределения в качестве входов. esbacktestbysim предлагает пять различных тестов (conditional, unconditional, quantile, minBiasAbsolute, и minBiasRelative и критические значения для этих тестов моделируются с помощью предоставляемой вами информации о распределении, и, следовательно, являются более точными. Хотя все бэктесты ES чувствительны к ошибкам расчета VaR, минимально смещенный тест имеет только небольшую чувствительность и рекомендуется (см. Acerbi-Szekely 2017 и 2019 для получения дополнительной информации [2], [3]).

  • The esbacktestbyde объект также используется для параметрических методов с нормальным и t распределениями (которые включают EWMA, GARCH и дельта-гамма) и требует параметров распределения в качестве входов. esbacktestbyde содержит серьезность (unconditionalDE) и независимость от времени (conditionalDE) тесты и он имеет удобство большой-образец, быстрая версия тестов. The conditionalDE тест является единственным тестом на независимость с течением времени для моделей ES среди всех тестов, поддерживаемых в этих трех классах.

Как показано в этом примере, все три объекта обратного тестирования ES обеспечивают функциональность для создания отчетов о серьезностях, отказах VaR и информации о результатах тестирования. Три объекта ES backtest обеспечивают гибкость при построении на них. Для примера можно создать пользовательские тесты светофора и запустить анализ обратного тестирования ES в окнах качения.

Ссылки

[1] Acerbi, C. и B. Szekely. «Ожидаемый дефицит после тестирования». MSCI Inc., Декабрь 2014 года.

[2] Acerbi, C. и B. Szekely. "Общие свойства тестируемой статистики. Электронный журнал SSRN. Январь 2017 года.

[3] Acerbi, C. и B. Szekely. «Минимально предвзятый бэктест для ES». Риск. Сентябрь 2019 года.

[4] Базельский комитет по банковскому надзору. «Минимальные требования к капиталу для рыночного риска». Январь 2016, https://www.bis.org/bcbs/publ/d352.htm

[5] Du, Z., and J. C. Escanciano. «Ожидаемая нехватка тестов: учет хвостового риска». Наука менеджмента. Том 63, Выпуск 4, Апрель 2017.

[6] Макнил, А., Р. Фрей и П. Эмбрехтс. Количественное управление рисками: концепции, методы и инструменты. Пресса Принстонского университета. 2005.

[7] Рокафеллар, Р. Т. и С. Урясев. «Условная стоимость риска для общих распределений потерь». Журнал банковского дела и финансов. Том 26, 2002, с. 1443-1471.

Локальные функции

function [VaR,ES] = hHistoricalVaRES(Sample,VaRLevel)
    % Compute historical VaR and ES
    % See [7] for technical details

    % Convert to losses
    Sample = -Sample;
    
    N = length(Sample);
    k = ceil(N*VaRLevel);
    
    z = sort(Sample);
    
    VaR = z(k);
    
    if k < N
       ES = ((k - N*VaRLevel)*z(k) + sum(z(k+1:N)))/(N*(1 - VaRLevel));
    else
       ES = z(k);
    end
end

function [VaR,ES] = hNormalVaRES(Mu,Sigma,VaRLevel)
    % Compute VaR and ES for normal distribution
    % See [6] for technical details
    
    VaR = -1*(Mu-Sigma*norminv(VaRLevel));
    ES = -1*(Mu-Sigma*normpdf(norminv(VaRLevel))./(1-VaRLevel));

end

function [VaR,ES] = hTVaRES(DoF,Mu,Sigma,VaRLevel)
    % Compute VaR and ES for t location-scale distribution
    % See [6] for technical details

    VaR = -1*(Mu-Sigma*tinv(VaRLevel,DoF));
    ES_StandardT = (tpdf(tinv(VaRLevel,DoF),DoF).*(DoF+tinv(VaRLevel,DoF).^2)./((1-VaRLevel).*(DoF-1)));
    ES = -1*(Mu-Sigma*ES_StandardT);

end

Похожие примеры

Подробнее о