transprob
Этот пример показывает, как визуализировать переходы кредитного рейтинга, которые используются в качестве входа к функции transprob
. Пример также описывает, как transprob
функционирует обработки, оценивающие переходы, когда данные компании запускаются после даты начала анализа, или когда дата окончания анализа - после того, как последний переход наблюдал.
Настройте фиктивные выборочные данные в целях рисунка.
data = {'ABC',datetime('17-Feb-2015','Locale','en_US'),'AA'; 'ABC',datetime('6-Jul-2017','Locale','en_US'),'A'; 'LMN',datetime('12-Aug-2014','Locale','en_US'),'B'; 'LMN',datetime('9-Nov-2015','Locale','en_US'),'CCC'; 'LMN',datetime('7-Sep-2016','Locale','en_US'),'D'; 'XYZ',datetime('14-May-2013','Locale','en_US'),'BB'; 'XYZ',datetime('21-Jun-2016','Locale','en_US'),'BBB'}; data = cell2table(data,'VariableNames',{'ID','Date','Rating'}); disp(data)
ID Date Rating _____ ___________ ______ 'ABC' 17-Feb-2015 'AA' 'ABC' 06-Jul-2017 'A' 'LMN' 12-Aug-2014 'B' 'LMN' 09-Nov-2015 'CCC' 'LMN' 07-Sep-2016 'D' 'XYZ' 14-May-2013 'BB' 'XYZ' 21-Jun-2016 'BBB'
Функция transprob
понимает, что этот формат данных панели указывает на даты, когда новая оценка присвоена данной компании. transprob
принимает, что такие оценки остаются неизменными, если последующая строка явным образом не указывает на изменение оценки. Например, для компании 'ABC', transprob
понимает, что оценка 'A'
неизменна для любой даты после '6-Jul-2017'
(неопределенно).
Функция transprob
возвращает матрицу вероятности перехода как первичный вывод. Существуют также дополнительные выходные параметры, которые содержат дополнительную информацию для того, сколько переходов произошло. Для получения дополнительной информации смотрите transprob
для получения информации о дополнительных выходных параметрах и для 'cohort'
и для методов 'duration'
.
В целях рисунка этот пример позволяет вам выбирать год Запуска (ограниченный 2014
или 2015
для этого примера) и год Конца (2016
или 2017
). Этот пример также использует функцию помощника hDisplayTransitions
(см. раздел "Local Functions") отформатировать информацию о переходах для простоты чтения.
StartYear = 2014; EndYear = 2017; startDate = datetime(StartYear,12,31); endDate = datetime(EndYear,12,31); RatingLabels = ["AAA","AA","A","BBB","BB","B","CCC","D"]; [tm,st,it] = transprob(data,'startDate',startDate,'endDate',endDate,'algorithm','cohort','labels',RatingLabels);
Вероятности перехода TransMat
вывод указывают на вероятность миграции между оценками. Вероятности выражаются в %, то есть, они умножаются на 100.
hDisplayTransitions(tm,RatingLabels,"Transition Matrix")
Transition Matrix AAA AA A BBB BB B CCC D ___ __ ___ ___ __ _ ___ ___ AAA 100 0 0 0 0 0 0 0 AA 0 50 50 0 0 0 0 0 A 0 0 100 0 0 0 0 0 BBB 0 0 0 100 0 0 0 0 BB 0 0 0 50 50 0 0 0 B 0 0 0 0 0 0 100 0 CCC 0 0 0 0 0 0 0 100 D 0 0 0 0 0 0 0 100
Количества перехода хранятся в sampleTotals
дополнительный вывод и указывают, сколько переходов произошло между оценками для целой выборки (то есть, все компании).
hDisplayTransitions(st.totalsMat,RatingLabels,"Transition counts, all companies")
Transition counts, all companies AAA AA A BBB BB B CCC D ___ __ _ ___ __ _ ___ _ AAA 0 0 0 0 0 0 0 0 AA 0 1 1 0 0 0 0 0 A 0 0 0 0 0 0 0 0 BBB 0 0 0 1 0 0 0 0 BB 0 0 0 1 1 0 0 0 B 0 0 0 0 0 0 1 0 CCC 0 0 0 0 0 0 0 1 D 0 0 0 0 0 0 0 1
Третьим выводом transprob
является idTotals
, который содержит информацию о переходах на уровне ID, компании компанией (в том же порядке, что компании появляются во входных данных).
Выберите компанию, чтобы отобразить количества перехода и соответствующую визуализацию переходов. Функция помощника hPlotTransitions
(см. раздел "Local Functions") показывает историю переходов для компании.
CompanyID = "ABC"; UniqueIDs = unique(data.ID,'stable'); [~,CompanyIndex] = ismember(CompanyID,UniqueIDs); hDisplayTransitions(it(CompanyIndex).totalsMat,RatingLabels,strcat("Transition counts, company ID: ",CompanyID))
Transition counts, company ID: ABC AAA AA A BBB BB B CCC D ___ __ _ ___ __ _ ___ _ AAA 0 0 0 0 0 0 0 0 AA 0 1 1 0 0 0 0 0 A 0 0 0 0 0 0 0 0 BBB 0 0 0 0 0 0 0 0 BB 0 0 0 0 0 0 0 0 B 0 0 0 0 0 0 0 0 CCC 0 0 0 0 0 0 0 0 D 0 0 0 0 0 0 0 0
hPlotTransitions(CompanyID,startDate,endDate,data,RatingLabels)
Чтобы понять, как transprob
обрабатывает данные, когда первая наблюдаемая дата после даты начала анализа, или чей в последний раз наблюдаемая дата происходит перед датой окончания анализа, рассмотрите следующий пример. Поскольку компания 'ABC'
предполагает, что анализ имеет дату начала 31-Dec-2014
и дата окончания 31-Dec-2017
. Существует только два перехода, о которых сообщают для этой компании для того аналитического окна времени. Первое наблюдение для 'ABC'
произошло на 17-Feb-2015
. Таким образом, снимок состояния 31-Dec-2015
является первым разом, когда компания наблюдается. 31-Dec-2016
компания осталась в исходной оценке 'AA'
. 31-Dec-2017
снижение к 'A'
зарегистрировано. В соответствии с этим, количества перехода показывают 1 переход от 'AA'
до 'AA'
(от конца 2 015 в конец 2 016) и один переход от 'AA'
до 'A'
(от конца 2 016 в конец 2 017). График показывает последнюю оценку точечной красной линией, чтобы подчеркнуть, что последняя оценка в данных экстраполируется неопределенно в будущее. Нет никакой экстраполяции в прошлое; история компании проигнорирована, пока оценка компании не известна целым переходным периодом (31-Dec-2015
через 31-Dec-2016
в случае 'ABC'
).
function hDisplayTransitions(TransitionsData,RatingLabels,Title) % Helper function to format transition information outputs TransitionsAsTable = array2table(TransitionsData,... 'VariableNames',RatingLabels,'RowNames',RatingLabels); fprintf('\n%s\n\n',Title) disp(TransitionsAsTable) end function hPlotTransitions(CompanyID,startDate,endDate,data,RatingLabels) % Helper function to visualize transitions between ratings Ind = string(data.ID)==CompanyID; DatesOriginal = datetime(data.Date(Ind)); RatingsOriginal = categorical(data.Rating(Ind),flipud(RatingLabels(:)),flipud(RatingLabels(:))); stairs(DatesOriginal,RatingsOriginal,'LineWidth',2) hold on; % Indicate rating extrapolated into the future (arbitrarily select 91 % days after endDate as the last date on the plot) endDateExtrap = endDate+91; if endDateExtrap>DatesOriginal(end) DatesExtrap = [DatesOriginal(end); endDateExtrap]; RatingsExtrap = [RatingsOriginal(end); RatingsOriginal(end)]; stairs(DatesExtrap,RatingsExtrap,'LineWidth',2,'LineStyle',':') end hold off; % Add lines to indicate the snapshot dates % |transprob| uses 1 as the default for 'snapsPerYear', hardcoded here for simplicity % The call to |cfdates| here generates the exact same snapshot dates that |transprob| uses snapsPerYear = 1; snapDates = cfdates(startDate-1,endDate,snapsPerYear)'; yLimits = ylim; for ii=1:length(snapDates) line([snapDates(ii) snapDates(ii)],yLimits,'Color','m') end title(strcat("Company ID: ",CompanyID)) end