Кредитный рейтинг путем упаковки деревьев решений

В этом примере показано, как создать автоматический инструмент кредитного рейтинга.

Одной из основополагающих задач в управлении кредитными рисками является присвоение класса кредита заемщику. Оценки используются для ранжирования клиентов в соответствии с их воспринимаемой кредитоспособностью: лучшие оценки означают менее рискованных клиентов; аналогичные оценки означают сходный уровень риска. Оценки приходят в двух категориях: кредитные рейтинги и кредитные счета. Кредитные рейтинги - это небольшое количество дискретных классов, обычно маркируемых буквами, таких как 'AAA', 'BB-' и т.д. Кредитные счета являются числовыми оценками, такими как '640' или '720'. Кредитные оценки являются одним из ключевых элементов нормативных сред, таких как Базель II (см. Базельский комитет по банковскому надзору [3]).

Присвоение класса кредита предполагает анализ информации о заемщике. Если заемщик является индивидуумом, то к информации, представляющей интерес, могут относиться доходы индивидуума, непогашенная задолженность (ипотека, кредитные карты), размер домашнего хозяйства, статус жилого помещения и т.д. Для корпоративных заемщиков можно рассмотреть определенные финансовые коэффициенты (например, продажи, разделенные на совокупные активы), отрасль и т.д. Здесь мы ссылаемся на эти части информации о заемщике как на функции или предикторы. Различные учреждения используют различные предикторы, и они также могут иметь различные классы или области значений оценок, чтобы ранжировать своих клиентов. Для относительно небольших кредитов, предлагаемых крупному рынку потенциальных заемщиков (например, кредитные карты), обычно используются кредитные счета, и процесс классификации заемщика обычно автоматизируется. Для крупных кредитов, доступных для малых и средних компаний и крупных корпораций, обычно используются кредитные рейтинги, и процесс оценки может включать комбинацию автоматизированных алгоритмов и экспертного анализа.

Существуют рейтинговые агентства, которые отслеживают кредитоспособность компаний. Однако большинство банков разрабатывают внутреннюю методологию присвоения кредитных рейтингов своим клиентам. Оценка клиента внутренне может быть необходимостью, если клиент не был оценен рейтинговым агентством, но даже если существует рейтинг третьих лиц, внутренний рейтинг предлагает дополнительную оценку профиля риска клиента.

В этом примере показано, как MATLAB ® может помочь с автоматизированным этапом процесса кредитного рейтинга. В частности, мы используем один из инструментов статистического обучения, легко доступных в Statistics and Machine Learning Toolbox™, алгоритме классификации, известном как упакованное дерево решений.

Мы предполагаем, что историческая информация доступна в виде набора данных, где каждая запись содержит функции заемщика и кредитный рейтинг, который был присвоен ему. Это могут быть внутренние рейтинги, назначаемые комитетом, который следовал уже действующей политике и процедурам. В качестве альтернативы рейтинги могут поступать от рейтингового агентства, рейтинги которого используются для «скачка» новой внутренней системы кредитного рейтинга.

Существующие исторические данные являются начальной точкой, и они используются для обучения упакованного дерева решений, которое автоматизирует кредитный рейтинг. В словаре статистического обучения этот процесс обучения относится к категории контролируемого обучения. Затем классификатор используется для присвоения рейтингов новым клиентам. На практике эти автоматизированные или прогнозируемые рейтинги, скорее всего, будут рассматриваться как предварительные, пока их не рассмотрит кредитный комитет экспертов. Тип классификатора, который мы здесь используем, может также облегчить пересмотр этих рейтингов, потому что он обеспечивает меру уверенности для предсказанных рейтингов, классификационная оценка.

На практике сначала необходимо обучить классификатор, а затем использовать его для присвоения кредитного рейтинга новым клиентам, и, наконец, также необходимо профилировать или оценить качество или точность классификатора, процесс, также известный как валидация или обратное тестирование. Мы также обсуждаем некоторые легко доступные инструменты обратного тестирования.

Загрузка существующих данных кредитного рейтинга

