Этот пример показывает ожидаемый недостаток (ES) backtesting рабочий процесс и использование ES backtesting инструменты. esbacktest
класс поддерживает два теста - безусловный нормальный и безусловный t - которые основаны на безусловной тестовой статистической величине Асерби-Сзекели (также известный как второй тест Acerbi-Szekely). Эти тесты используют предварительно симулированные критические значения в безусловной тестовой статистической величине с предположением о нормальном распределении для нормального случая и 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 224195 timetable Dates 1966x1 15729 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 backtesting данные. Этот тип визуализации является общим первым шагом при выполнении ES backtesting анализ. В целях рисунка только, визуализируйте возвраты, вместе с VaR и ES, для конкретной модели.
Получившийся график показывает некоторые большие нарушения в 1 997, 1998, и 2000. Нарушения в 1 996 взглядах, меньших в свободных членах, однако относительно энергозависимости того периода, те нарушения являются также значительными. Для безусловного теста величина нарушений и количество нарушений имеют значение, потому что тестовые средние значения статистической величины по ожидаемому количеству отказов. Если ожидаемый номер мал, но существует несколько нарушений, эффективная серьезность для теста больше. Год 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. ObservedSeverity
столбец показывает среднее отношение потери для VaR на периодах, когда VaR нарушен. 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