В этом примере показано, как создать автоматизированный инструмент оценки кредитоспособности.
Одной из фундаментальных задач в управлении кредитными рисками является присвоение кредитного уровня заемщику. Оценки используются для ранжирования клиентов по их предполагаемой кредитоспособности: лучшие оценки означают менее рискованных клиентов; аналогичные оценки означают аналогичный уровень риска. Оценки представлены в двух категориях: кредитные рейтинги и кредитные баллы. Кредитные рейтинги представляют собой небольшое количество дискретных классов, обычно помеченных буквами, таких как 'AAA', 'BB-' и т. д. Кредитные баллы представляют собой числовые оценки, такие как '640' или '720'. Кредитные рейтинги являются одним из ключевых элементов нормативно-правовой базы, таких как Базель II (см. Базельский комитет по банковскому надзору [3]).
Присвоение кредитного уровня предполагает анализ информации о заемщике. Если заемщиком является физическое лицо, информация о процентах может представлять собой доход физического лица, непогашенную задолженность (ипотека, кредитные карты), размер домохозяйства, статус проживания и т.д. Для корпоративных заемщиков можно рассмотреть определенные финансовые коэффициенты (например, продажи, деленные на общие активы), отрасль и т.д. Здесь мы ссылаемся на эти части информации о заемщике как на особенности или предикторы. Различные учреждения используют разные предикторы, и они также могут иметь разные классы оценок или диапазоны баллов для ранжирования своих клиентов. Для относительно небольших кредитов, предлагаемых большому рынку потенциальных заемщиков (например, кредитных карт), обычно используются кредитные баллы, и процесс классификации заемщика обычно автоматизирован. Для более крупных кредитов, доступных для малых и средних компаний и крупных корпораций, обычно используются кредитные рейтинги, и процесс классификации может включать сочетание автоматизированных алгоритмов и экспертного анализа.
Есть рейтинговые агентства, которые следят за кредитоспособностью компаний. Тем не менее, большинство банков разрабатывают внутреннюю методологию назначения кредитных оценок своим клиентам. Оценка клиента внутри компании может быть необходимостью, если клиент не был оценен рейтинговым агентством, но даже если существует рейтинг третьей стороны, внутренний рейтинг предлагает дополнительную оценку профиля риска клиента.
В этом примере показано, как MATLAB ® может помочь на автоматизированном этапе процесса определения кредитного рейтинга. В частности, мы используем один из инструментов статистического обучения, доступных в Statistics and Machine Learning Toolbox™, алгоритме классификации, известном как пакетированное дерево решений.
Предполагается, что историческая информация доступна в виде набора данных, где каждая запись содержит особенности заемщика и присвоенный ему кредитный рейтинг. Это могут быть внутренние рейтинги, присваиваемые комитетом, который придерживается уже действующих политики и процедур. В качестве альтернативы рейтинги могут поступать от рейтингового агентства, рейтинги которого используются для «рывка» новой внутренней системы кредитных рейтингов.
Существующие исторические данные являются отправной точкой и используются для обучения пакетного дерева принятия решений, которое автоматизирует кредитный рейтинг. В лексике статистического обучения этот процесс обучения относится к категории контролируемого обучения. Затем классификатор используется для присвоения оценок новым клиентам. На практике эти автоматизированные или прогнозируемые рейтинги, скорее всего, будут рассматриваться как предварительные, пока их не рассмотрит кредитный комитет экспертов. Тип классификатора, который мы используем здесь, также может облегчить пересмотр этих рейтингов, потому что он обеспечивает меру определенности для прогнозируемых рейтингов, оценки классификации.
На практике сначала необходимо обучить классификатор, затем использовать его для присвоения кредитного рейтинга новым клиентам, и, наконец, также необходимо профилировать или оценить качество или точность классификатора, процесс, также известный как проверка или обратное тестирование. Мы также обсуждаем некоторые доступные инструменты обратного тестирования.
Загружаем исторические данные из текстового файла с разделителями-запятыми CreditRating_Historical.dat. Мы решили работать с текстовыми файлами здесь, но пользователи, имеющие доступ к 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. (Для получения дополнительной информации см. документацию по инструментам для статистического и машинного обучения 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), поэтому мы будем использовать для наших предсказаний более рассудительный классификационный ансамбль.
В этом примере мы начали с набора из шести элементов и использовали меру важности элемента классификатора и ошибку классификации вне пакета в качестве критерия для отсеивания трех переменных. Выбор признаков может быть трудоемким процессом, когда начальный набор потенциальных предикторов содержит десятки переменных. Помимо инструментов, которые мы здесь использовали (важность переменных и «визуальное» сравнение ошибок вне пакета), для этих типов анализа могут быть полезны другие инструменты выбора переменных в окне Статистика и инструментарий машинного обучения (см. документацию). Однако в конечном итоге успешный процесс выбора признаков требует сочетания количественных инструментов и оценки аналитика.
Например, мера важности переменной, которую мы использовали здесь, является механизмом ранжирования, который оценивает относительное влияние признака, измеряя, насколько ухудшается точность прогнозирования классификатора, когда значения этого признака случайным образом переставляются. Идея заключается в том, что когда рассматриваемая особенность мало добавляет прогнозирующей способности классификатора, использование измененных (в данном случае перестановочных) значений не должно влиять на результаты классификации. Соответствующая информация, с другой стороны, не может быть произвольно заменена без ухудшения прогнозов. Теперь, если важны две сильно коррелированные особенности, они оба будут высоко ранжированы в этом анализе. В этом случае сохранения одной из этих особенностей должно быть достаточно для точных классификаций, но нельзя знать, что только по результатам ранжирования. Надо было бы проверить корреляции отдельно или использовать суждение эксперта. То есть, такие инструменты, как переменная важность или 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');
или запись непосредственно в базу данных с помощью панели инструментов базы данных.
Проверка или обратное тестирование - это процесс профилирования или оценки качества кредитных рейтингов. Существует множество различных мер и тестов, связанных с этой задачей (см., например, Базельский комитет по банковскому надзору [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 и проверьте область под кривой (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')

Вот объяснение, как строится ОКР. Напомним, что для каждого клиента автоматизированный классификатор возвращает классификационный балл для каждого из кредитных рейтингов, в частности для «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 также может использоваться для построения CAP. Стандарт, с которым мы сравниваем, - это не рейтинг, как раньше, а флаг по умолчанию, который мы загрузили из CreditRating_ExPost.dat файл. Оценка, которую мы используем, является «фиктивной оценкой», которая указывает на рейтинг кредитоспособности, неявный в списке оценок. Фиктивный балл должен удовлетворять только тому, что лучшие рейтинги получают более низкие фиктивные баллы (они «с меньшей вероятностью имеют флаг по умолчанию 1»), и что любые два клиента с одинаковым рейтингом получают один и тот же фиктивный балл. Вероятность по умолчанию может быть передана как оценка, конечно, но у нас здесь нет вероятностей по умолчанию, и на самом деле нам не нужно иметь оценки вероятностей по умолчанию для построения CAP, потому что мы не проверяем вероятности по умолчанию. Все, что мы оцениваем с помощью этого инструмента, это насколько хорошо рейтинги ранжируют клиентов по их кредитоспособности.
Обычно CAP рассматриваемой системы рейтингов строится вместе с CAP «совершенной системы рейтингов». Последняя - гипотетическая система кредитных рейтингов, для которой самый низкий рейтинг включает всех неплательщиков, а других клиентов нет. Площадь под этой совершенной кривой является максимально возможной AUC, достижимой системой оценок. По соглашению, AUC корректируется для CAP, чтобы вычитать область под CAP наивной системы, то есть 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

Ключ к считыванию информации CAP находится в «kinks», помеченных на графике для оценок «CCC», «B» и «BB». Например, второй кинк связан со вторым самым низким рейтингом, «B», и он расположен в (0,097, 0,714). Это означает, что 9,7% клиентов получили рейтинг «B» или ниже, и на них приходится 71,4% наблюдаемых значений по умолчанию.
В целом коэффициент точности следует рассматривать как относительную, а не абсолютную меру. Например, мы можем добавить CAP прогнозируемых оценок на том же графике и вычислить его коэффициент точности, чтобы сравнить его с коэффициентом точности фактических оценок.
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

Коэффициент точности прогнозируемого рейтинга меньше, и его CAP в основном ниже CAP фактического рейтинга. Это разумно, поскольку фактические рейтинги присваиваются кредитными комитетами, которые учитывают прогнозируемые рейтинги и дополнительную информацию, которая может быть важна для точной настройки рейтингов.
MATLAB предлагает широкий спектр инструментов машинного обучения, помимо пакетных деревьев принятия решений, которые могут использоваться в контексте кредитного рейтинга. В окне Statistics and Machine Learning Toolbox можно найти такие инструменты классификации, как дискриминантный анализ и наивные классификаторы Байеса. MATLAB также предлагает Toolbox™ глубокого обучения. Кроме того, инструменты развертывания Database Toolbox и MATLAB могут обеспечить большую гибкость для адаптации представленного здесь рабочего процесса к собственным предпочтениям и потребностям.
Здесь не вычислены вероятности по умолчанию. Для кредитных рейтингов вероятность дефолта обычно рассчитывается на основе истории миграции кредитных рейтингов. См. раздел transprob для получения дополнительной информации см. страницу Financial Toolbox™.
[1] Альтман, Э., «Финансовые коэффициенты, дискриминантный анализ и прогноз корпоративного банкротства», Финансовый журнал, том 23, № 4, (сентябрь, 1968), стр. 589-609.
[2] Базельский комитет по банковскому надзору, «Исследования по проверке внутренних рейтинговых систем», Банк международных расчетов (БМР), рабочие документы № 14, пересмотренный вариант, май 2005 года. Доступно по адресу: https://www.bis.org/publ/bcbs_wp14.htm.
[3] Базельский комитет по банковскому надзору, «Международная конвергенция измерения капитала и стандартов капитала: пересмотренная основа», Банк международных расчетов (БМР), всеобъемлющий вариант, июнь 2006 года. Доступно по адресу: https://www.bis.org/publ/bcbsca.htm.
[4] Лоэффлер, Г. и П. Н. Пош, моделирование кредитных рисков с использованием Excel и VBA, Западный Суссекс, Англия: Wiley Finance, 2007.
[5] Мертон, Р., «О ценообразовании на корпоративный долг: структура риска процентных ставок», Журнал финансов, том 29, № 2, (май 1974 г.), стр. 449-70.