Кредитные рейтинги оценивают заемщиков в соответствии с их кредитоспособностью. Хотя этот рейтинг сам по себе полезен, институты также заинтересованы в том, чтобы знать, насколько вероятно, что заемщики в конкретной категории рейтинга будут повышены или понижены до другого рейтинга, и особенно, насколько вероятно, что они будут дефолтовать.
Transition probabilities предлагаем один из способов охарактеризовать прошлые изменения в качестве кредита должников (как правило, фирм) и являются важнейшими входами для многих приложений по управлению рисками. Программное обеспечение Financial Toolbox™ поддерживает оценку вероятностей перехода, используя как когортные, так и длительные (также известные как темп опасности или интенсивность) подходы, используя transprob и смежные функции.
Примечание
Набор выборочных наборов данных, используемый в этом разделе, моделируется с помощью одной матрицы перехода. Никаких попыток соответствовать историческим трендам в показателях переходного периода не предпринимается.
The 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' необязательный входной параметр name-value, transprob.
The '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. The 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 алгоритм, эти альтернативные рабочие процессы могут привести к небольшим численным различиям в оценках, когда годы скачка являются частью выборки.)
В Estimate Transition Probabilities 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. The idTotals структура подобна sampleTotals структуры (см. Оценка вероятностей на момент времени и через цикл), но idTotals имеет информацию на уровне идентификатора. Поскольку большинство компаний мигрируют только между несколькими рейтингами, числовые массивы в idTotals хранятся как разреженные массивы для уменьшения требований к памяти.
Можно использовать idTotals массив структуры для оценки доверительных интервалов для вероятностей перехода с помощью процедуры начальной загрузки, как демонстрирует следующий пример. Для этого звоните transprob и сохраните третий выходной аргумент, idTotals. The 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 от Statistics and Machine Learning Toolbox™ с transprobbytotals как функцию bootstrap и idTotals в качестве данных для выборки из. Каждая выборка bootstrap соответствует набору данных, составленному из компаний, отобранных с заменой из исходных данных. Однако вам не придется черпать компании из исходных данных, потому что bootstrap idTotals выборка содержит всю информацию, необходимую для вычисления вероятностей перехода. transprobbytotals агрегирует все структуры в каждом bootstrap 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-by- 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эта функция группирует каждую структуру в массиве по отдельности и сохраняет разреженность, если поля в вход структурах разрежены. Один из способов использовать эту функцию - вычислить доверительные интервалы для ставки по умолчанию инвестиционного класса и спекулятивной ставки по умолчанию (см. Также. «Оценка доверительных интервалов Bootstrap»).
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. The totalsMat в этом случае поле представляет собой массив, не являющийся quare.
% 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
The 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