Загружаем исторические данные из текстового файла с разделителями запятыми CreditRating_Historical.dat. Мы принимаем решение работать с текстовыми файлами здесь, но пользователи с доступом к Database Toolbox™ могут, безусловно, загружать эту информацию непосредственно из базы данных.

Набор данных содержит финансовые коэффициенты, отраслевой сектор и кредитные рейтинги для списка корпоративных клиентов. Это моделируемые, а не реальные данные. Первый столбец является идентификатором клиента. Тогда у нас пять столбцов финансовых коэффициентов. Это те же коэффициенты, которые используются в z-балле Альтмана (см. Альтман [1]; см. также Loeffler и Posch [4] для связанного анализа).

  • Оборотный капитал/Общие активы (WC_TA)

  • Невыплаченная прибыль/Совокупные активы (RE_TA)

  • Прибыль перед процентами и налогами/Общие активы (EBIT_TA)

  • Рыночное значение собственного капитала/балансовое значение общего долга (MVE_BVTD)

  • Продажи/Итого по активам (S_TA)

Далее у нас есть отраслевая метка, целое значение в диапазоне от 1 до 12. Последний столбец имеет кредитный рейтинг, присвоенный клиенту. Загружаем данные в table массив.

creditDS = readtable('CreditRating_Historical.dat');

Мы копируем функции в матрицу Xи соответствующие классы, рейтинги, в вектор Y. Это не обязательный шаг, поскольку мы могли получить доступ к этой информации непосредственно из dataset или table массив, но мы делаем это здесь, чтобы упростить некоторые повторные вызовы функций ниже.

Функции, которые будут храниться в матрице X являются пятью финансовыми коэффициентами и отраслевой меткой. Industry является категориальной переменной, номинальной на самом деле, потому что в отраслях нет упорядоченного расположения. Переменная отклика, кредитные рейтинги, также категориальна, хотя это порядковая переменная, потому что по определению рейтинги подразумевают рейтинг кредитоспособности. Мы можем использовать эту переменную «как есть», чтобы обучить наш классификатор. Здесь мы принимаем решение скопировать его в порядковый массив, потому что таким образом выходы выходят в естественном порядке оценок и легче считать. Упорядоченное расположение оценок устанавливается массивом ячеек, который мы передаем как третий аргумент в определении Y. Кредитные рейтинги также могут быть отображены в числовые значения, что может быть полезно, чтобы попробовать альтернативные методы для анализа данных (например, регрессия). Всегда рекомендуется попробовать различные методы на практике.

X = [creditDS.WC_TA creditDS.RE_TA creditDS.EBIT_TA creditDS.MVE_BVTD...
     creditDS.S_TA creditDS.Industry];
Y = ordinal(creditDS.Rating);

Мы используем предикторы X и ответ Y для подгонки конкретного типа классификационного ансамбля, называемого пакетированным деревом принятия решений. «Bagging», в этом контексте, означает «агрегирование загрузочных стропов». Методология состоит в том, чтобы сгенерировать несколько подвыборки, или загрузочных реплик, из набора данных. Эти подвыборки генерируются случайным образом, выборка с заменой из списка клиентов в наборе данных. Для каждой реплики выращивается дерево решений. Каждое дерево решений является самостоятельно обученным классификатором и может использоваться изолированно для классификации новых клиентов. Хотя прогнозы двух деревьев, выращенных из двух разных реплик bootstrap, могут быть различными. Ансамбль агрегирует предсказания всех деревьев решений, которые выращиваются для всех реплик bootstrap. Если большинство деревьев предсказывает один конкретный класс для нового клиента, разумно считать, что предсказание является более устойчивым, чем предсказание любого отдельного дерева. Кроме того, если другой класс предсказан меньшим набором деревьев, эта информация также полезна. Фактически, доля деревьев, которые предсказывают различные классы, является базисом для классификационных оценок, которые сообщаются ансамблем при классификации новых данных.

Построение древовидного баггера

Первым шагом к созданию нашего классификационного ансамбля станет поиск хорошего размера листа для отдельных деревьев; здесь мы пробуем размеры 1, 5 и 10. (Для получения дополнительной информации см. документацию по Statistics and Machine Learning Toolbox TreeBagger.) Мы начинаем с небольшого количества деревьев, только 25, потому что мы в основном хотим сравнить начальный тренд в ошибке классификации для различных размеров листьев. Для воспроизводимости и справедливых сравнений мы повторно инициализируем генератор случайных чисел, который используется для выборки с заменой из данных, каждый раз, когда мы создаем классификатор.

