Визуализация данных переходов для 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)

Figure contains an axes. The axes with title Company ID: ABC contains 6 objects of type stair, line.

Чтобы понять, как 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)

Figure contains an axes. The axes with title Company ID: DEF contains 11 objects of type stair, line.

Чтобы удалить '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)

Figure contains an axes. The axes with title Company ID: DEF contains 11 objects of type stair, line.

В соответствии с предыдущим графиком, счетчики переходов все еще показывают два перехода от '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