Кредитные рейтинги ранжируют заемщиков по их кредитоспособности. Хотя этот рейтинг сам по себе полезен, учреждения также заинтересованы в том, чтобы знать, насколько вероятно, что заемщики в конкретной категории рейтинга будут повышены или понижены до другого рейтинга, и особенно, насколько вероятно, что они объявят дефолт.
Вероятность перехода является одним из способов охарактеризовать прошлые изменения кредитного качества должников (как правило, фирм) и является основным вкладом во многие приложения по управлению рисками. Программное обеспечение финансового Toolbox™ поддерживает оценку вероятностей перехода с использованием подходов как когорты, так и продолжительности (также известных как уровень опасности или интенсивность) с использованием transprob и связанные с этим функции.
Примечание
Образец набора данных, используемый в этом разделе, моделируется с использованием одной матрицы перехода. Никаких попыток сопоставить исторические тенденции в показателях переходного периода не предпринимается.
Data_TransProb.mat файл содержит образцы данных кредитных рейтингов.
load Data_TransProb
data(1:10,:) ans =
ID Date Rating
__________ _____________ ______
'00010283' '10-Nov-1984' 'CCC'
'00010283' '12-May-1986' 'B'
'00010283' '29-Jun-1988' 'CCC'
'00010283' '12-Dec-1991' 'D'
'00013326' '09-Feb-1985' 'A'
'00013326' '24-Feb-1994' 'AA'
'00013326' '10-Nov-2000' 'BBB'
'00014413' '23-Dec-1982' 'B'
'00014413' '20-Apr-1988' 'BB'
'00014413' '16-Jan-1998' 'B' Образец данных форматируется как массив ячеек с тремя столбцами. Каждая строка содержит идентификатор (столбец 1), дату (столбец 2) и кредитный рейтинг (столбец 3). Присвоенный кредитный рейтинг соответствует связанному идентификатору на соответствующую дату. Вся информация, соответствующая одному идентификатору, должна храниться в смежных строках. В этом примере идентификаторы, даты и рейтинги хранятся в формате векторов символов, но их также можно ввести в числовом формате.
В этом примере самый простой синтаксис вызова для transprob проходит nRecords-by-3 массив ячеек в качестве единственного входного аргумента. Дефолт startDate и endDate являются самыми ранними и последними датами в данных. Алгоритм оценки по умолчанию представляет собой метод длительности, и оцениваются вероятности перехода на один год:
transMat0 = transprob(data)
transMat0 =
93.1170 5.8428 0.8232 0.1763 0.0376 0.0012 0.0001 0.0017
1.6166 93.1518 4.3632 0.6602 0.1626 0.0055 0.0004 0.0396
0.1237 2.9003 92.2197 4.0756 0.5365 0.0661 0.0028 0.0753
0.0236 0.2312 5.0059 90.1846 3.7979 0.4733 0.0642 0.2193
0.0216 0.1134 0.6357 5.7960 88.9866 3.4497 0.2919 0.7050
0.0010 0.0062 0.1081 0.8697 7.3366 86.7215 2.5169 2.4399
0.0002 0.0011 0.0120 0.2582 1.4294 4.2898 81.2927 12.7167
0 0 0 0 0 0 0 100.0000Укажите явные даты начала и окончания, в противном случае окно оценки для двух различных наборов данных может отличаться, и оценки могут быть несопоставимыми. С этой точки зрения следует исходить из того, что период времени, в который поступают проценты, составляет пятилетний период с конца 1995 года по конец 2000 года. Для сравнения вычислите оценки для этого временного окна. Сначала используйте duration алгоритм (опция по умолчанию), а затем cohort алгоритм явно установлен.
startDate = '31-Dec-1995'; endDate = '31-Dec-2000'; transMat1 = transprob(data,'startDate',startDate,'endDate',endDate) transMat2 = transprob(data,'startDate',startDate,'endDate',endDate,... 'algorithm','cohort')
transMat1 =
90.6236 7.9051 1.0314 0.4123 0.0210 0.0020 0.0003 0.0043
4.4780 89.5558 4.5298 1.1225 0.2284 0.0094 0.0009 0.0754
0.3983 6.1164 87.0641 5.4801 0.7637 0.0892 0.0050 0.0832
0.1029 0.8572 10.7918 83.0204 3.9971 0.7001 0.1313 0.3992
0.1043 0.3745 2.2962 14.0954 78.9840 3.0013 0.0463 1.0980
0.0113 0.0544 0.7055 3.2925 15.4350 75.5988 1.8166 3.0860
0.0044 0.0189 0.1903 1.9743 6.2320 10.2334 75.9983 5.3484
0 0 0 0 0 0 0 100.0000
transMat2 =
90.1554 8.5492 0.9067 0.3886 0 0 0 0
4.9512 88.5221 5.1763 1.0503 0.2251 0 0 0.0750
0.2770 6.6482 86.2188 6.0942 0.6233 0.0693 0 0.0693
0.0794 0.8737 11.6759 81.6521 4.3685 0.7943 0.1589 0.3971
0.1002 0.4008 1.9038 15.4309 77.8557 3.4068 0 0.9018
0 0 0.2262 2.4887 17.4208 74.2081 2.2624 3.3937
0 0 0.7576 1.5152 6.0606 10.6061 75.0000 6.0606
0 0 0 0 0 0 0 100.0000По умолчанию cohort внутренний алгоритм получает годовые снимки кредитных рейтингов, но количество снимков в год можно определить с помощью пары параметр/значение snapsPerYear. Чтобы получить оценки с помощью ежеквартальных снимков:
transMat3 = transprob(data,'startDate',startDate,'endDate',endDate,... 'algorithm','cohort','snapsPerYear',4)
transMat3 =
90.4765 8.0881 1.0072 0.4069 0.0164 0.0015 0.0002 0.0032
4.5949 89.3216 4.6489 1.1239 0.2276 0.0074 0.0007 0.0751
0.3747 6.3158 86.7380 5.6344 0.7675 0.0856 0.0040 0.0800
0.0958 0.7967 11.0441 82.6138 4.1906 0.7230 0.1372 0.3987
0.1028 0.3571 2.3312 14.4954 78.4276 3.1489 0.0383 1.0987
0.0084 0.0399 0.6465 3.0962 16.0789 75.1300 1.9044 3.0956
0.0031 0.0125 0.1445 1.8759 6.2613 10.7022 75.6300 5.3705
0 0 0 0 0 0 0 100.0000Оба duration и cohort вычислить вероятности перехода на один год по умолчанию, но временной интервал для переходов можно определить с помощью пары параметр/значение transInterval. Например, чтобы получить вероятности двухлетнего перехода с помощью cohort алгоритм с одинаковой периодичностью снимка и окном оценки:
transMat4 = transprob(data,'startDate',startDate,'endDate',endDate,... 'algorithm','cohort','snapsPerYear',4,'transInterval',2)
transMat4 =
82.2358 14.6092 2.2062 0.8543 0.0711 0.0074 0.0011 0.0149
8.2803 80.4584 8.3606 2.2462 0.4665 0.0316 0.0030 0.1533
0.9604 11.1975 76.1729 9.7284 1.5322 0.2044 0.0162 0.1879
0.2483 2.0903 18.8440 69.5145 6.9601 1.2966 0.2329 0.8133
0.2129 0.8713 5.4893 23.5776 62.6438 4.9464 0.1390 2.1198
0.0378 0.1895 1.7679 7.2875 24.9444 57.1783 2.8816 5.7132
0.0154 0.0716 0.6576 4.2157 11.4465 16.3455 57.4078 9.8399
0 0 0 0 0 0 0 100.0000Набор данных data от Data_TransProb.mat содержит образцы кредитных рейтингов с использованием шкалы рейтингов по умолчанию {'AAA', 'AA','A', 'BBB', 'BB', 'B', 'CCC', 'D'}. Он также содержит набор данных dataIGSG с рейтингами инвестиционного уровня ('IG'), спекулятивная оценка ('SG') и по умолчанию ('D'). Чтобы оценить матрицу перехода для этого набора данных, используйте labels аргумент.
load Data_TransProb startDate = '31-Dec-1995'; endDate = '31-Dec-2000'; dataIGSG(1:10,:) transMatIGSG = transprob(dataIGSG,'labels',{'IG','SG','D'},... 'startDate',startDate,'endDate',endDate)
ans =
'00011253' '04-Apr-1983' 'IG'
'00012751' '17-Feb-1985' 'SG'
'00012751' '19-May-1986' 'D'
'00014690' '17-Jan-1983' 'IG'
'00012144' '21-Nov-1984' 'IG'
'00012144' '25-Mar-1992' 'SG'
'00012144' '07-May-1994' 'IG'
'00012144' '23-Jan-2000' 'SG'
'00012144' '20-Aug-2001' 'IG'
'00012937' '07-Feb-1984' 'IG'
transMatIGSG =
98.1986 1.5179 0.2835
8.5396 89.4891 1.9713
0 0 100.0000Есть еще один набор данных, dataIGSGnum, с той же информацией, что и dataIGSG, за исключением того, что рейтинги сопоставлены с числовой шкалой, где 'IG'=1, 'SG'=2, и 'D'=3. Чтобы оценить матрицу перехода, используйте labels необязательный аргумент, указывающий числовой масштаб как массив ячеек.
dataIGSGnum(1:10,:) % Note {1,2,3} and num2cell(1:3) are equivalent; num2cell is convenient % when the number of ratings is larger transMatIGSGnum = transprob(dataIGSGnum,'labels',{1,2,3},... 'startDate',startDate,'endDate',endDate)
ans =
'00011253' '04-Apr-1983' [1]
'00012751' '17-Feb-1985' [2]
'00012751' '19-May-1986' [3]
'00014690' '17-Jan-1983' [1]
'00012144' '21-Nov-1984' [1]
'00012144' '25-Mar-1992' [2]
'00012144' '07-May-1994' [1]
'00012144' '23-Jan-2000' [2]
'00012144' '20-Aug-2001' [1]
'00012937' '07-Feb-1984' [1]
transMatIGSGnum =
98.1986 1.5179 0.2835
8.5396 89.4891 1.9713
0 0 100.0000Каждый раз, когда входной набор данных содержит оценки, не включенные в шкалу оценок по умолчанию {'AAA', 'AA', 'A', 'BBB', 'BB', 'B', 'CCC', 'D'}, полная шкала оценки должна быть указана с помощью labels необязательный аргумент. Например, если набор данных содержит оценки 'AAA', ..., 'CCC, 'D', и 'NR' (не номинальный), использовать labels с этим массивом ячеек {'AAA', 'AA', 'A','BBB','BB','B','CCC','D','NR'}.
NR РейтингВ этом примере показано, как 'NR' (не номинальные) рейтинги обрабатываются transprobи как получить матрицу перехода, использующую 'NR' рейтинговая информация для оценки, но она не показывает 'NR' оценка в окончательных вероятностях перехода.
Набор данных data от Data_TransProb.mat содержит образцы кредитных рейтингов с использованием шкалы рейтингов по умолчанию {'AAA', 'AA','A', 'BBB', 'BB', 'B', 'CCC', 'D'}.
load Data_TransProb
head(data,12)ans =
12×3 table
ID Date Rating
__________ _____________ ______
'00010283' '10-Nov-1984' 'CCC'
'00010283' '12-May-1986' 'B'
'00010283' '29-Jun-1988' 'CCC'
'00010283' '12-Dec-1991' 'D'
'00013326' '09-Feb-1985' 'A'
'00013326' '24-Feb-1994' 'AA'
'00013326' '10-Nov-2000' 'BBB'
'00014413' '23-Dec-1982' 'B'
'00014413' '20-Apr-1988' 'BB'
'00014413' '16-Jan-1998' 'B'
'00014413' '25-Nov-1999' 'BB'
'00012126' '17-Feb-1985' 'CCC'
Заменить переход на 'B' с переходом на 'NR' для первой компании. Обратите внимание, что происходит последующий переход от 'NR' кому 'CCC'.
dataNR = data;
dataNR.Rating{2} = 'NR';
dataNR.Rating{7} = 'NR';
head(dataNR,12)ans =
12×3 table
ID Date Rating
__________ _____________ ______
'00010283' '10-Nov-1984' 'CCC'
'00010283' '12-May-1986' 'NR'
'00010283' '29-Jun-1988' 'CCC'
'00010283' '12-Dec-1991' 'D'
'00013326' '09-Feb-1985' 'A'
'00013326' '24-Feb-1994' 'AA'
'00013326' '10-Nov-2000' 'NR'
'00014413' '23-Dec-1982' 'B'
'00014413' '20-Apr-1988' 'BB'
'00014413' '16-Jan-1998' 'B'
'00014413' '25-Nov-1999' 'BB'
'00012126' '17-Feb-1985' 'CCC'
'NR' рассматривается как другой рейтинг. Матрица перехода показывает оценочную вероятность перехода в и из 'NR'. В этом примере transprob функция использует'cohort' алгоритм и 'NR' рейтинг рассматривается как другой рейтинг. Такое же поведение существует при использовании transprob функции с помощью 'duration' алгоритм.
RatingsLabelsNR = {'AAA','AA','A','BBB','BB','B','CCC','D','NR'};
[MatrixNRCohort,TotalsNRCohort] = transprob(dataNR,...
'Labels',RatingsLabelsNR,...
'Algorithm','cohort');
fprintf('Transition probability, cohort, including NR:\n')
disp(array2table(MatrixNRCohort,'VariableNames',RatingsLabelsNR,...
'RowNames',RatingsLabelsNR))
fprintf('Total transitions out of given rating, including 6 out of NR (5 NR->NR, 1 NR->CCC):\n')
disp(array2table(TotalsNRCohort.totalsVec,'VariableNames',RatingsLabelsNR))Transition probability, cohort, including NR:
AAA AA A BBB BB B CCC D NR
________ _______ ________ _______ ________ ________ ________ ________ ________
AAA 93.135 5.9335 0.74557 0.15533 0.031066 0 0 0 0
AA 1.7359 92.92 4.5446 0.58514 0.15604 0 0 0.039009 0.019505
A 0.12683 2.9716 91.991 4.3124 0.4711 0.054358 0 0.072477 0
BBB 0.021048 0.37887 5.0726 89.771 4.0413 0.46306 0.042096 0.21048 0
BB 0.022099 0.1105 0.68508 6.232 88.376 3.6464 0.28729 0.64088 0
B 0 0 0.076161 0.72353 7.997 86.215 2.7037 2.2848 0
CCC 0 0 0 0.30936 1.8561 4.4857 80.897 12.374 0.07734
D 0 0 0 0 0 0 0 100 0
NR 0 0 0 0 0 0 16.667 0 83.333
Total transitions out of given rating, including 6 out of NR (5 NR->NR, 1 NR->CCC):
AAA AA A BBB BB B CCC D NR
____ ____ ____ ____ ____ ____ ____ ____ __
3219 5127 5519 4751 4525 2626 1293 4050 6
Удаление переходов в 'NR' из матрицы перехода, необходимо использовать 'excludeLabels' необязательный входной аргумент имя-значение для transprob.
'labels' вход в transprob может включать или не включать метку, которую необходимо исключить. В следующем примере NR оценка удаляется из этикеток в целях отображения, но передается RatingsLabelsNR кому transprob будет также работать.
RatingsLabels = {'AAA','AA','A','BBB','BB','B','CCC','D'};
[MatrixCohort,TotalsCohort] = transprob(dataNR,'Labels',RatingsLabels,'ExcludeLabels','NR','Algorithm','cohort');
fprintf('Transition probability, cohort, after postprocessing to remove NR:\n')Transition probability, cohort, after postprocessing to remove NR:
disp(array2table(MatrixCohort,'VariableNames',RatingsLabels,... 'RowNames',RatingsLabels))
Transition probability, cohort, after postprocessing to remove NR:
AAA AA A BBB BB B CCC D
________ _______ ________ _______ ________ ________ ________ ________
AAA 93.135 5.9335 0.74557 0.15533 0.031066 0 0 0
AA 1.7362 92.938 4.5455 0.58525 0.15607 0 0 0.039017
A 0.12683 2.9716 91.991 4.3124 0.4711 0.054358 0 0.072477
BBB 0.021048 0.37887 5.0726 89.771 4.0413 0.46306 0.042096 0.21048
BB 0.022099 0.1105 0.68508 6.232 88.376 3.6464 0.28729 0.64088
B 0 0 0.076161 0.72353 7.997 86.215 2.7037 2.2848
CCC 0 0 0 0.3096 1.8576 4.4892 80.96 12.384
D 0 0 0 0 0 0 0 100
Total transitions out of given rating, AA and CCC have one less than before:
AAA AA A BBB BB B CCC D
____ ____ ____ ____ ____ ____ ____ ____
3219 5126 5519 4751 4525 2626 1292 4050
fprintf('Total transitions out of given rating, AA and CCC have one less than before:\n')Total transitions out of given rating, AA and CCC have one less than before
disp(array2table(TotalsCohort.totalsVec,'VariableNames',RatingsLabels)) AAA AA A BBB BB B CCC D
____ ____ ____ ____ ____ ____ ____ ____
3219 5126 5519 4751 4525 2626 1292 4050Все переходы с участием 'NR' удаляются из выборки, но все остальные переходы все еще используются для оценки вероятностей перехода. В этом примере переход от 'NR' кому 'CCC' был удален, а также переход от 'AA' кому 'NR' (и еще пять переходов от 'NR' кому 'NR'). Это означает, что первая компания все еще вносит свой вклад в переход от'CCC' кому 'CCC' для оценки, только периоды, перекрывающиеся с временем, которое эта компания провела в 'NR' были удалены из образца и аналогичным образом для другой компании.
Эта процедура отличается от удаления 'NR' строки из самих данных.
Например, если удалить 'NR' в этом примере первая компания, похоже, останется в своем первоначальном рейтинге 'CCC' весь путь от начальной даты в 1984 году до события по умолчанию в 1991 году. При предыдущем подходе оценка знает, что компания перешла из 'CCC' в какой-то момент оно знает, что не останавливалось на 'CCC' постоянно.
Если 'NR' строка удалена для второй компании, эта компания, похоже, осталась в выборке как 'AA' компания до конца образца. При предыдущем подходе оценка знает, что эта компания перестала быть 'AA' ранее.
dataNR2 = dataNR; dataNR2([2 7],:) = []; head(dataNR2,12)
ans =
12×3 table
ID Date Rating
__________ _____________ ______
'00010283' '10-Nov-1984' 'CCC'
'00010283' '29-Jun-1988' 'CCC'
'00010283' '12-Dec-1991' 'D'
'00013326' '09-Feb-1985' 'A'
'00013326' '24-Feb-1994' 'AA'
'00014413' '23-Dec-1982' 'B'
'00014413' '20-Apr-1988' 'BB'
'00014413' '16-Jan-1998' 'B'
'00014413' '25-Nov-1999' 'BB'
'00012126' '17-Feb-1985' 'CCC'
'00012126' '08-Mar-1989' 'D'
'00011692' '11-May-1984' 'BB'
Если 'NR' строки удаляются, матрицы перехода будут отличаться. Вероятность пребывания на 'CCC' немного вверх, и вероятность пребывания на 'AA'.
Матрицы перехода будут различными. Вероятность пребывания на 'CCC' немного вверх, и вероятность пребывания на 'AA'.
[MatrixCohort2,TotalsCohort2] = transprob(dataNR2,... 'Labels',RatingsLabels,... 'Algorithm','cohort'); fprintf('Transition probability, cohort, if NR rows are removed from data:\n') disp(array2table(MatrixCohort2,'VariableNames',RatingsLabels,... 'RowNames',RatingsLabels)) fprintf('Total transitions out of given rating, many more out of CCC and AA:\n') disp(array2table(TotalsCohort2.totalsVec,'VariableNames',RatingsLabels))
Transition probability, cohort, if NR rows are removed from data:
disp(array2table(MatrixCohort2,'VariableNames',RatingsLabels,... 'RowNames',RatingsLabels))
Transition probability, cohort, if NR rows are removed from data:
AAA AA A BBB BB B CCC D
________ _______ ________ _______ ________ ________ ________ ________
AAA 93.135 5.9335 0.74557 0.15533 0.031066 0 0 0
AA 1.7346 92.945 4.541 0.58468 0.15592 0 0 0.038979
A 0.12683 2.9716 91.991 4.3124 0.4711 0.054358 0 0.072477
BBB 0.021048 0.37887 5.0726 89.771 4.0413 0.46306 0.042096 0.21048
BB 0.022099 0.1105 0.68508 6.232 88.376 3.6464 0.28729 0.64088
B 0 0 0.076161 0.72353 7.997 86.215 2.7037 2.2848
CCC 0 0 0 0.30888 1.8533 4.4788 81.004 12.355
D 0 0 0 0 0 0 0 100
fprintf('Total transitions out of given rating, many more out of CCC and AA:\n')Total transitions out of given rating, many more out of CCC and AA:
disp(array2table(TotalsCohort2.totalsVec,'VariableNames',RatingsLabels))
AAA AA A BBB BB B CCC D
____ ____ ____ ____ ____ ____ ____ ____
3219 5131 5519 4751 4525 2626 1295 4050
Оценки вероятности перехода чувствительны к длине окна оценки. Когда окно оценки мало, оценки фиксируют только последние кредитные события, и они могут значительно измениться от одного года к следующему. Они называются оценками на определенный момент времени (PIT). Напротив, большое временное окно дает довольно стабильные оценки, которые средние скорости перехода в течение более длительного периода времени. Они называются оценками сквозного цикла (TTC).
Оценка вероятностей PIT требует повторных вызовов transprob с окном скользящей оценки. Использовать transprobprep каждый повторный вызов transprob являются обязательными. transprobprep выполняет этап предварительной обработки необработанного набора данных, который не зависит от окна оценки. Преимущества transprobprep больше, чем количество повторных вызовов transprob увеличивается. Кроме того, повышение производительности transprobprep являются более значимыми для cohort алгоритм.
load Data_TransProb prepData = transprobprep(data); Years = 1991:2000; nYears = length(Years); nRatings = length(prepData.ratingsLabels); transMatPIT = zeros(nRatings,nRatings,nYears); algorithm = 'duration'; sampleTotals(nYears,1) = struct('totalsVec',[],'totalsMat',[],... 'algorithm',algorithm); for t = 1:nYears startDate = ['31-Dec-' num2str(Years(t)-1)]; endDate = ['31-Dec-' num2str(Years(t))]; [transMatPIT(:,:,t),sampleTotals(t)] = transprob(prepData,... 'startDate',startDate,'endDate',endDate,'algorithm',algorithm); end
Вот матрица перехода PIT для 1993 года. Напомним, что образец набора данных содержит смоделированные миграции кредитов, поэтому оценки PIT в этом примере не соответствуют фактическим историческим коэффициентам перехода.
transMatPIT(:,:,Years==1993)
ans =
95.3193 4.5999 0.0802 0.0004 0.0002 0.0000 0.0000 0.0000
2.0631 94.5931 3.3057 0.0254 0.0126 0.0002 0.0000 0.0000
0.0237 2.1748 95.5901 1.4700 0.7284 0.0131 0.0000 0.0000
0.0003 0.0372 3.2585 95.2914 1.3876 0.0250 0.0001 0.0000
0.0000 0.0005 0.0657 3.8292 92.7474 3.3459 0.0111 0.0001
0.0000 0.0001 0.0128 0.7977 8.0926 90.4897 0.5958 0.0113
0.0000 0.0000 0.0005 0.0459 0.5026 11.1621 84.9315 3.3574
0 0 0 0 0 0 0 100.0000Структурный массив хранит sampleTotals необязательный вывод из transprob. sampleTotals структура содержит сводную информацию об общем времени, затраченном на каждый рейтинг, и количестве переходов из каждого рейтинга за каждый рассматриваемый год. Для получения дополнительной информации о sampleTotals структура, см. transprob.
В качестве примера, sampleTotals здесь используется структура для 1993 года. Общее время, затраченное на каждую оценку, сохраняется в totalsVec поле структуры. Общие переходы из каждого рейтинга хранятся в totalsMat поле. Третье поле, algorithm, указывает алгоритм, используемый для формирования структуры.
sampleTotals(Years==1993).totalsVec sampleTotals(Years==1993).totalsMat sampleTotals(Years==1993).algorithm
ans =
144.4411 230.0356 262.2438 204.9671 246.1315 147.0767 54.9562 215.1479
ans =
0 7 0 0 0 0 0 0
5 0 8 0 0 0 0 0
0 6 0 4 2 0 0 0
0 0 7 0 3 0 0 0
0 0 0 10 0 9 0 0
0 0 0 1 13 0 1 0
0 0 0 0 0 7 0 2
0 0 0 0 0 0 0 0
ans =
durationЧтобы получить матрицу перехода TTC, передайте sampleTotals структурный массив для transprobbytotals. Внутри, transprobbytotals агрегирует информацию в sampleTotals структуры для получения общего времени, затраченного на каждый рейтинг в течение 10 лет, рассматриваемых в этом примере, и общего количества переходов из каждого рейтинга в течение одного и того же периода. transprobbytotals использует агрегированную информацию для получения матрицы TTC или матрицы среднего однолетнего перехода.
transMatTTC = transprobbytotals(sampleTotals)
transMatTTC =
92.8544 6.1068 0.7463 0.2761 0.0123 0.0009 0.0001 0.0032
2.9399 92.2329 3.8394 0.7349 0.1676 0.0050 0.0004 0.0799
0.2410 4.5963 90.3468 3.9572 0.6909 0.0521 0.0025 0.1133
0.0530 0.4729 7.9221 87.2751 3.5075 0.4650 0.0791 0.2254
0.0460 0.1636 1.1873 9.3442 85.4305 2.9520 0.1150 0.7615
0.0031 0.0152 0.2608 1.5563 10.4468 83.8525 1.9771 1.8882
0.0009 0.0041 0.0542 0.8378 2.9996 7.3614 82.4758 6.2662
0 0 0 0 0 0 0 100.0000Та же самая матрица TTC может быть получена при прямом вызове transprob, установив окно оценки на 10 рассматриваемых лет. Но гораздо более эффективно использовать sampleTotals структуры, когда они доступны. (Примечание, для duration алгоритм, эти альтернативные рабочие процессы могут привести к небольшим числовым различиям в оценках всякий раз, когда високосные годы являются частью выборки.)
В оценке вероятностей перехода 1-летняя матрица перехода оценивается с использованием 5-летнего временного окна с 1996 по 2000 год. Это еще один пример матрицы TTC, и это также может быть вычислено с использованием sampleTotals структурный массив.
transprobbytotals(sampleTotals(Years>=1996&Years<=2000))
ans =
90.6239 7.9048 1.0313 0.4123 0.0210 0.0020 0.0003 0.0043
4.4776 89.5565 4.5294 1.1224 0.2283 0.0094 0.0009 0.0754
0.3982 6.1159 87.0651 5.4797 0.7636 0.0892 0.0050 0.0832
0.1029 0.8571 10.7909 83.0218 3.9968 0.7001 0.1313 0.3991
0.1043 0.3744 2.2960 14.0947 78.9851 3.0012 0.0463 1.0980
0.0113 0.0544 0.7054 3.2922 15.4341 75.6004 1.8165 3.0858
0.0044 0.0189 0.1903 1.9742 6.2318 10.2332 75.9990 5.3482
0 0 0 0 0 0 0 100.0000Изменяя даты начала и окончания, объем данных, рассматриваемых для оценки, изменяется, но выходные данные по-прежнему содержат по умолчанию вероятности перехода на один год. Можно изменить поведение по умолчанию, указав transInterval аргумент, как показано в оценке вероятностей перехода.
Однако, когда вероятности t-летнего перехода требуются для целого диапазона значений t, например, вероятности 1-летнего, 2-летнего, 3-летнего, 4-летнего и 5-летнего перехода, более эффективно вызывать transprob один раз, чтобы получить дополнительный выход sampleTotals. Вы можете использовать то же самое sampleTotals структура может быть использована для получения матрицы t-летнего перехода для любого интервала перехода t. sampleTotals структура и интервал перехода, можно получить соответствующую матрицу перехода с помощью transprobbytotals.
load Data_TransProb startDate = '31-Dec-1995'; endDate = '31-Dec-2000'; [~,sampleTotals] = transprob(data,'startDate', ... startDate, 'endDate',endDate); DefProb = zeros(7,5); for t = 1:5 transMatTemp = transprobbytotals(sampleTotals,'transInterval',t); DefProb(:,t) = transMatTemp(1:7,8); end DefProb
DefProb =
0.0043 0.0169 0.0377 0.0666 0.1033
0.0754 0.1542 0.2377 0.3265 0.4213
0.0832 0.1936 0.3276 0.4819 0.6536
0.3992 0.8127 1.2336 1.6566 2.0779
1.0980 2.1189 3.0668 3.9468 4.7644
3.0860 5.6994 7.9281 9.8418 11.4963
5.3484 9.8053 13.5320 16.6599 19.2964transprob также возвращает idTotals структурный массив, который содержит для каждого идентификатора или компании общее время, затраченное на каждый рейтинг, и общие переходы из каждого рейтинга. Для получения дополнительной информации о idTotals структура, см. transprob. idTotals структура аналогична sampleTotals структуры (см. Оценка вероятностей на определенный момент времени и через цикл), но idTotals содержит информацию на уровне идентификатора. Поскольку большинство компаний мигрируют только между несколькими рейтингами, числовые массивы в idTotals хранятся в виде разреженных массивов для уменьшения требований к памяти.
Вы можете использовать idTotals структурный массив для оценки доверительных интервалов для вероятностей перехода с помощью процедуры начальной загрузки, как показано в следующем примере. Для этого звоните transprob и сохранить третий выходной аргумент, idTotals. idTotals отображаются поля для последней компании в образце. В рамках оценочного окна эта компания тратит почти год как 'AA' и затем он обновляется до 'AAA'.
load Data_TransProb startDate = '31-Dec-1995'; endDate = '31-Dec-2000'; [transMat,~,idTotals] = transprob(data,... 'startDate',startDate,'endDate',endDate); % Total time spent on each rating full(idTotals(end).totalsVec) % Total transitions out of each rating full(idTotals(end).totalsMat) % Algorithm idTotals(end).algorithm
ans =
4.0820 0.9180 0 0 0 0 0 0
ans =
0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
ans =
durationДалее используйте bootstrp из статистики и Toolbox™ машинного обучения с transprobbytotals в качестве функции начальной загрузки и idTotals в качестве данных для выборки из. Каждая выборка начальной загрузки соответствует набору данных, составленному из компаний, отобранных с заменой исходных данных. Тем не менее, вам не придется черпать компании из исходных данных, потому что bootstrap idTotals образец содержит всю информацию, необходимую для вычисления вероятностей перехода. transprobbytotals агрегирует все структуры в каждой начальной загрузке idTotals и находит соответствующую матрицу перехода.
Чтобы оценить 95% доверительные интервалы для матрицы перехода и отобразить вероятности по умолчанию вместе с его верхней и нижней доверительными границами:
PD = transMat(1:7,8);
bootstat = bootstrp(100,@(totals)transprobbytotals(totals),idTotals);
ci = prctile(bootstat,[2.5 97.5]); % 95% confidence
CIlower = reshape(ci(1,:),8,8);
CIupper = reshape(ci(2,:),8,8);
PD_LB = CIlower(1:7,8);
PD_UB = CIupper(1:7,8);
[PD_LB PD PD_UB]ans =
0.0004 0.0043 0.0106
0.0028 0.0754 0.2192
0.0126 0.0832 0.2180
0.1659 0.3992 0.6617
0.5703 1.0980 1.7260
1.7264 3.0860 4.7602
1.7678 5.3484 9.5055Шкалы кредитных рейтингов могут быть более или менее детализированными. Например, существуют рейтинги с квалификаторами (например, 'AA+', 'BB-'и так далее), целые рейтинги ('AA', 'BB'и так далее), и инвестиционный или спекулятивный класс ('IG', 'SG'Категории. Учитывая набор данных с кредитными рейтингами на более детальном уровне, вероятности перехода для менее детализированных категорий могут представлять интерес. Например, вам может быть интересна матрица перехода для инвестиционных и спекулятивных оценок с набором данных с целыми рейтингами. Использовать transprobgrouptotals для этой оценки, как проиллюстрировано в следующих примерах. Данные набора данных образца имеют целые кредитные рейтинги:
load Data_TransProb startDate = '31-Dec-1995'; endDate = '31-Dec-2000'; data(1:5,:)
ans =
'00010283' '10-Nov-1984' 'CCC'
'00010283' '12-May-1986' 'B'
'00010283' '29-Jun-1988' 'CCC'
'00010283' '12-Dec-1991' 'D'
'00013326' '09-Feb-1985' 'A' Вызов transprob возвращает матрицу перехода и итоговые структуры для восьми ('AAA' кому 'D') целые кредитные рейтинги. Массив с количеством переходов из каждого кредитного рейтинга отображается после вызова transprob:
[transMat,sampleTotals,idTotals] = transprob(data,'startDate',startDate,... 'endDate',endDate); sampleTotals.totalsMat
ans =
0 67 7 3 0 0 0 0
67 0 68 15 3 0 0 1
4 101 0 93 11 1 0 1
1 7 163 0 62 10 2 5
1 3 16 168 0 37 0 11
0 0 2 10 83 0 10 14
0 0 0 2 8 16 0 7
0 0 0 0 0 0 0 0Далее используйте transprobgrouptotals сгруппировать целые рейтинги в инвестиционные и спекулятивные оценки. Эта функция принимает структуру итогов в качестве первого аргумента. Второй аргумент указывает границы между категориями оценок. В этом случае рейтинги от 1 до 4 ('AAA' через 'BBB') соответствуют первой категории ('IG'), оценки от 5 до 7 ('BB' через 'CCC') ко второй категории ('SG') и рейтинг 8 ('D') является собственной категорией. transprobgrouptotals суммирует общее время, затраченное на оценки, относящиеся к одной и той же категории. Например, общее время, затраченное на 'AAA' через 'BBB' складываются как общее время, затраченное на 'IG'. transprobgrouptotals также складывает общее количество переходов между любыми 'IG' рейтинг и любой 'SG' рейтинг, например, кредитная миграция из 'BBB' кому 'BB'.
Сгруппированные итоговые суммы можно затем передать в transprobbytotals получить матрицу перехода для инвестиционных и спекулятивных оценок. Оба totalsMat и новая матрица перехода оба 3около-3, соответствующие сгруппированным категориям 'IG', 'SG', и 'D'.
sampleTotalsIGSG = transprobgrouptotals(sampleTotals,[4 7 8]) transMatIGSG = transprobbytotals(sampleTotalsIGSG)
sampleTotalsIGSG =
totalsVec: [4.8591e+003 1.5034e+003 1.1621e+003]
totalsMat: [3x3 double]
algorithm: 'duration'
transMatIGSG =
98.1591 1.6798 0.1611
12.3228 85.6961 1.9811
0 0 100.0000При передаче массива структуры итоговых значений transprobgrouptotalsэта функция группирует каждую структуру в массиве по отдельности и сохраняет разреженность, если поля во входных структурах являются разреженными. Одним из способов использования этой функции является вычисление доверительных интервалов для ставки по умолчанию инвестиционного уровня и ставки по умолчанию спекулятивного уровня (см. также Оценка доверительных интервалов начальной загрузки).
PDIGSG = transMatIGSG(1:2,3);
idTotalsIGSG = transprobgrouptotals(idTotals,[4 7 8]);
bootstat = bootstrp(100,@(totals)transprobbytotals(totals),idTotalsIGSG);
ci = prctile(bootstat,[2.5 97.5]); % 95% confidence
CIlower = reshape(ci(1,:),3,3);
CIupper = reshape(ci(2,:),3,3);
PDIGSG_LB = CIlower(1:2,3);
PDIGSG_UB = CIupper(1:2,3);
[PDIGSG_LB PDIGSG PDIGSG_UB]
ans =
0.0603 0.1611 0.2538
1.3470 1.9811 2.6195Вероятности перехода и количество переходов между рейтингами обычно сообщаются без 'D' ('Default') строка. Например, кредитный отчет может содержать следующую таблицу, указывающую количество эмитентов, начинающихся в каждом рейтинге (первый столбец), и количество переходов между рейтингами (остальные столбцы):
Initial AAA AA A BBB BB B CCC D
AAA 98 88 9 1 0 0 0 0 0
AA 389 0 368 19 2 0 0 0 0
A 1165 1 21 1087 56 0 0 0 0
BBB 1435 0 2 89 1289 45 8 0 2
BB 915 0 0 1 60 776 73 2 3
B 867 0 0 1 7 88 715 39 17
CCC 112 0 0 0 1 3 34 61 13Можно сохранить информацию в этой таблице в структуре итогов, совместимой с cohort алгоритм. Для получения дополнительной информации о cohort алгоритм и итоговая структура, см. transprob. totalsMat в данном случае поле является некварным массивом.
% Define totals structure totals.totalsVec = [98 389 1165 1435 915 867 112]; totals.totalsMat = [ 88 9 1 0 0 0 0 0; 0 368 19 2 0 0 0 0; 1 21 1087 56 0 0 0 0; 0 2 89 1289 45 8 0 2; 0 0 1 60 776 73 2 3; 0 0 1 7 88 715 39 17; 0 0 0 1 3 34 61 13]; totals.algorithm = 'cohort';
transprobbytotals и transprobgrouptotals принимать итоговые входные данные с некварными totalsMat поля. Чтобы получить матрицу перехода, соответствующую предыдущей таблице, и сгруппировать рейтинги в инвестиционные и спекулятивные оценки с соответствующей матрицей:
transMat = transprobbytotals(totals)
% Group into IG/SG and get IG/SG transition matrix
totalsIGSG = transprobgrouptotals(totals,[4 7]);
transMatIGSG = transprobbytotals(totalsIGSG)
transMat =
89.7959 9.1837 1.0204 0 0 0 0 0
0 94.6015 4.8843 0.5141 0 0 0 0
0.0858 1.8026 93.3047 4.8069 0 0 0 0
0 0.1394 6.2021 89.8258 3.1359 0.5575 0 0.1394
0 0 0.1093 6.5574 84.8087 7.9781 0.2186 0.3279
0 0 0.1153 0.8074 10.1499 82.4683 4.4983 1.9608
0 0 0 0.8929 2.6786 30.3571 54.4643 11.6071
transMatIGSG =
98.2183 1.7169 0.0648
3.6959 94.5618 1.7423
idTotals вывод из transprob можно также использовать для обновления оценок вероятности перехода после удаления некоторой информации об отклонениях. Для получения дополнительной информации о idTotals, см. transprob. Например, если известно, что информация о миграции кредитного рейтинга для 4-й и 27-й компаний в данных имеет проблемы, можно удалить эти компании и эффективно обновить вероятности перехода следующим образом:
load Data_TransProb startDate = '31-Dec-1995'; endDate = '31-Dec-2000'; [transMat,~,idTotals] = transprob(data,'startDate', ... startDate, 'endDate',endDate); transMat
transMat =
90.6236 7.9051 1.0314 0.4123 0.0210 0.0020 0.0003 0.0043
4.4780 89.5558 4.5298 1.1225 0.2284 0.0094 0.0009 0.0754
0.3983 6.1164 87.0641 5.4801 0.7637 0.0892 0.0050 0.0832
0.1029 0.8572 10.7918 83.0204 3.9971 0.7001 0.1313 0.3992
0.1043 0.3745 2.2962 14.0954 78.9840 3.0013 0.0463 1.0980
0.0113 0.0544 0.7055 3.2925 15.4350 75.5988 1.8166 3.0860
0.0044 0.0189 0.1903 1.9743 6.2320 10.2334 75.9983 5.3484
0 0 0 0 0 0 0 100.0000
nIDs = length(idTotals);
keepInd = setdiff(1:nIDs,[4 27]);
transMatNoOutlier = transprobbytotals(idTotals(keepInd))
transMatNoOutlier =
90.6241 7.9067 1.0290 0.4124 0.0211 0.0020 0.0003 0.0043
4.4917 89.5918 4.4779 1.1240 0.2288 0.0094 0.0009 0.0756
0.3990 6.1220 87.0530 5.4841 0.7643 0.0893 0.0050 0.0833
0.1030 0.8576 10.7909 83.0207 3.9971 0.7001 0.1313 0.3992
0.1043 0.3746 2.2960 14.0955 78.9840 3.0013 0.0463 1.0980
0.0113 0.0544 0.7054 3.2925 15.4350 75.5988 1.8166 3.0860
0.0044 0.0189 0.1903 1.9743 6.2320 10.2334 75.9983 5.3484
0 0 0 0 0 0 0 100.0000Решение о том, какие компании следует удалить, зависит от конкретного случая. Причины удаления компании могут включать опечатку в одной из историй рейтингов или необычную миграцию между рейтингами, влияние которых на оценки вероятности перехода должно быть измерено. transprob ни в коей мере не переупорядочивает компании. Порядок компаний во входных данных совпадает с порядком в idTotals массив.
Вы можете использовать idTotals эффективно получать оценки по различным сегментам выборки. Для получения дополнительной информации о idTotals, см. transprob. Например, предположим, что компании в примере сгруппированы в три географических региона и что компании были сгруппированы по географическим регионам ранее, так что первые 340 компаний соответствуют первому региону, следующие 572 компании - второму региону, а остальные - третьему региону. Можно эффективно получить вероятности перехода для каждой области следующим образом:
load Data_TransProb startDate = '31-Dec-1995'; endDate = '31-Dec-2000'; [~,~,idTotals] = transprob(data,'startDate', ... startDate, 'endDate',endDate); n1 = 340; n2 = 572; transMatG1 = transprobbytotals(idTotals(1:n1)) transMatG2 = transprobbytotals(idTotals(n1+1:n1+n2)) transMatG3 = transprobbytotals(idTotals(n1+n2+1:end))
transMatG1 =
90.8299 7.6501 0.3178 1.1700 0.0255 0.0044 0.0021 0.0002
4.3572 89.0262 5.7838 0.8039 0.0245 0.0029 0.0013 0.0001
0.7066 6.7567 86.6320 5.4950 0.3721 0.0252 0.0101 0.0023
0.0626 1.3688 10.3895 83.5022 3.6823 0.6466 0.3084 0.0396
0.0256 0.7884 2.6970 13.7857 78.8321 2.8310 0.0561 0.9842
0.0026 0.1095 0.4280 3.5204 21.1437 72.9230 1.6456 0.2273
0.0005 0.0216 0.0730 0.4574 4.9586 4.2821 80.3062 9.9006
0 0 0 0 0 0 0 100.0000
transMatG2 =
90.5798 8.4877 0.8202 0.0884 0.0132 0.0011 0.0000 0.0096
4.1999 90.0371 3.8657 1.4744 0.2144 0.0128 0.0001 0.1956
0.3022 5.9869 86.7128 5.5526 1.0411 0.1902 0.0015 0.2127
0.0204 0.5606 10.9342 82.9195 4.0123 0.7398 0.0059 0.8073
0.0089 0.3338 2.1185 16.6496 76.2395 3.1241 0.0261 1.4995
0.0013 0.0465 0.6710 2.4731 14.7281 76.7378 1.2993 4.0428
0.0002 0.0080 0.0681 0.4598 4.1324 8.4380 80.9092 5.9843
0 0 0 0 0 0 0 100.0000
transMatG3 =
90.5655 7.5408 1.5288 0.3369 0.0258 0.0015 0.0003 0.0004
4.8073 89.3842 4.4865 0.9582 0.3509 0.0095 0.0009 0.0025
0.3153 5.8771 87.6353 5.4101 0.7160 0.0322 0.0052 0.0088
0.1995 0.8625 10.8682 82.8717 4.1423 0.6903 0.1565 0.2090
0.2465 0.1091 2.1558 12.0289 81.5803 3.0057 0.0616 0.8122
0.0227 0.0400 0.9380 4.3175 12.3632 75.9429 2.5766 3.7991
0.0149 0.0180 0.3414 3.6918 8.1414 13.6010 70.7254 3.4661
0 0 0 0 0 0 0 100.0000В этом примере показано, как агрегировать оценки из двух (или более) наборов данных. Возможно, что два набора данных, поступающих из двух различных баз данных, должны быть рассмотрены для оценки вероятностей перехода. Кроме того, если набор данных слишком велик и не может быть загружен в память, он может быть разделен на два (или более) набора данных. В этих случаях применять просто transprob в каждый отдельный набор данных, а затем получить окончательные оценки, соответствующие агрегированным данным, с вызовом transprobbytotals в конце.
Например, в этом примере данные набора данных искусственно разбиваются на два раздела. На практике два набора данных будут поступать из разных файлов или баз данных. При агрегировании нескольких наборов данных история компании не может быть разделена по наборам данных. Можно проанализировать, что это условие выполняется для произвольно выбранной точки отсечения.
load Data_TransProb
cutoff = 2099;
data(cutoff-5:cutoff,:)
data(cutoff+1:cutoff+6,:)ans =
'00011166' '24-Aug-1995' 'BBB'
'00011166' '25-Jan-1997' 'A'
'00011166' '01-Feb-1998' 'AA'
'00014878' '15-Mar-1983' 'B'
'00014878' '21-Sep-1986' 'BB'
'00014878' '17-Jan-1998' 'BBB'
ans =
'00012043' '09-Feb-1985' 'BBB'
'00012043' '03-Jan-1988' 'A'
'00012043' '15-Jan-1994' 'AAA'
'00011157' '24-Jun-1984' 'A'
'00011157' '09-Dec-1999' 'BBB'
'00011157' '28-Mar-2001' 'A' При работе с несколькими наборами данных важно явно задавать даты начала и окончания. В противном случае окно оценки различается для каждого набора данных, поскольку даты начала и окончания по умолчанию используются transprob - самые ранние и последние даты, найденные во входных данных.
startDate = '31-Dec-1995'; endDate = '31-Dec-2000';
На практике это точка, где вы можете прочитать в первом наборе данных. Теперь набор данных уже получен. Звонить transprob с первым набором данных и явными датами начала и окончания. Сохранить только sampleTotals выход. Для получения подробной информации о sampleTotals, см. transprob.
[~,sampleTotals(1)] = transprob(data(1:cutoff,:),... 'startDate',startDate,'endDate',endDate);
Повторите действия для остальных наборов данных. Обратите внимание на различные sampleTotals структуры хранятся в структурированном массиве.
[~,sampleTotals(2)] = transprob(data(cutoff+1:end,:),... 'startDate',startDate,'endDate',endDate);
Чтобы получить матрицу перехода, соответствующую агрегированному набору данных, используйте transprobbytotals. Если входным итогом является структурный массив, transprobbytotals агрегирует информацию по всем структурам и возвращает одну матрицу перехода.
transMatAggr = transprobbytotals(sampleTotals)
transMatAggr =
90.6236 7.9051 1.0314 0.4123 0.0210 0.0020 0.0003 0.0043
4.4780 89.5558 4.5298 1.1225 0.2284 0.0094 0.0009 0.0754
0.3983 6.1164 87.0641 5.4801 0.7637 0.0892 0.0050 0.0832
0.1029 0.8572 10.7918 83.0204 3.9971 0.7001 0.1313 0.3992
0.1043 0.3745 2.2962 14.0954 78.9840 3.0013 0.0463 1.0980
0.0113 0.0544 0.7055 3.2925 15.4350 75.5988 1.8166 3.0860
0.0044 0.0189 0.1903 1.9743 6.2320 10.2334 75.9983 5.3484
0 0 0 0 0 0 0 100.0000Для этого примера можно проанализировать, что процедура агрегации дает те же оценки (вплоть до числовых разниц), что и оценка вероятностей непосредственно по всей выборке:
transMatWhole = transprob(data,'startDate',startDate,'endDate',endDate) aggError = max(max(abs(transMatAggr - transMatWhole)))
transMatWhole =
90.6236 7.9051 1.0314 0.4123 0.0210 0.0020 0.0003 0.0043
4.4780 89.5558 4.5298 1.1225 0.2284 0.0094 0.0009 0.0754
0.3983 6.1164 87.0641 5.4801 0.7637 0.0892 0.0050 0.0832
0.1029 0.8572 10.7918 83.0204 3.9971 0.7001 0.1313 0.3992
0.1043 0.3745 2.2962 14.0954 78.9840 3.0013 0.0463 1.0980
0.0113 0.0544 0.7055 3.2925 15.4350 75.5988 1.8166 3.0860
0.0044 0.0189 0.1903 1.9743 6.2320 10.2334 75.9983 5.3484
0 0 0 0 0 0 0 100.0000
aggError =
2.8422e-014bootstrp | transprob | transprobbytotals | transprobfromthresholds | transprobgrouptotals | transprobprep | transprobtothresholds