leaf = [1 5 10];
nTrees = 25;
rng(9876,'twister');
savedRng = rng; % save the current RNG settings

color = 'bgr';
for ii = 1:length(leaf)
   % Reinitialize the random number generator, so that the
   % random samples are the same for each leaf size
   rng(savedRng)
   % Create a bagged decision tree for each leaf size and plot out-of-bag
   % error 'oobError'
   b = TreeBagger(nTrees,X,Y,'OOBPrediction','on',...
                             'CategoricalPredictors',6,...
                             'MinLeafSize',leaf(ii));
   plot(oobError(b),color(ii))
   hold on
end
xlabel('Number of grown trees')
ylabel('Out-of-bag classification error')
legend({'1', '5', '10'},'Location','NorthEast')
title('Classification Error for Different Leaf Sizes')
hold off

Ошибки сопоставимы для трёх опций размера листа. Поэтому мы будем работать с листом размером 10, потому что это приводит к более постным деревьям и более эффективным расчетам.

Обратите внимание, что нам не пришлось разделять данные на обучающие и тестовые подмножества. Это делается внутренне, это неявно в процедуре выборки, которая лежит в основе метода. При каждой итерации bootstrap реплика bootstrap является набором обучающих данных, и все клиенты, оставшиеся вне системы («вне сумки»), используются в качестве тестовых точек для оценки ошибки классификации вне сумки, сообщенной выше.

Далее мы хотим выяснить, важны ли все функции для точности работы нашего классификатора. Мы делаем это, включив меру важности функции (OOBPredictorImportance) и постройте график результатов, чтобы визуально найти самые важные функции. Мы также пробуем больше деревьев сейчас, и сохраняем ошибку классификации, для дальнейших сравнений ниже.

nTrees = 50;
leaf = 10;
rng(savedRng);
b = TreeBagger(nTrees,X,Y,'OOBPredictorImportance','on',...
                          'CategoricalPredictors',6,...
                          'MinLeafSize',leaf);

bar(b.OOBPermutedPredictorDeltaError)
xlabel('Feature number')
ylabel('Out-of-bag feature importance')
title('Feature importance results')

oobErrorFullX = oobError(b);

Функции 2, 4 и 6 выделяются на фоне 4, рыночное значение собственного капитала/балансовое значение общего долга (MVE_BVTD), является самым важным предиктором для этого набора данных. Это соотношение тесно связано с предикторами кредитоспособности в структурных моделях, таких как модель Мертона [5], где значение капитала фирмы сравнивается с ее непогашенным долгом, чтобы определить вероятность дефолта.

Информация о промышленном секторе, признак 6 (Industry), также относительно более важна, чем другие переменные, для оценки кредитоспособности фирмы для этого набора данных.

Хотя не так важно, как MVE_BVTD, признак 2, невыплаченная прибыль/общие активы (RE_TA), выделяется из отдыха. Существует корреляция между удержанной прибылью и возрастом фирмы (чем дольше фирма существовала, тем больше прибыли она может накопить, в целом), и, в свою очередь, возраст фирмы коррелирует с ее кредитоспособностью (старые фирмы, как правило, чаще выживают в трудные времена).

Давайте подберем новый классификационный ансамбль, используя только предикторы RE_TA, MVE_BVTD, и Industry. Мы сравниваем его ошибку классификации с предыдущим классификатором, который использует все функции.

X = [creditDS.RE_TA creditDS.MVE_BVTD creditDS.Industry];

rng(savedRng)
b = TreeBagger(nTrees,X,Y,'OOBPrediction','on',...
                          'CategoricalPredictors',3,...
                          'MinLeafSize',leaf);

oobErrorX246 = oobError(b);

plot(oobErrorFullX,'b')
hold on
plot(oobErrorX246,'r')
xlabel('Number of grown trees')
ylabel('Out-of-bag classification error')
legend({'All features', 'Features 2, 4, 6'},'Location','NorthEast')
title('Classification Error for Different Sets of Predictors')
hold off

