Ожидаемый Shortfall Estimation и Backtesting

Этот пример показывает, как выполнить оценку и backtesting моделей Expected Shortfall.

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

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

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

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

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

Оцените VaR и ES

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

В этом примере доверительный уровень VaR 97,5% используется, как требуется Основным Анализом Торговой Книги (FRTB) регулирование; см. [2].

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 на основе конечной выборки.

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

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

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

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

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

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

% 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

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

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

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

Zнеcond=1NpVart=1NXtItESt+1

где

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

  • Xt результат портфеля, то есть, портфель возвращаются или прибыль портфеля и потеря в течение периода t.

  • pVar вероятность отказа VaR, заданного как уровень с 1 var.

  • ESt предполагаемый ожидаемый недостаток в течение периода t.

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

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

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

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

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

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

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   

Столбец ObservedSeverity показывает среднее отношение потери для VaR на периодах, когда VaR был нарушен. Столбец ExpectedSeverity использует среднее отношение ES к VaR в течение периодов нарушения VaR. Для моделей "Historical" и "T 5" наблюдаемое и ожидаемое строгое обращение сопоставимо. Однако для метода "Historical", наблюдаемое количество отказов (столбец Failures) значительно выше, чем ожидаемое количество отказов (столбец Expected), приблизительно на 32% выше (см. столбец Ratio). И "Normal" и the "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')

Функция 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 назад тесты за восемь отдельных лет, заполненных исходным тестовым окном. Первый пользовательский светофор, описанный выше, добавляется к таблице результатов испытаний. Функция 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)];
      tRolling = [tRolling;runtests(ebt)];
   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);

Отобразите результаты, одна модель за один раз. Модель "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. Все модели выполняют плохо в 2 002, даже при том, что наблюдаемое строгое обращение является низким. Однако количество отказов 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 имеют большие потери, сопоставимые в значении. Однако ожидаемая серьезность в 1 998 намного выше (большие оценки 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')

Однако подобная визуализация с ожидаемым по сравнению с наблюдаемым количеством отказов VaR показывает, что метод "Historical" имеет тенденцию быть нарушенным намного больше раз, чем ожидалось. Например, даже при том, что в 2 002 ожидаемое среднее отношение серьезности очень близко к наблюдаемому, количество отказов 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')

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

Поддержка объектов esbacktestbysim три основанных на симуляции ES назад тестирует. esbacktestbysim запрашивает информацию распределения для результатов портфеля, а именно, имя распределения ("normal" или "t") и параметры распределения в течение каждого дня в тестовом окне. esbacktestbysim использует предоставленную информацию о распределении, чтобы запустить симуляции, чтобы определить критические значения. Тестами, поддержанными в esbacktestbysim, является conditional, unconditional и quantile. Это реализации тестов, предложенных в [1].

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

"Normal", "T 10" и модели "T 5" могут быть backtested или с основанными на таблице тестами в esbacktest, или с основанными на симуляции тестами в esbacktestbysim. В целях рисунка только "T 5" является backtested. Имя распределения ("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, и затем запустите отдельные тестовые функции. Функция 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   

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

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

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

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

[t,s] = conditional(ebts);
disp(t)
    PortfolioID    VaRID    VaRLevel    Conditional    ConditionalOnly    PValue    TestStatistic    CriticalValue    VaRTest    VaRTestResult    VaRTestPValue    Observations    Scenarios    TestLevel
    ___________    _____    ________    ___________    _______________    ______    _____________    _____________    _______    _____________    _____________    ____________    _________    _________

       "S&P"       "T 5"     0.975        accept           accept         0.243       -0.027397        -0.084492       "pof"        accept           0.34844           2087          1000         0.95   

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

whos s
  Name      Size              Bytes  Class     Attributes

  s         1x1000             8000  double              

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

Для теста conditional это - визуализация автономного условного теста (результат ConditionalOnly в приведенной выше таблице). Итоговый условный результат испытаний (столбец Conditional) зависит также от предварительного VaR backtest (столбец VaRTestResult).

figure;
histogram(s);
hold on;
plot(t.TestStatistic,0,'*');
hold off;
Title = sprintf('Conditional: %s, p-value: %4.3f',t.VaRID,t.PValue);
title(Title)

Подобные тестовые детали и визуализация могут быть получены для других тестов. Это результаты испытаний unconditional. Безусловная тестовая статистическая величина, о которой сообщает esbacktestbysim, является точно тем же самым как безусловной тестовой статистической величиной, о которой сообщает esbacktest. Однако критические значения, о которых сообщает esbacktestbysim, основаны на симуляции с помощью t распределения с 5 степенями свободы и данным местоположением и масштабными коэффициентами. Объект esbacktest дает аппроксимированные результаты испытаний для модели "T 5", тогда как результаты здесь специфичны для предоставленной информации о распределении.

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

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

Вот результаты для теста quantile.

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

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

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

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

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

Заключения

Контрастировать два ES backtesting объекты:

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

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

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

Ссылки

[1] Acerbi, C. и Б. Сзекели. "Бэктестинг ожидаемый недостаток". MSCI Inc., декабрь 2014.

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

[3] Макнейл, A., Р. Фрэй и П. Эмбречтс. Количественное управление рисками: Концепции, методы и инструменты. Издательство Принстонского университета. 2005.

[4] Rockafellar, R. T. и С. Урясев. "Условное выражение, Подверженное риску значения Общих Дистрибутивов Потерь". Журнал Банковского дела и Финансов. Издание 26, 2002, стр 1443-1471.

Localfunctions

function [VaR,ES] = hHistoricalVaRES(Sample,VaRLevel)
    % Compute historical VaR and ES
    % See [4] 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 [3] 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 [3] 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