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

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

Одна из основных задач в управлении кредитным риском состоит в том, чтобы присвоить класс кредита заемщику. Классы используются, чтобы оценить клиентов согласно их воспринятой кредитоспособности: лучшие классы означают менее опасных клиентов; подобные классы означают подобный уровень риска. Классы существуют двух категорий: кредитные рейтинги и кредитные рейтинги. Кредитные рейтинги являются небольшим количеством дискретных классов, обычно маркируемых буквами, такими как '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, чтобы соответствовать конкретному типу ансамбля классификации вызвал сложенное в мешок дерево решений. "Укладывание в мешки", в этом контексте, обозначает "агрегацию начальной загрузки". Методология состоит в генерации многих подвыборок или копий начальной загрузки, от набора данных. Эти подвыборки случайным образом сгенерированы, выбрав с заменой из списка клиентов в наборе данных. Для каждой копии выращено дерево решений. Каждое дерево решений является обученным классификатором самостоятельно и могло использоваться в изоляции, чтобы классифицировать новых клиентов. Прогнозы двух деревьев, выращенных от двух различных копий начальной загрузки, могут отличаться, все же. Ансамбль агрегировал прогнозы всех деревьев решений, которые выращены для всех копий начальной загрузки. Если большинство деревьев предсказывает один конкретный класс для нового клиента, разумно полагать что прогноз быть более устойчивым, чем прогноз одного только любого одного дерева. Кроме того, если различный класс предсказан меньшим набором деревьев, та информация полезна, также. На самом деле пропорция деревьев, которые предсказывают различные классы, является основанием для очков классификации, о которых сообщает ансамбль при классификации новых данных.

Построение древовидного мешконасыпателя

Первый шаг, чтобы создать наш ансамбль классификации должен будет найти хороший листовой размер для отдельных деревьев; здесь мы пробуем размеры 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, потому что он приводит к более скудным деревьям и более эффективным вычислениям.

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

Затем, мы хотим узнать, важны ли все функции для точности нашего классификатора. Мы делаем это путем включения меры по важности функции (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]);

На данном этапе мы можем создать отчет. Здесь мы только отображаем на экране маленький отчет для первых трех клиентов в целях рисунка, но Deployment Tool 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]). Здесь, мы фокусируемся на следующих двух вопросах:

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

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

Файл, который содержит 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) говорит нам, сколько клиентов получило оценку кредитным комитетом, но были предсказаны как 'AA' с автоматизированным классификатором. Можно также представить эту матрицу в проценте. Нормируйте каждое значение количеством наблюдений, которое имеет ту же истинную оценку.

C.Normalization = 'row-normalized';

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

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

Для каждой определенной оценки мы можем вычислить еще одну меру соглашения между предсказанными и фактическими оценками. Мы можем создать кривую Рабочей характеристики получателя (ROC) с помощью функции perfcurve из Statistics and Machine Learning Toolbox и проверять область под кривой (AUC). Функция 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')

Вот объяснение того, как ROC создается. Вспомните, что для каждого клиента автоматизированный классификатор возвращает счет классификации к каждому из кредитных рейтингов, в частности, к 'BBB', который может быть интерпретирован как, как, вероятно, случается так, что этот конкретный клиент должен быть оценен 'BBB'. В порядке создать кривую ROC, нужно отличаться порог классификации. Таким образом, минимальный счет, чтобы классифицировать клиента как 'BBB'. Другими словами, если порогом является t, мы только классифицируем клиентов как 'BBB', если их счет 'BBB' больше, чем или равен t. Например, предположите, что компания XYZ имела счет 'BBB' 0,87. Если бы фактическая оценка XYZ (информация в exPostDS.Rating) является 'BBB', то XYZ был бы правильно классифицирован как 'BBB' для любого порога до 0,87. Это было бы положительной истиной, и она увеличит то, что является вызовом чувствительность классификатора. Для любого порога, больше, чем 0,87, эта компания не получила бы оценку 'BBB', и у нас будет ложный отрицательный случай. Чтобы завершить описание, предположите теперь, когда фактическая оценка XYZ является 'BB'. Затем это было бы правильно отклонено как '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 настроен для ЗАГЛАВНЫХ БУКВ, чтобы вычесть область под ПРОПИСНОЙ БУКВОЙ наивной системы, то есть, ПРОПИСНОЙ БУКВОЙ системы, которая случайным образом присваивает оценки клиентам. ПРОПИСНАЯ БУКВА наивной системы является просто прямой линией от источника до (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'. Например, вторая петля сопоставлена со второй самой низкой оценкой, '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 и Deployment Tool MATLAB могут предоставить вам больше гибкости, чтобы адаптировать рабочий процесс, представленный здесь вашим собственным настройкам и потребностям.

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

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

[1] Олтмен, E., "Финансовые Отношения, Дискриминантный анализ и Прогноз Корпоративного Банкротства", Журнал Финансов, Издания 23, № 4, (сентябрь 1968), стр 589-609.

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

[3] Базельский Комитет по Банковскому надзору, "Международная Сходимость Измерения капитала и Стандартов капитала: Пересмотренная Среда", Банк международных расчетов (BIS), всесторонняя версия, июнь 2006. Доступный в: https://www.bis.org/publ/bcbsca.htm.

[4] Loeffler, G. и П. Н. Пош, Credit Risk Modeling Using Excel и VBA, Западный Сассекс, Англия: финансы Вайли, 2007.

[5] Мертон, R., "На Оценке Корпоративного Долга: Структура Риска Процентных ставок", Журнал Финансов, Издания 29, № 2, (май 1974), стр 449-70.