Точность классификации существенно не ухудшается, когда мы удаляем функции с относительно невысокой важностью (1, 3 и 5), поэтому для наших предсказаний мы будем использовать более скупый классификационный ансамбль.

В этом примере мы начали с набора только из шести функций и использовали меру важности функции классификатора и ошибку классификации вне мешка в качестве критерия, чтобы отобразить три переменные. Выбор признаков может быть длительным процессом, когда начальный набор потенциальных предикторов содержит десятки переменных. Помимо инструментов, которые мы использовали здесь (переменная важность и «визуальное» сравнение несовпадающих ошибок), другие инструменты выбора переменных в Statistics and Machine Learning Toolbox могут быть полезны для этих типов анализа (см. документацию). Однако в конечном счете успешный процесс выбора признаков требует комбинации количественных инструментов и суждения аналитика.

Для примера используемая здесь мера переменной важности является механизмом ранжирования, который оценивает относительное влияние функции путем измерения того, насколько ухудшается прогнозирующая точность классификатора, когда эти функции значения случайным образом переставляются. Идея заключается в том, что, когда рассматриваемая функция мало добавляет прогнозирующей степени классификатора, использование измененных (в этом случае перестановленных) значений не должно влиять на результаты классификации. Соответствующая информация, с другой стороны, не может быть случайным образом заменена без ухудшения предсказаний. Теперь, если две сильно коррелированные функции важны, они оба будут высоко оцениваться в этом анализе. В этом случае сохранение одной из этих функций должно быть достаточным для точных классификаций, но не следует знать этого только по результатам рейтинга. Нужно было бы проверить корреляции отдельно или использовать суждение эксперта. То есть инструменты, такие как переменная важность или sequentialfs может значительно помочь для выбора признаков, но суждение аналитика является ключевой частью этого процесса.

На данной точке классификатор может быть сохранен (например save classifier.mat b), которая будет загружена на будущем сеансе (load classifier) для классификации новых клиентов. Для эффективности рекомендуется сохранить компактную версию классификатора после завершения процесса обучения.

b = compact(b);

Классификация новых данных

Здесь мы используем ранее созданный классификационный ансамбль для присвоения кредитных рейтингов новым клиентам. Поскольку рейтинги существующих клиентов также необходимо пересматривать на регулярном базисный, особенно когда их финансовая информация существенно изменилась, набор данных может также содержать список существующих клиентов, находящихся на рассмотрении. Начнем с загрузки новых данных.

newDS = readtable('CreditRating_NewCompanies.dat');

Чтобы предсказать кредитный рейтинг для этих новых данных, мы вызываем predict метод на классификаторе. Метод возвращает два аргумента, предсказанный класс и классификационную оценку. Мы, безусловно, хотим получить оба выходных аргументов, поскольку классификационные оценки содержат информацию о том, насколько достоверными кажутся предсказанные рейтинги. Мы можем скопировать переменные RE_TA, MVE_BVTD и Industry в матрицу X, как и прежде, но так как мы сделаем только один вызов в predict, мы можем пропустить этот шаг и использовать newDS непосредственно.

[predClass,classifScore] = predict(b,[newDS.RE_TA newDS.MVE_BVTD newDS.Industry]);

На данной точке мы можем создать отчет. Здесь мы отображаем на экране только небольшой отчет для первых трех клиентов, для иллюстративных целей, но инструменты развертывания MATLAB могут значительно улучшить рабочий процесс здесь. Например, кредитные аналитики могли запустить эту классификацию удаленно, с помощью веб-браузера, и получить отчет, даже не имея на своих рабочих столах MATLAB.

for i = 1:3
   fprintf('Customer %d:\n',newDS.ID(i));
   fprintf('   RE/TA    = %5.2f\n',newDS.RE_TA(i));
   fprintf('   MVE/BVTD = %5.2f\n',newDS.MVE_BVTD(i));
   fprintf('   Industry = %2d\n',newDS.Industry(i));
   fprintf('   Predicted Rating : %s\n',predClass{i});
   fprintf('   Classification score : \n');
   for j = 1:length(b.ClassNames)
      if (classifScore(i,j)>0)
         fprintf('      %s : %5.4f \n',b.ClassNames{j},classifScore(i,j));
      end
   end
