Этот пример показывает ожидаемый рабочий процесс тестирования (ES) и использование инструментов обратного тестирования ES. The esbacktest
класс поддерживает два теста - безусловный нормальный и безусловный t - которые основаны на безусловной тестовой статистике Ачерби-Секели (также известной как второй тест Ачерби-Секели). Эти тесты используют предварительно заданные критические значения для безусловной тестовой статистики с допущением нормального распределения для нормального случая и t-распределения с 3 степенями свободы для t-случая.
Используйте ESBacktestData.mat
файл для загрузки данных в рабочую область. Этот пример работает с Returns
числовой массив. Этот массив представляет возвраты капитала, VaRModel1
, VaRModel2
, и VaRModel3
, и соответствующие данные VaR на 97,5% доверительных уровнях, сгенерированные с тремя различными моделями. Ожидаемые данные о дефиците содержатся в ESModel1
, ESModel2
, и ESModel3
. Три распределения модели, используемые для генерации ожидаемых данных о дефиците в этом примере, являются нормальными (модель 1), t с 10 степенями свободы (модель 2) и t с 5 степенями свободы (модель 3). Однако эта информация о распределении не нужна в этом примере, потому что esbacktest
объект не требует этого.
load('ESBacktestData')
whos
Name Size Bytes Class Attributes Data 1966x13 223945 timetable Dates 1966x1 15728 datetime ESModel1 1966x1 15728 double ESModel2 1966x1 15728 double ESModel3 1966x1 15728 double Returns 1966x1 15728 double VaRLevel 1x1 8 double VaRModel1 1966x1 15728 double VaRModel2 1966x1 15728 double VaRModel3 1966x1 15728 double
Используйте plot
функция для визуализации данных обратного тестирования ES. Этот тип визуализации является общим первым шагом при выполнении обратного тестирования ES. Только в целях рисунка визуализируйте возвраты вместе с VaR и ES для конкретной модели.
Получившийся график показывает некоторые крупные нарушения в 1997, 1998 и 2000 годах. Нарушения в 1996 году выглядят меньше в абсолютном выражении, однако по сравнению с неустойчивостью этого периода эти нарушения также являются значительными. Для безусловного теста величина нарушений и количество нарушений имеют значение, потому что статистика тестов усредняет ожидаемое количество отказов. Если ожидаемое число невелико, но есть несколько нарушений, эффективная серьезность для теста больше. 2002 год является примером года с небольшими, но многими отказами VaR.
figure; plot(Dates,Returns,Dates,-VaRModel1,Dates,-ESModel1) legend('Returns','VaR','ES') title('Test Data, Model 1, VaR level 95%') grid on
esbacktest
объект.Создайте esbacktest
объект, использующий esbacktest
.
load ESBacktestData ebt = esbacktest(Returns,[VaRModel1 VaRModel2 VaRModel3],[ESModel1 ESModel2 ESModel3],... 'PortfolioID',"S&P",'VaRID',["Model1","Model2","Model3"],'VaRLevel',VaRLevel)
ebt = esbacktest with properties: PortfolioData: [1966x1 double] VaRData: [1966x3 double] ESData: [1966x3 double] PortfolioID: "S&P" VaRID: ["Model1" "Model2" "Model3"] VaRLevel: [0.9750 0.9750 0.9750]
Сгенерируйте сводный отчет ES. The ObservedSeverity
столбец показывает среднее отношение потерь к VaR за периоды, когда VaR нарушен. The ExpectedSeverity
столбец показывает среднее отношение ES к VaR для периодов нарушения VaR.
S = summary(ebt); disp(S)
PortfolioID VaRID VaRLevel ObservedLevel ExpectedSeverity ObservedSeverity Observations Failures Expected Ratio Missing ___________ ________ ________ _____________ ________________ ________________ ____________ ________ ________ ______ _______ "S&P" "Model1" 0.975 0.97101 1.1928 1.4221 1966 57 49.15 1.1597 0 "S&P" "Model2" 0.975 0.97202 1.2652 1.4134 1966 55 49.15 1.119 0 "S&P" "Model3" 0.975 0.97202 1.37 1.4146 1966 55 49.15 1.119 0
Запустите все тесты и сгенерируйте отчет только по результатам принятия или отклонения.
t = runtests(ebt); disp(t)
PortfolioID VaRID VaRLevel UnconditionalNormal UnconditionalT ___________ ________ ________ ___________________ ______________ "S&P" "Model1" 0.975 reject reject "S&P" "Model2" 0.975 reject accept "S&P" "Model3" 0.975 accept accept
Запустите отдельный тест для безусловного нормального теста.
t = unconditionalNormal(ebt); disp(t)
PortfolioID VaRID VaRLevel UnconditionalNormal PValue TestStatistic CriticalValue Observations TestLevel ___________ ________ ________ ___________________ _________ _____________ _____________ ____________ _________ "S&P" "Model1" 0.975 reject 0.0054099 -0.38265 -0.2403 1966 0.95 "S&P" "Model2" 0.975 reject 0.044967 -0.25011 -0.2403 1966 0.95 "S&P" "Model3" 0.975 accept 0.149 -0.15551 -0.2403 1966 0.95
Запустите отдельный тест для безусловного теста t.
t = unconditionalT(ebt); disp(t)
PortfolioID VaRID VaRLevel UnconditionalT PValue TestStatistic CriticalValue Observations TestLevel ___________ ________ ________ ______________ ________ _____________ _____________ ____________ _________ "S&P" "Model1" 0.975 reject 0.018566 -0.38265 -0.28242 1966 0.95 "S&P" "Model2" 0.975 accept 0.073292 -0.25011 -0.28242 1966 0.95 "S&P" "Model3" 0.975 accept 0.17932 -0.15551 -0.28242 1966 0.95
Выберите конкретный календарный год и запустите тесты для этого года только путем создания esbacktest
объект и передача только интересующих данных.
Year = 1996; Ind = year(Dates)==Year; PortID = ['S&P, ' num2str(Year)]; PortfolioData = Returns(Ind); VaRData = [VaRModel1(Ind) VaRModel2(Ind) VaRModel3(Ind)]; ESData = [ESModel1(Ind) ESModel2(Ind) ESModel3(Ind)]; ebt = esbacktest(PortfolioData,VaRData,ESData,... 'PortfolioID',PortID,'VaRID',["Model1","Model2","Model3"],'VaRLevel',VaRLevel); disp(ebt)
esbacktest with properties: PortfolioData: [262x1 double] VaRData: [262x3 double] ESData: [262x3 double] PortfolioID: "S&P, 1996" VaRID: ["Model1" "Model2" "Model3"] VaRLevel: [0.9750 0.9750 0.9750]
tt = runtests(ebt); disp(tt)
PortfolioID VaRID VaRLevel UnconditionalNormal UnconditionalT ___________ ________ ________ ___________________ ______________ "S&P, 1996" "Model1" 0.975 reject reject "S&P, 1996" "Model2" 0.975 reject reject "S&P, 1996" "Model3" 0.975 reject accept
esbacktest
| runtests
| summary
| unconditionalNormal
| unconditionalT