Визуализируйте данные о переходах для 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 функция помощника (см. раздел Local Functions) отформатировать информацию о переходах для простоты чтения.

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, Св., это] = 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 это содержит информацию о переходах на уровне ID, компании компанией (в том же порядке, что компании появляются во входных данных).

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

CompanyID = "ABC";
UniqueIDs = уникальный (data.ID,'stable');
[~, CompanyIndex] = ismember (CompanyID, UniqueIDs);
hDisplayTransitions (это (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' (от конца 2 015 в конец 2 016), и один переход от 'AA' к 'A' (от конца 2 016 в конец 2 017). График показывает последнюю оценку точечной красной линией, чтобы подчеркнуть, что последняя оценка в данных экстраполируется неопределенно в будущее. Нет никакой экстраполяции в прошлое; история компании проигнорирована, пока оценка компании не известна целым переходным периодом (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' (от конца 2 012 в конец 2 014), и два перехода от 'BBB' к 'BBB' (от конца 2 017 в конец 2 019).

Однако отличающийся от предыдущего графика, задавая '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