end
Customer 60644:
   RE/TA    =  0.22
   MVE/BVTD =  2.40
   Industry =  6
   Predicted Rating : AA
   Classification score : 
      A : 0.2874 
      AA : 0.6919 
      AAA : 0.0156 
      BBB : 0.0051 
Customer 33083:
   RE/TA    =  0.24
   MVE/BVTD =  1.51
   Industry =  4
   Predicted Rating : BBB
   Classification score : 
      A : 0.0751 
      BB : 0.0017 
      BBB : 0.9232 
Customer 63830:
   RE/TA    =  0.18
   MVE/BVTD =  1.69
   Industry =  7
   Predicted Rating : A
   Classification score : 
      A : 0.6629 
      AA : 0.0067 
      B : 0.0008 
      BB : 0.0005 
      BBB : 0.3291 

Ведение записей прогнозируемых рейтингов и соответствующих счетов может быть полезным для периодических оценок качества классификатора. Мы храним эту информацию здесь, в table массивы направленности predDS.

classnames = b.ClassNames;
predDS = [table(newDS.ID,predClass),array2table(classifScore)];
predDS.Properties.VariableNames = {'ID','PredRating',classnames{:}};

Эта информация может быть сохранена, например, в текстовом файле с разделителем запятыми PredictedRatings.dat использование команды

  writetable(predDS,'PredictedRatings.dat');

или записывается непосредственно в базу данных с помощью Database Toolbox.

Обратное тестирование: профилирование процесса классификации

Валидация или обратное тестирование - это процесс профилирования или оценки качества кредитных рейтингов. Существует много различных мер и тестов, связанных с этой задачей (см., Например, Базельский комитет по банковскому надзору [2]). Здесь мы уделяем основное внимание следующим двум вопросам:

  • Насколько точны прогнозируемые рейтинги по сравнению с фактическими рейтингами? Здесь «предсказанные рейтинги» относятся к рейтингам, полученным из автоматизированного процесса классификации, и «фактические рейтинги» к рейтингам, присвоенным кредитным комитетом, который объединяет предсказанные рейтинги и их классификационные оценки, и другие части информации, такие как новости и состояние экономики, для определения окончательного рейтинга.

  • Насколько хорошо фактические рейтинги оценивают клиентов в зависимости от их кредитоспособности? Это делается в ex-post анализе, проведенном, например, год спустя, когда известно, какие компании допустили дефолт в течение года.

Файл CreditRating_ExPost.dat содержит «последующие» данные о тех же компаниях, которые рассматривались в предыдущем разделе. Он содержит фактические рейтинги, присвоенные комитетом этим компаниям, а также «флаг по умолчанию», который указывает, была ли соответствующая компания признана дефолтом в течение одного года после процесса оценки (если 1) или нет (если 0).

exPostDS = readtable('CreditRating_ExPost.dat');

Сравнение прогнозируемых рейтингов и фактических рейтингов. Обоснование подготовки автоматизированного классификатора заключается в ускорении работы кредитного комитета. Чем точнее прогнозируемые рейтинги, тем меньше времени комитету приходится тратить на рассмотрение прогнозируемых рейтингов. Таким образом, возможно, что комитет хочет регулярно проверять, насколько предсказанные рейтинги соответствуют итоговым рейтингам, которые они присваивают, и рекомендовать переобучение автоматизированного классификатора (и, возможно, включать новые возможности, например), если несоответствие кажется относительным.

Первый инструмент, который мы можем использовать, чтобы сравнить предсказанные и фактические оценки, является матрицей неточностей, легко доступной в Statistics and Machine Learning Toolbox:

C = confusionchart(exPostDS.Rating,predDS.PredRating);
sortClasses(C,{'AAA' 'AA' 'A' 'BBB' 'BB' 'B' 'CCC'})

