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