Кредитные рейтинги оценивают заемщиков согласно своей стоимости кредита. Хотя этот рейтинг, сам по себе, полезен, учреждения также интересуются знанием, как, вероятно, случается так, что заемщики в конкретной категории оценки будут обновлены или понижены до различной оценки, и особенно, как, вероятно, случается так, что они примут значение по умолчанию.
Предложение 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'
из матрицы перехода, необходимо работать с sampleTotals
дополнительный вывод от transprob
. Структура sampleTotals
имеет информацию количеств перехода между оценками (поле totalsMat
), и общие переходы из каждой оценки (totalsVec
).
Чтобы удалить 'NR'
из матрицы перехода, необходимо удалить переходы в и из оценки 'NR'
. Это означает, удалите строку и столбец в totalsMat
, которые соответствуют 'NR'
.
Поскольку удаление этих переходов изменяет общее количество переходов из других оценок (любой переход оценки в 'NR'
затронут), вектор totalsVec
должен быть обновлен с новыми общими количествами, который исключает переходы в и из 'NR'
. Настроенным количеством на оценку является totalsVec
, вычисленный как сумма строками в новом totalsMat
. Затем используйте transprobbytotals
, чтобы получить матрицу перехода.
TotalsCohort = TotalsNRCohort; TotalsCohort.totalsMat = TotalsCohort.totalsMat(1:end-1,1:end-1); TotalsCohort.totalsVec = sum(TotalsCohort.totalsMat,2)'; TotalsCohort.algorithm = 'cohort'; RatingsLabels = {'AAA','AA','A','BBB','BB','B','CCC','D'}; MatrixCohort = transprobbytotals(TotalsCohort); fprintf('Transition probability, cohort, after postprocessing to remove NR:\n') disp(array2table(MatrixCohort,'VariableNames',RatingsLabels,... 'RowNames',RatingsLabels)) fprintf('Total transitions out of given rating, AA and CCC have one less than before:\n') disp(array2table(TotalsCohort.totalsVec,'VariableNames',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
Эта процедура отличается от удаления строк 'NR'
от самих данных.
Например, если вы удаляете строки 'NR'
в этом примере, первая компания, кажется, остается в ее начальной оценке 'CCC'
полностью с начальной даты в 1 984 к стандартному событию в 1 991. С предыдущим подходом оценка знает, что компания перешла из 'CCC'
в какой-то момент, это знает, что не оставалось в 'CCC'
все время.
Вторая компания, кажется, осталась в выборке как компания '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'
Матрицы перехода будут отличаться. Вероятность пребывания в '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: 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 Total transitions out of given rating, many more out of CCC and AA: 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
-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
, этот функциональные группы каждая структура в массиве индивидуально и сохраняет разреженность, если поля во входных структурах разреженны. Один способ использовать эту функцию состоит в том, чтобы вычислить доверительные интервалы для уровня значения по умолчанию инвестиционного класса и спекулятивного уровня значения по умолчанию класса (см. также Оценочные Доверительные интервалы Начальной загрузки).
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