Строки соответствуют фактическим рейтингам, а столбцы - предсказанным рейтингам. Сумма в позиции (i,j) в матрице неточностей указывается, сколько клиентов получили фактический рейтинг i и были предсказаны как рейтинговые j. Для примера - позиционные (3,2) рассказывает нам, сколько клиентов получили рейтинг 'A' кредитным комитетом, но были предсказаны как 'AA' с автоматизированным классификатором. Можно также представить эту матрицу в процентах. Нормализуйте каждое значение по количеству наблюдений, которое имеет один и тот же истинный рейтинг.

C.Normalization = 'row-normalized';

Хорошее согласие между предсказанным и фактическим рейтингами приведет к значениям в основной диагонали, которые доминируют над остальными значениями подряд, идеально значениями, близкими к 1. В этом случае мы фактически видим важное несогласие для 'B', поскольку около половины клиентов, которые были оценены кредитным комитетом как 'B', были предсказаны как 'BB' автоматическим классификатором. С другой стороны, хорошо видеть, что рейтинги различаются не более чем на одну ступень в большинстве случаев, за единственным исключением 'BBB.'

Матрица неточностей может также использоваться для сравнения внутренних рейтингов, присвоенных учреждением, с рейтингами третьих сторон; это часто делается на практике.

Для каждого конкретного рейтинга мы можем вычислить еще одну меру согласия между предсказанным и фактическим рейтингами. Мы можем построить Приемник кривую рабочей характеристики (ROC), используя perfcurve функция из набора инструментов Statistics and Machine Learning Toolbox и проверьте область под кривой (AUC). The perfcurve функция принимает в качестве аргумента фактические рейтинги, которые являются нашим эталоном, стандартом, с которым мы сравниваем, и классификационные оценки 'BBB', определяемые автоматизированным процессом. Давайте создадим ROC и вычислим AUC для рейтинга 'BBB' в нашем примере.

[xVal,yVal,~,auc] = perfcurve(exPostDS.Rating,predDS.BBB,'BBB');
plot(xVal,yVal)
xlabel('False positive rate')
ylabel('True positive rate')
text(0.5,0.25,strcat('AUC=',num2str(auc)),'EdgeColor','k')
title('ROC curve BBB, predicted vs. actual rating')

Вот объяснение, как строится ОКР. Напомним, что для каждого клиента автоматизированный классификатор возвращает классификационную оценку для каждого из кредитных рейтингов, в частности для 'BBB', который может быть интерпретирован как вероятность того, что этот конкретный клиент должен быть оценен 'BBB.' В порядок, чтобы построить кривую ROC, необходимо изменить порог классификации. То есть минимальный счет для классификации клиента как 'BBB.' apos; Другими словами, если порог tмы классифицируем клиентов только как 'BBB', если их балл 'BBB' больше или равен t. Например, предположим, что компания XYZ имела счет 'BBB' 0,87. Если фактический рейтинг XYZ (информация в exPostDS.Rating) является 'BBB', тогда XYZ будет правильно классифицирован как 'BBB' для любого порога до 0,87. Это было бы истинным положительным, и это увеличило бы то, что называется чувствительностью классификатора. При любом пороге, превышающем 0,87, эта компания не получила бы рейтинг 'BBB', и у нас был бы ложный отрицательный случай. Чтобы завершить описание, предположим, что фактический рейтинг XYZ является 'BB.' apos; Тогда он был бы правильно отвергнут как 'BBB' для порогов более 0,87, став истинным негативом и, таким образом, увеличивая так называемую специфичность классификатора. Однако для порогов до 0,87 он стал бы ложноположительным (он был бы классифицирован как 'BBB', когда он на самом деле является 'BB'). Кривая ROC строится путем построения графика доли истинных срабатываний (чувствительность) от ложных срабатываний (1-специфичность), поскольку порог изменяется от 0 до 1.

AUC, как указывает его имя, является областью под кривой ROC. Чем ближе AUC к 1, тем точнее классификатор (идеальный классификатор будет иметь AUC 1). В этом примере AUC кажется достаточно высоким, но комитет должен решить, какой уровень AUC для рейтингов должен инициировать рекомендацию по улучшению автоматизированного классификатора.

