transprob
В этом примере показано, как визуализировать переходы кредитного рейтинга, которые используются в качестве входа в transprob
функция. Пример также описывает, как transprob
функция обрабатывает рейтинговые переходы, когда данные компании начинаются после даты начала анализа или когда дата окончания анализа находится после последнего наблюдаемого перехода.
Настройте фиктивные выборочные данные в целях рисунка.
data = {'ABC','17-Feb-2015','AA'; 'ABC','6-Jul-2017','A'; 'LMN','12-Aug-2014','B'; 'LMN','9-Nov-2015','CCC'; 'LMN','7-Sep-2016','D'; 'XYZ','14-May-2013','BB'; 'XYZ','21-Jun-2016','BBB'}; data = cell2table(data,'VariableNames',{'ID','Date','Rating'}); disp(data)
ID Date Rating _______ _______________ _______ {'ABC'} {'17-Feb-2015'} {'AA' } {'ABC'} {'6-Jul-2017' } {'A' } {'LMN'} {'12-Aug-2014'} {'B' } {'LMN'} {'9-Nov-2015' } {'CCC'} {'LMN'} {'7-Sep-2016' } {'D' } {'XYZ'} {'14-May-2013'} {'BB' } {'XYZ'} {'21-Jun-2016'} {'BBB'}
The transprob
функция понимает, что этот формат данных панели указывает даты присвоения нового рейтинга определенной компании. transprob
принимает, что такие рейтинги остаются неизменными, если только следующая строка явно не указывает на изменение рейтинга. Для примера, для 'ABC'
компании,
transprob
понимает, что 'A'
рейтинг не изменяется для любой даты после '6-Jul-2017'
(бессрочно).
The transprob
функция возвращает матрицу вероятностей перехода в качестве первичного выхода. Существуют также необязательные выходы, которые содержат дополнительную информацию о том, сколько переходов произошло. Для получения дополнительной информации смотрите transprob
для получения информации о необязательных выходах для обоих 'cohort'
и 'duration'
методы.
В целях рисунка этот пример позволяет вам выбрать StartYear
(ограниченный 2014
или 2015
для этого примера) и EndYear
(2016
или 2017
). Этот пример также использует hDisplayTransitions
helper function (см. Раздел «Локальные функции») для форматирования информации о переходах для простоты чтения.
StartYear = 2014; EndYear = 2017; startDate = datetime (StartYear,12,31,'Locale','en_US'); endDate = datetime (EndYear,12,31,'Locale','en_US'); RatingLabels = ["AAA","AA","A","BBB","BB","B","CCC","D"]; [tm, st, it] = transprob (данные,'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
который содержит информацию о переходах на уровне идентификатора, компании по компаниям (в том же порядке, в котором компании появляются в входных данных).
Выберите компанию для отображения счетчиков переходов и соответствующей визуализации переходов. The hPlotTransitions
функция helper (см. раздел «Локальные функции») показывает историю переходов для компании.
CompanyID = "ABC"; UniqueIDs = уникальные данные .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'
записывается. В соответствии с этим, счетчики переходов показывают один переход от 'AA'
на 'AA'
(с конца 2015 года по конец 2016 года), и один переход от 'AA'
на 'A'
(с конца 2016 года по конец 2017 года). График показывает последний рейтинг как пунктирную красную линию, чтобы подчеркнуть, что последний рейтинг в данных экстраполируется на неопределенный срок в будущее. Экстраполяции в прошлое не происходит; история компании игнорируется до тех пор, пока рейтинг компании не будет известен за целый переходный период (31-Dec-2015
через 31-Dec-2016
в случае 'ABC'
).
NR
(Не оценен) РейтингРассмотрим другие выборочные данные, содержащую только одну компанию 'DEF'
. Данные содержат переходы компании 'DEF'
от 'A'
на 'NR'
рейтинг и последующий переход от 'NR'
на 'BBB'
.
dataNR = {'DEF','17-Mar-2011','A'; 'DEF','24-Mar-2014','NR'; 'DEF','26-Sep-2016','BBB'}; dataNR = cell2table(dataNR,'VariableNames',{'ID','Date','Rating'}); disp(dataNR)
ID Date Rating _______ _______________ _______ {'DEF'} {'17-Mar-2011'} {'A' } {'DEF'} {'24-Mar-2014'} {'NR' } {'DEF'} {'26-Sep-2016'} {'BBB'}
transprob
лечит 'NR'
как другой рейтинг. Матрица перехода ниже показывает предполагаемую вероятность перехода в и из 'NR'
.
StartYearNR = 2010; EndYearNR = 2018; startDateNR = datetime(StartYearNR,12,31,'Locale','en_US'); endDateNR = datetime(EndYearNR,12,31,'Locale','en_US'); CompanyID_NR = "DEF"; RatingLabelsNR = ["AAA","AA","A","BBB","BB","B","CCC","D","NR"]; [tmNR,~,itNR] = transprob(dataNR,'startDate',startDateNR,'endDate',endDateNR,'algorithm','cohort','labels',RatingLabelsNR); hDisplayTransitions(tmNR,RatingLabelsNR,"Transition Matrix")
Transition Matrix AAA AA A BBB BB B CCC D NR ___ ___ ______ ___ ___ ___ ___ ___ ______ AAA 100 0 0 0 0 0 0 0 0 AA 0 100 0 0 0 0 0 0 0 A 0 0 66.667 0 0 0 0 0 33.333 BBB 0 0 0 100 0 0 0 0 0 BB 0 0 0 0 100 0 0 0 0 B 0 0 0 0 0 100 0 0 0 CCC 0 0 0 0 0 0 100 0 0 D 0 0 0 0 0 0 0 100 0 NR 0 0 0 50 0 0 0 0 50
Отобразите счетчики переходов и соответствующую визуализацию переходов.
hDisplayTransitions(itNR.totalsMat,RatingLabelsNR,strcat("Transition counts, company ID: ",CompanyID_NR))
Transition counts, company ID: DEF AAA AA A BBB BB B CCC D NR ___ __ _ ___ __ _ ___ _ __ AAA 0 0 0 0 0 0 0 0 0 AA 0 0 0 0 0 0 0 0 0 A 0 0 2 0 0 0 0 0 1 BBB 0 0 0 2 0 0 0 0 0 BB 0 0 0 0 0 0 0 0 0 B 0 0 0 0 0 0 0 0 0 CCC 0 0 0 0 0 0 0 0 0 D 0 0 0 0 0 0 0 0 0 NR 0 0 0 1 0 0 0 0 1
hPlotTransitions(CompanyID_NR,startDateNR,endDateNR,dataNR,RatingLabelsNR)
Чтобы удалить 'NR'
из матрицы переходов используйте 'excludeLabels'
имя-значение входного параметра в transprob
. Список меток, которые нужно исключить, может быть указан или не указан в аргументе пары "имя-значение" labels
. Например, оба RatingLabels
и RatingLabelsNR
сгенерировать тот же выход от transprob
.
[tmNR,stNR,itNR] = transprob(dataNR,'startDate',startDateNR,'endDate',endDateNR,'algorithm','cohort','labels',RatingLabelsNR,'excludeLabels','NR'); hDisplayTransitions(tmNR,RatingLabels,"Transition Matrix")
Transition Matrix AAA AA A BBB BB B CCC D ___ ___ ___ ___ ___ ___ ___ ___ AAA 100 0 0 0 0 0 0 0 AA 0 100 0 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 0 100 0 0 0 B 0 0 0 0 0 100 0 0 CCC 0 0 0 0 0 0 100 0 D 0 0 0 0 0 0 0 100
Отобразите счетчики переходов и соответствующую визуализацию переходов.
hDisplayTransitions(itNR.totalsMat,RatingLabels,strcat("Transition counts, company ID: ",CompanyID_NR))
Transition counts, company ID: DEF AAA AA A BBB BB B CCC D ___ __ _ ___ __ _ ___ _ AAA 0 0 0 0 0 0 0 0 AA 0 0 0 0 0 0 0 0 A 0 0 2 0 0 0 0 0 BBB 0 0 0 2 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_NR,startDateNR,endDateNR,dataNR,RatingLabels)
В соответствии с предыдущим графиком, счетчики переходов все еще показывают два перехода от 'A'
на 'A'
(с конца 2012 года по конец 2014 года), и два перехода от 'BBB'
на 'BBB'
(с конца 2017 года по конец 2019 года).
Однако отличается от предыдущего графика, задавая 'NR'
использование 'excludeLabels'
имя-значение входного параметра transprob
удаляет все переходы в и из 'NR'
рейтинг.
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),'Locale','en_US'); 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 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