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

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

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

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

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

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

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

Оцените VaR и ES

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

В этом примере доверительный уровень 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 на основе конечной выборки.

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 object. The axes object with title Historical VaR and ES contains 3 objects of type line. These objects represent Returns, VaR, ES.

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

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

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

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 object. The axes object 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 без информации о распределении

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, от распределений с тонким хвостом такой столь же нормальный, к распределениям с тяжелым хвостом, таким как 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, и для тестов, поддержан в esbacktestbyde объект обсужден в разделе Large-Sample и Simulation 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')

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

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)]; %#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);

Отобразите результаты, одна модель за один раз. "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')

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

Однако подобная визуализация с ожидаемым против наблюдаемого количества отказов 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')

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

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

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

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

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

"Normal", "T 10", и "T 5" модели могут быть backtested с основанными на симуляции тестами в 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    MinBiasAbsolute    MinBiasRelative
    ___________    _____    ________    ___________    _____________    ________    _______________    _______________

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

Дополнительные детали о результатах испытаний получены путем вызывания отдельных тестовых функций. Например, вызовите minBiasAbsolute тест. Первый выход, t, имеет результаты испытаний и дополнительные детали, такие как p-значение, тестовая статистическая величина, и так далее. Второй выход, s, содержит симулированные тестовые значения статистической величины, принимающие, что дистрибутивные предположения правильны. Например, esbacktestbysim сгенерированный 1 000 сценариев результатов портфеля в этом случае, где каждый сценарий является рядом 2 087 наблюдений, симулированных от t случайных переменных с 5 степенями свободы и данным местоположением и масштабными коэффициентами. Симулированные значения возвращены в дополнительном s типичные значения выхода show тестовой статистической величины, если дистрибутивные предположения правильны. Это симулированная статистика, используемая, чтобы определить значение тестов, то есть, критических значений, о которых сообщают, и 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 object. The axes object with title MinBiasAbsolute: T 5, p-value: 0.299 contains 2 objects of type histogram, line.

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

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

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

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

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

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

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

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

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

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 object. The axes object 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 протестируйте, и сравнить большую выборку и основанные на симуляции результаты.

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

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

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

Заключения

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

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

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

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

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

Ссылки

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

[2] Acerbi, C. и Б. Сзекели. "Общие свойства статистики Backtestable. SSRN электронный журнал. Январь 2017.

[3] Acerbi, C. и Б. Сзекели. "Минимально смещенный Backtest для ES". Риск. Сентябрь 2019.

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

[5] Du, Z. и Х. К. Эскансиано. "Бэктестинг ожидаемый недостаток: составление риска хвоста". Наука управления. Vol 63, выпуск 4, апрель 2017.

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

[7] Rockafellar, R. T. и С. Урясев. "Условное выражение, Подверженное риску значения Общих Распределений Потерь". Журнал Банковского дела и Финансов. Издание 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

Связанные примеры

Больше о

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