Сравнение фактических рейтингов и значений по умолчанию в следующем году. Общим инструментом, используемым для оценки неявного рейтинга клиентов в кредитных рейтингах, является профиль совокупной точности (CAP) и связанная с ним мера коэффициента точности. Идея состоит в том, чтобы измерить связь между присвоенными кредитными рейтингами и количеством дефолтов, наблюдаемых в следующем году. Можно ожидать, что меньше значений по умолчанию наблюдается для лучших классов рейтинга. Если бы ставка по умолчанию была одинаковой для всех рейтингов, рейтинговая система ничем не отличалась бы от наивной (и бесполезной) системы классификации, в которой клиентам случайным образом присваивался бы рейтинг, независимо от их кредитоспособности.

Нетрудно увидеть, что perfcurve функция может также использоваться, чтобы создать ПРОПИСНАЯ БУКВА. Стандарт, с которым мы сравниваем, это не рейтинг, как раньше, а флаг по умолчанию, который мы загрузили из CreditRating_ExPost.dat файл. Используемая нами счет является «пустышкой счета», которая указывает на рейтинг кредитоспособности, неявный в списке рейтингов. Фиктивный счет должен только удовлетворить, что лучшие рейтинги получают более низкие фиктивные счета (они «с меньшей вероятностью имеют флаг по умолчанию 1»), и что любые два клиента с таким же рейтингом получают один и тот же фиктивный счет. Вероятность по умолчанию может быть передана как счет, конечно, но у нас нет вероятностей по умолчанию здесь, и на самом деле нам не нужно иметь оценки вероятностей по умолчанию, чтобы создать ПРОПИСНАЯ БУКВА, потому что мы не проверяем вероятности по умолчанию. Все, что мы оцениваем с помощью этого инструмента, это то, насколько хорошо рейтинги оценивают клиентов в соответствии с их кредитоспособностью.

Обычно ПРОПИСНАЯ БУКВА рассматриваемой системы рейтингов строится вместе с ПРОПИСНАЯ БУКВА «совершенной системы рейтингов». Последняя является гипотетической системой кредитных рейтингов, по которой в самый низкий рейтинг входят все дефолтующие, а других клиентов нет. Область под этой идеальной кривой является максимально возможной AUC, достижимой рейтинговой системой. По соглашению AUC корректируется для CAP, чтобы вычесть область под ПРОПИСНАЯ БУКВА наивной системы, то есть CAP системы, которая случайным образом присваивает рейтинги клиентам. ПРОПИСНАЯ БУКВА наивной системы является просто прямой линией от источника до (1,1) с AUC 0,5. Коэффициент точности для рейтинговой системы затем определяется как отношение скорректированного AUC (AUC системы с учетом минус AUC наивной системы) к максимальной точности (AUC совершенной системы минус AUC наивной системы).

ratingsList = {'AAA' 'AA' 'A' 'BBB' 'BB' 'B' 'CCC'};
Nratings = length(ratingsList);
dummyDelta = 1/(Nratings+1);
dummyRank = linspace(dummyDelta,1-dummyDelta,Nratings)';

D = exPostDS.Def_tplus1;
fracTotDef = sum(D)/length(D);
maxAcc = 0.5 - 0.5 * fracTotDef;

R = double(ordinal(exPostDS.Rating,[],ratingsList));
S = dummyRank(R);
[xVal,yVal,~,auc] = perfcurve(D,S,1);

accRatio = (auc-0.5)/maxAcc;
fprintf('Accuracy ratio for actual ratings: %5.3f\n',accRatio);

xPerfect(1) = 0; xPerfect(2) = fracTotDef; xPerfect(3) = 1;
yPerfect(1) = 0; yPerfect(2) = 1; yPerfect(3) = 1;
xNaive(1) = 0; xNaive(2) = 1;
yNaive(1) = 0; yNaive(2) = 1;

plot(xPerfect,yPerfect,'--k',xVal,yVal,'b',xNaive,yNaive,'-.k')
xlabel('Fraction of all companies')
ylabel('Fraction of defaulted companies')
title('Cumulative Accuracy Profile')
legend({'Perfect','Actual','Naive'},'Location','SouthEast')
text(xVal(2)+0.01,yVal(2)-0.01,'CCC')
text(xVal(3)+0.01,yVal(3)-0.02,'B')
text(xVal(4)+0.01,yVal(4)-0.03,'BB')
Accuracy ratio for actual ratings: 0.850

