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

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

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

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

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

В этом примере показано, как 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. Кредитные рейтинги могут также быть сопоставлены в числовые значения, которые могут быть полезными, чтобы попробовать альтернативные методы, чтобы анализировать данные (e.g., регрессия). Всегда рекомендуется попробовать различные методы на практике.

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.