exponenta event banner

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

transprob функция понимает, что этот формат панельных данных указывает даты назначения новой оценки данной компании. transprob предполагает, что такие рейтинги остаются неизменными, если только последующая строка явно не указывает на изменение рейтинга. Например, для компании 'ABC', transprob понимает, что 'A' рейтинг не изменился для любой даты после '6-Jul-2017' (бесконечно).

Вычислить матрицу перехода и количество переходов

transprob функция возвращает матрицу вероятности перехода в качестве первичного выходного сигнала. Существуют также необязательные выходные данные, содержащие дополнительную информацию о количестве выполненных переходов. Дополнительные сведения см. в разделе transprob для получения информации о дополнительных выходах для обоих 'cohort' и 'duration' методы.

В целях иллюстрации в этом примере можно выбрать StartYear (ограничено 2014 или 2015 для этого примера) и EndYear (2016 или 2017). В этом примере также используется hDisplayTransitions вспомогательная функция (см. раздел Локальные функции) для форматирования информации о переходах для удобства чтения.

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(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 содержит информацию о переходах на уровне идентификатора, компания за компанией (в том же порядке, в котором компании отображаются во входных данных).

Выберите компанию для отображения количества переходов и соответствующей визуализации переходов. hPlotTransitions вспомогательная функция (см. раздел Локальные функции) показывает историю переходов для компании.

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)

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