Ключ к чтению информации ПРОПИСНАЯ БУКВА находится в «изломах», помеченных на графике для рейтингов 'CCC,' B 'и' BB.' apos; Для примера второй kink связан со вторым самым низким рейтингом, 'B', и он расположен на (0,097, 0,714). Это означает, что 9,7% клиентов были ранжированы 'B' или ниже, и они составляют 71,4% наблюдаемых дефолтов.

В целом коэффициент точности должен рассматриваться как относительный, а не как абсолютная мера. Для примера мы можем добавить ПРОПИСНОЙ БУКВЫ предсказанных рейтингов в том же графике и вычислить его коэффициент точности, чтобы сравнить его с коэффициентом точности фактических рейтингов.

Rpred = double(ordinal(predDS.PredRating,[],ratingsList));
Spred = dummyRank(Rpred);
[xValPred,yValPred,~,aucPred] = perfcurve(D,Spred,1);

accRatioPred = (aucPred-0.5)/maxAcc;
fprintf('Accuracy ratio for predicted ratings: %5.3f\n',accRatioPred);

plot(xPerfect,yPerfect,'--k',xVal,yVal,'b',xNaive,yNaive,'-.k',...
   xValPred,yValPred,':r')
xlabel('Fraction of all companies')
ylabel('Fraction of defaulted companies')
title('Cumulative Accuracy Profile')
legend({'Perfect','Actual','Naive','Predicted'},'Location','SouthEast')
Accuracy ratio for predicted ratings: 0.830

Коэффициент точности предсказанного рейтинга меньше, и его ПРОПИСНАЯ БУКВА в основном ниже ПРОПИСНАЯ БУКВА фактического рейтинга. Это разумно, поскольку фактические рейтинги присваиваются кредитными комитетами, которые берут во фактор прогнозируемые рейтинги и дополнительную информацию, которая может быть важной для уточнения рейтингов.

Заключительные замечания

MATLAB предлагает широкую область значений инструментов машинного обучения, помимо упакованных деревьев принятия решений, которые могут использоваться в контексте кредитного рейтинга. В Statistics and Machine Learning Toolbox можно найти такие инструменты классификации, как дискриминантный анализ и наивные классификаторы Байеса. MATLAB также предлагает Deep Learning Toolbox™. Кроме того, Database Toolbox и инструменты развертывания MATLAB могут предоставить вам больше гибкости, чтобы адаптировать рабочий процесс, представленный здесь, к вашим собственным настройкам и потребностям.

Никаких вероятностей дефолта здесь не вычислено. Для кредитных рейтингов вероятности дефолта обычно вычисляются на основе истории миграции кредитного рейтинга. Смотрите transprob страница с описанием в Financial Toolbox™ для получения дополнительной информации.

Библиография

[1] Altman, E., «Financial Ratios, Discriminant Analysis and the Prediction of Corporate Bankruptcy», Journal of Finance, Vol. 23, No4, (Sep., 1968), pp. 589-609.

[2] Базельский комитет по банковскому надзору, «Исследования по валидации внутренних рейтинговых систем», Банк международных расчетов (БИС), рабочие документы № 14, пересмотренный вариант, май 2005 года. Доступно в: https://www.bis.org/publ/bcbs_wp14.htm.

[3] Базельский комитет по банковскому надзору, «Международная конвергенция стандартов измерения капитала и стандартов капитала: пересмотренная среда», Банк международных расчетов (БМР), всеобъемлющий вариант, июнь 2006 года. Доступно в: https://www.bis.org/publ/bcbsca.htm.

[4] Loeffler, G. and P. N. Posch, моделирование кредитных рисков с использованием Excel и VBA, Западный Суссекс, Англия: Wiley Finance, 2007.

[5] Мертон, Р. «О ценообразовании корпоративного долга: структура риска процентных ставок», Финансовый журнал, том 29, № 2, (май 1974), стр. 449-70.