Кредитные рейтинги оценивают заемщиков в соответствии с их кредитоспособностью. Хотя этот рейтинг сам по себе полезен, институты также заинтересованы в том, чтобы знать, насколько вероятно, что заемщики в конкретной категории рейтинга будут повышены или понижены до другого рейтинга, и особенно, насколько вероятно, что они будут дефолтовать.
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
проходит nRecord
s-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.2964
transprob
также возвращает 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-014
bootstrp
| transprob
| transprobbytotals
| transprobfromthresholds
| transprobgrouptotals
| transprobprep
| transprobtothresholds