Кредитные рейтинги оценивают заемщиков согласно своей стоимости кредита. Хотя этот рейтинг, сам по себе, полезен, учреждения также интересуются знанием, с какой вероятностью случается так, что заемщики в конкретной категории оценки будут обновлены или понижены до различной оценки, и особенно, с какой вероятностью случается так, что они примут значение по умолчанию.
Предложение Transition probabilities один способ охарактеризовать прошлые изменения в кредитоспособности должников (обычно фирмы), и является кардинальными входными параметрами ко многим приложениям управления рисками. Программное обеспечение Financial 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' Выборочные данные отформатированы как массив ячеек с тремя столбцами. Каждая строка содержит ID (столбец 1), дата (столбец 2) и кредитный рейтинг (столбец 3). Присвоенный кредитный рейтинг соответствует связанному ID в связанную дату. Вся информация, соответствующая тому же ID, должна храниться в непрерывных строках. В этом примере идентификаторы, даты и оценки хранятся в символьном векторном формате, но также можно ввести их в числовой формат.
В этом примере, самом простом синтаксисе вызова для 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Обеспечьте явные даты начала и конца, в противном случае, окно оценки для двух различных наборов данных может отличаться, и оценки не могут быть сопоставимыми. От этой точки примите, что окно времени интереса является пятилетним периодом от конца 1 995 в конец 2 000. Для сравнений вычислите оценки для этого окна времени. Сначала используйте 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. Например, чтобы получить вероятности перехода 2D года с помощью 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 функционируйте использует the'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'). Это означает, что первая компания все еще вносит переходы from'CCC' к 'CCC' для оценки только периоды, перекрывающиеся со временем, эта компания потрачена в 'NR' были удалены из выборки, и так же для другой компании.
Эта процедура отличается от удаления 'NR' строки из самих данных.
Например, если вы удаляете 'NR' строки в этом примере, первая компания, кажется, остается в ее начальной оценке 'CCC' полностью с начальной даты в 1 984 к стандартному событию в 1 991. С предыдущим подходом оценка знает, что компания перешла из '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 для 1 993. Вспомните, что демонстрационный набор данных содержит симулированные миграции кредита, таким образом, оценки 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 структура для 1 993 используется здесь. Общее время, проведенное на каждой оценке, хранится в 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-летнего окна времени от 1 996 до 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 массив структур, который содержит, для каждого ID или компании, общее время, проведенное на каждой оценке и общие переходы из каждой оценки. Для получения дополнительной информации о idTotals структура, смотрите transprob. idTotals структура похожа на sampleTotals структуры (см. Оценочный Момент времени и Вероятности Через цикл), но idTotals имеет информацию на уровне ID. Поскольку большинство компаний только мигрирует между немногими оценками, числовыми массивами в 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 от Statistics and Machine Learning Toolbox™ с transprobbytotals как функция начальной загрузки и idTotals как данные к выборке от. Каждая выборка начальной загрузки соответствует набору данных, сделанному из компаний, произведенных с заменой из исходных данных. Однако вы не должны чертить компании из исходных данных, потому что начальная загрузка 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-014transprob | transprobprep | transprobbytotals | bootstrp | transprobgrouptotals | transprobtothresholds | transprobfromthresholds