Этот пример показывает, как выполнить оценку и 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] в Ссылках.
Набор данных, используемый в этом примере, содержит исторические данные для индекса 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 дистрибутивов шкалы местоположения.
Объект esbacktest
предлагает два задних теста для моделей ES. Оба теста используют безусловную тестовую статистическую величину, предложенную в [1], данный
где
количество периодов времени в тестовом окне.
результат портфеля, то есть, портфель возвращаются или прибыль портфеля и потеря в течение периода t.
вероятность отказа VaR, заданного как уровень с 1 var.
предполагаемый ожидаемый недостаток в течение периода t.
индикатор отказа VaR на периоде t со значением 1 если , и 0 в противном случае.
Ожидаемое значение для этой тестовой статистической величины 0, и это отрицательно, когда существует доказательство недооценки риска. Чтобы определить, насколько отрицательный это должно быть должно отклонить модель, критические значения необходимы, и определить критические значения, дистрибутивные предположения необходимы для результатов портфеля .
Безусловная тестовая статистическая величина оказывается стабильной через область значений дистрибутивных предположений для , от дистрибутивов с тонким хвостом такой столь же нормальный, к дистрибутивам с тяжелым хвостом, таким как t с низкими степенями свободы (высоко одна цифры). Только большинство t дистрибутивов с тяжелым хвостом (низко одна цифры) приводит к более заметным различиям в критических значениях. См. [1] для деталей.
Объект esbacktest
использует в своих интересах устойчивость критических значений безусловной тестовой статистической величины и использует таблицы предварительно вычисленных критических значений, чтобы запустить ES назад тесты. esbacktest
имеет два набора таблиц критического значения. Первый набор критических значений принимает что результаты портфеля следуйте за стандартным нормальным распределением; это - тест unconditionalNormal
. Второй набор критических значений использует самые тяжелые хвосты, он принимает что результаты портфеля следуйте за 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.
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