Материал: Анализ моделей оценки вероятности банкротства кредитных организаций

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

1.3.2 Макроэкономические показатели

Для того, чтобы оценить экономическое положение страны в разное время, следовало подобрать параметры, которые отражали бы ежемесячно различные состояния как разных экономических секторов, так и общее состояние экономики. Из всех переменных, так или иначе влиявших на положение банковского сектора, ежемесячно можно было узнать об двенадцати величинах [12].

1.      Дефицит федерального бюджета.

2.      Профицит федерального бюджета.

.        Международные резервы Центрального Банка.

.        Валютные резервы Центрального Банка.

5.      Курс доллара относительно московской межбанковской валютной биржи.

.        Индекс РТС или RTSI - Russia Trading System Index [13], представляющий собой относительную суммарную рыночную капитализацию списка эмитентов, действующих на фондовом рынке России, его основной индикатор.

7.      Инфляция.

.        ВВП.

.        Средняя зарплата граждан страны.

.        Среднемесячная кредиторская задолженность предприятия.

.        Среднемесячная дебиторская задолженность предприятий.

12.    Денежный агрегат М2 как количественная характеристика денежной массы, находящейся в стране.

Полученные макроэкономические параметры за период с января 2011 года по февраль 2017 года включительно приведены в приложении А.

1.3.3 Формирование и оптимизация вводных показателей

В России кредитные организации обязаны отчитываться по ряду нормативов Центральному Банку, который, в свою очередь, публикует её [14] в виде файлов DBF. Необходимая в данном контексте информация находится в форме 135, публикуемой ежемесячно и содержащей те нормативы ликвидности, которые банк прислал. На рисунке 1.2 приведён типичный фрагмент подобного файла.

Рисунок 1.2 Фрагмент файла отчётности

После обработки найденной информации, мною была выделены и разбиты по регистрационным номерам списки нормативов каждого банка, сдававшего отчёты в рассматриваемый период, пример которых можно увидеть в приложении Б. Однако, после проверки всего массива информации, состоявшего из 61 278 записей о 1016 банках, из которых банкротами были 314, мною были обнаружены пропуски в отчётности.

В частности, многие банки игнорировали ряд нормативов, а зачастую вообще сдавали пустой отчёт, как можно увидеть на рисунке 1.3.

Рисунок 1.3 Пример ненадёжных записей

Случаи скомпрометированной отчётности встречались чаще у банков-банкротов, чем у банков, лицензия которых не была отозвана, однако скорее такое поведение характеризует банки в целом. Так, например, после избавления от всех пропусков, осталось 51 047 записей о 908 банках, из которых банкротами были 233 или 25,7%, а среди 10 231 записи с пропущенной информацией оказались 412 банков, из которых банкротами был 81 или 19,7%. Несоответствие в общем числе банков объясняется тем, что некоторые банки в некоторые периоды сдавали полную отчётность, в другие же - неполную.

Помимо избавления от ненадёжных записей, также пришлось избавиться от ненадёжных параметров, о которых информацию сообщало крайне малое число банков. Ими оказались нормативы Н9.1, Н12 и Н18.

После объединения всей полученной информации конечный набор данных представлял 51 047 записей, содержавших регистрационный номер банка, 8 нормативов ликвидности, 11 макроэкономических показателей, а также информацию о месяце и годе, в которых была сделана запись.

Глава 2. Проектирование информационной системы


2.1 Разработка бизнес-модели приложения


2.1.1 Требования к системе

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

Кроме того, система должна оценивать риски на всей протяжённости существования банка, выводя некий рейтинг, так или иначе оценивая банки относительно друг друга. В данной ситуации, когда различные банки существуют в одинаковых условиях продолжительное время, но демонстрируют разные показатели риска, может быть применена рейтинговая система Арпада Эло [15].

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

В результате, система должна представлять собой:

·        веб-приложение, через которое пользователи смогут подавать запросы;

·        сервер, обрабатывающий эти запросы и подготавливающий прогноз общих рисков;

·        базу данных, хранящую уже известную информацию;

·        сборщик данных, получающий свежие сведения от Центрального Банка и публичных статистических агентств.

Полное техническое задание можно увидеть в Приложении В.

2.1.2 Диаграммы прецедентов

Для проектирования WEB-приложения был использован язык моделирования UML. В ходе анализа предметной области были выявлены следующие функциональные требования к программному продукту:

·        поиск по названию банка;

·        поиск по номеру банка;

·        сбор сведений о банках;

·        сбор макроэкономических сведений;

·        составление прогнозов;

·        представление исторических данных;

·        представление справочной информации.

После составления функциональных требований были выделены прецеденты, которые представлены на диаграмме UseСase diagram (рис 2.1).

Рисунок 2.1 Диаграмма UseCase

 

Таблица 2.1 Спецификация прецедента "Открытие веб-сайта"

Краткое описание

Прецедент дает возможность пользователю открыть сайт в каком-либо браузере

Актеры

Пользователь

Предусловия

На компьютере пользователя должен присутствовать браузер

Основной поток

Открытие сайта

Альтернативные потоки

-

Постусловия

Сайт открыт


Таблица 2.2 Спецификация прецедента "Навигация по сайту"

Краткое описание

Прецедент дает возможность пользователю переходить между различными секциями сайта

Актеры

Пользователь

Предусловия

Выполнен прецедент "Открытие веб-сайта"

Основной поток

Открытие сайта, сообщение об отсутствии страницы

Альтернативные потоки

-

Постусловия

Открыта новая страница



Таблица 2.3 Спецификация прецедента "Ввод названия банка"

Краткое описаниеПрецедент дает возможность пользователю ввести название банка в поисковую строку


Актеры

Пользователь

Предусловия

Выполнен прецедент "Открытие веб-сайта"

Основной поток

Начало прецедента совпадает с решением пользователя ввести данные на титульной странице.

Альтернативные потоки

Ввод данных в заголовке сайта

Постусловия

Данные введены


Таблица 2.4 Спецификация прецедента "Ввод регистрационного номера банка"

Краткое описание

Прецедент дает возможность пользователю ввести регистрационный номер банка в поисковую строку

Актеры

Пользователь

Предусловия

Выполнен прецедент "Открытие веб-сайта"

Основной поток

Начало прецедента совпадает с решением пользователя ввести данные на титульной странице.

Альтернативные потоки

Ввод данных в заголовке сайта

Постусловия

Данные введены

 

Таблица 2.5 Спецификация прецедента "Контроль введённых данных"

Краткое описаниеПрецедент производит контроль введённых данных


Актеры

Пользователь

Предусловия

Выполнен прецедент "Открытие веб-сайта", выполнен один из прецедентов: "Ввод названия банка" "Ввод регистрационного номера банка"

Основной поток

Контроль данных, сообщение о некорректном вводе

Альтернативные потоки

-

Постусловия

Корректность введённых данных проверена


Таблица 2.6 Спецификация прецедента "Поиск банка в БД"

Краткое описаниеПрецедент производит поиск банка по введённым пользователем данных в базе данных


Актеры

Пользователь

Предусловия

Выполнен прецедент "Открытие веб-сайта", выполнен один из прецедентов: "Ввод названия банка" "Ввод регистрационного номера банка" После выполнен прецедент "Контроль введённых данных"

Основной поток

На основе введённых данных производится поиск

Альтернативные потоки

Выполняется переход на страницу с сообщением об ошибке

Постусловия

Выполняется переход на страницу с результатом прогнозирования


Таблица 2.7 Спецификация прецедента "Запуск сборщика"

Краткое описание

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

Актеры

Администратор

Предусловия

На компьютере администратора должен присутствовать браузер

Основной поток

Сбор данных

Альтернативные потоки

-

Постусловия

Начинается сбор данных


Таблица 2.8 Спецификация прецедента "Получение нормативов ликвидности"

Краткое описаниеПрецедент производит запуск синтаксического анализатора, собирающего сведения о банках из публичных источников


Актеры

Администратор

Предусловия

Выполнен прецедент "Запуск сборщика"

Основной поток

Сбор данных

Альтернативные потоки

-

Постусловия

Совершается сбор и анализ данных с сайта Центрального Банка


Таблица 2.9 Спецификация прецедента "Получение макроэкономических показателей"

Краткое описание

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

Актеры

Администратор

Предусловия

Выполнен прецедент "Запуск сборщика"

Основной поток

Сбор данных

Альтернативные потоки

-

Постусловия

Совершается сбор и анализ данных с сайта Единого архива экономических и социологических данных


Таблица 2.10. Спецификация прецедента "Заполнение БД"

Краткое описание

Прецедент производит заполнение базы данных свежими записями

Актеры

Администратор

Предусловия

Выполнены прецеденты "Запуск сборщика", "Получение нормативов ликвидности" и "Получение макроэкономических показателей"

Основной поток

Сбор данных

Альтернативные потоки

-

Постусловия

Полученные сведения загружаются в базу данных


Таблица 2.11. Спецификация прецедента "Запуск системы"

Краткое описание

Прецедент производит запуск прогнозирующей системы

Актеры

Администратор

Предусловия

На компьютере администратора должен присутствовать браузер

Основной поток

Обработка данных

Альтернативные потоки

-

Постусловия

Прогнозирующая система готова к обработке данных


Таблица 2.12. Спецификация прецедента "Обработка данных, обнаруженных сборщиком"

Краткое описание

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

Актеры

Администратор

Предусловия

Выполнен прецедент "Запуск системы"

Основной поток

Альтернативные потоки

-

Постусловия

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


Таблица 2.13. Спецификация прецедента "Изменение данных в БД"

Краткое описание

Прецедент производит запуск системы прогнозирования

Актеры

Администратор

Предусловия

Выполнен прецедент "Запуск системы"

Основной поток

Обработка данных

Альтернативные потоки

-

Постусловия

База данных пополняется прогнозами


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

2.1.3Диаграммы деятельности

Первым прецедентом будет "Открытие веб-сайта". Пользователю необходимо открыть сайт в каком-либо интернет браузере. Визуализацию данного прецедента опустим, так как она состояла бы из одного действия "открытие страницы".

Также не имеет смысла визуализировать и прецедент "Навигация по сайту".

В связи с тем, что "Ввод названия банка", "Ввод регистрационного номера банк, "Контроль введённых данных" и "Поиск банка в БД" тесно связаны между собой, эти прецеденты в рамках описания их деятельности (рис 2.2) будут рассмотрены вместе. Ввод данных о банке происходит следующим образом: пользователь вводит название банка или его регистрационный номер в формы, представленные в заголовке каждой страницы, или в основную форму на титульной странице.

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

Рисунок 2.2 Диаграмма деятельности "Ввод и контроль данных, поиск банка в БД"

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

"Запуск сборщика" тесно связан с прецедентами "Получение макроэкономических показателей", "Получение нормативов ликвидности" и "Заполнение БД", поэтому они имеет смысл рассмотреть их вместе. В свою очередь, "Запуск системы" тесно связан с прецедентами "Обработка данных, обнаруженных сборщикомом" и "Изменение данных в БД".

Работа сборщика осуществляется следующим образом: администратор инициирует процесс в начале периода - месяца или квартала в зависимости от необходимости - и передаёт сигнал синтаксическому анализатору о том, что необходимо собрать сведения касательно нормативов ликвидности с сайта Центрального Банка из отчётности, представляемой ему коммерческими банками ежемесячно, и сведения об экономическом положении из Единого архива экономических и социологических данных.

Рисунок 2.3 Диаграмма деятельности "Сбор информации"

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

2.1.4 Модель базы данных

В качестве реляционной СУБД я воспользовался Microsoft SQL Server из-за уже имеющегося опыта в его использовании. На рисунке (рис 2.1) приведена диаграмма базы данных, которую я в дальнейшем заполнил собранной информацией и использовал в приложении.

Рисунок 2.4 Диаграмма базы данных bankruptcy. dbo

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

Таблица liquidity содержит собранную информацию отчётность о нормативах ликвидности. Так как запросы в базу позволяют подсчитать нулевые записи, я не стал выводить скомпрометированные данные в отдельную таблицу. Первичным ключом в данном случае был отдельный столбец, в котором все записи были пронумерованы от 1 до 61 278.

Таблица months содержит список месяцев, данные по которым охвачены, с номером месяца в качестве первичного ключа, и расшифровкой того, к какому году он принадлежит и каким месяцем в году является.

Таблица macro содержит ежемесячные записи макроэкономических параметров, приведённые в приложении А. Первичным ключом можно было бы выбрать номер месяца, однако, посчитав, что возможно дальнейшее тестирование, я также пронумеровал записи от 1 до 74.

Наконец, таблица weights содержит веса нейронов сети.

Для взаимодействия с БД я сначала пользовался строками подключения и запросами, однако, попробовав различные варианты, я остановился на подключении через создание модели базы данных с помощью ADO.net Entity Framework. Это позволило значительно сократить объём кода, улучшить его читаемость и упростило взаимодействие с.net MVC, о котором я расскажу дальше.

Перенос данных из разрозненных таблиц. xlsx был осуществлён путём наименьшего сопротивления - я собрал все данные так, чтобы они соответствовали спроектированным таблицам, а после импортировал их с помощью стандартного инструмента Management Studio.

2.2 Разработка пользовательского интерфейса


Сайт состоит из следующих страниц:

·        главная страница с формой поиска,

·        список макроэкономических показателей по месяцам,

·        список банков по регистрационным номерам,

·        страница с общей информацией о банке,

·        страница с отчётностью по нормативам ликвидности и справочной информацией,

·        контактная страница.

Я решил воспользоваться ASP.net MVC в содействии с bootstrap-CSS, опять же, из-за уже имеющегося опыта работы с ними, а также из-за удобства управлением взаимодействия всех названных компонентов.

Титульная страница сайта

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

Рисунок 2.5 Титульная страница

Страница общей информации

Рисунок 2.6 Страница общей информации

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

Страница поиска

То же самое произойдёт, если пользователь обратится к форме, расположенной в заголовке сайта. Это сделано для того, чтобы в любой момент, находясь на любой странице сайта, пользователь мог воспользоваться его основной функцией - демонстрацией прогнозированных рисков. Поиск осуществляется с помощью сборщика, оценивающего содержание поискового запроса и, в случае нахождения подходящих под запрос сведений, заполняющего класс Bank. cs, содержащий поля Id, Name, Bankrupt, year, month, otkl и risk. Это наполнение производится через обращение к сущности bankruptcyEntities модели базы данных с помощью встроенных функций проверки соответствия элементов, а также SQL-запроса, выводящего список обработанных нейронной сетью макроэкономических параметров, и находящего последний результат для текущего месяца.

Рисунок 2.7 Сообщение об ошибке

Если же будет введён регистрационный номер или название банка, не содержащиеся в базе данных, система выведет сообщение "Банк с таким регистрационным номером или названием отсутствует" (рис.2.3).

Элементы, расположенные как в заголовке сайта, так и во всех остальных его частях, подчиняются правилам в файле bootstrap-united. css, в котором содержится свободно распространяемый дизайн, взятый с сайта #"896916.files/image015.gif">

Рисунок 2.8 Макроэкономические показатели

Страница списка

Кнопка "Список банков", в свою очередь, ведёт к полному списку банков (рис.2.5), доступному системе и отсортированному по регистрационному номеру банка. Розовым выделены банки-банкроты, при запросе общей информации которых система выведет название банка и дату отзыва его лицензии.

Ссылка "Ликвидность", имеющаяся у каждого банка в этом списке, а также ссылка "Посмотреть ликвидность", имеющаяся на странице общей информации о банке, приведёт к странице со всей отчётностью по нормативам ликвидностью, данную банком за период его существования начиная с 2011 года.

Рисунок 2.9 Список банков

Справочная страница

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

Рисунок 2.10. Страница нормативов ликвидности выбранного банка

Тогда ссылка "К списку банков" (рис 2.6) отправит пользователя на первую страницу списка. Полный листинг программы можно увидеть в Приложении Е.

Глава 3. Проектирование нейронной сети


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


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

3.2 Проектирование и обучение модели


Во-первых, число слоёв крайне редко может превышать три. Роберт Хет-Нильсен, в частности, показал [4], что, хотя использование большего количества слоёв приводит к уменьшению суммарного количества элементов в скрытых слоях, при практических задачах достаточно от одного до трёх скрытых слоёв.

Во-вторых, в той же работе приводятся доказательства на основе теоремы Колмогорова, что достаточное количество нейронов на первом скрытом слое не превышает удвоенного числа входных нейронов плюс один. При этом достаточное число нейронов на последнем скрытом слое меньше в три и более раза.

Однако, хотя это справедливо для широких выборок, выявить особенности выборки можно с помощью более простой модели, для проектирования которой потребуется меньше времени, а слой у неё будет всего один. Чтобы узнать, сколько скрытых нейронов необходимо поместить на этот слой, можно обратиться к теореме Арнольда-Колмогорова-Хет-Нильсена.

, (3)

 (4)

На формуле (1)  - число входящих нейронов,  - число выводящих и Q - размер выборки. В данном случае Q составлял 367,  - 22, а  - 1, так как нужно было узнать только один параметр - обанкротится организация или нет.

По формуле (2) можно вывести число N нейронов на скрытом слое, которое оказалось в диапазоне между 1,68 и 425,36. На практике обычно следует руководствоваться минимальным значением чтобы избежать разрыва между обучающей и тестирующей выборками.

Этот разрыв можно увидеть на следующем графике (рис 3.1).

Рисунок 3.1 График обучения первой модели

3.3 Оценка значимости показателей


Вводные показатели (рис 3.2) распределились достаточно равномерно по значимости, однако заметно смещение в сторону макроэкономических показателей, отвечающих за общую экономическую ситуацию.

Рисунок 3.2 Значимость параметров первой модели

Показатель X8 с наибольшей значимостью соответствовал нормативу ликвидности Н7 - максимальному размеру крупных кредитных рисков банка. Неудивительно, что его рост связан с ростом вероятности отзыва лицензии. Однако, следует проверить, насколько велика эта зависимость.

Для примера можно взять случайный банк, в данном случае, банк с регистрационным номером 2537, лицензия которого была отозвана в мае 2016 года. Сеть предсказывает его вероятность банкротства как 98,33% (рис.3.3).

Рисунок 3.3 Нормативы ликвидности и вероятность банкротства банка 2537

Рисунок 3.4 Изменение норматива Н7

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

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

3.4 Эксперимент с исключением показателей


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

Рисунок 3.5 Значимость параметров после исключения

Как и предполагалось, наибольшее влияние на прогноз оказали макроэкономические параметры, а значит, положение в стране в целом, а также параметры X6 и X7, теперь соответствующие нормативам ликвидности Н4 и Н7 - то, насколько банк диверсифицирует свои активы, и каким рискам он подвержен.

Это позволяет сделать непротиворечащие реальному положению вещей выводы:

·        диверсификация активов позволяет снизить риск банкротства;

·        банки с меньшими кредитными рисками реже теряют лицензии;

·        во время кризиса больше банков терпят банкротство.

В этой модели использовалась сокращённая выборка из 467 банков, 234 из которых являлись банкротами, а 233 до сих пор функционировали. Результат, к которому стремилась модель - это спрогнозировать, станет ли банк банкротом в следующем месяце относительно последней полученной ей записи нормативов и макроэкономических показателей.

3.5 Эксперимент с расширением выборки


Для следующего эксперимента было решено увеличить число банков в обеих группах, а также изменить прогнозируемый результат с банкротства в следующем месяце на вероятность банкротства в неопределённом будущем. Выборка была расширена до 776 записей касательно банков, сдававших отчётность в январе 2011 года, из которых 349 были банкротами, а также в неё были возвращены ранее извлечённые показатели.

Таким образом, модель обучалась на сведениях в рамках только одного месяца, а значит, не могла ориентироваться на некую сезонность, вместо этого оценивая сведения в совокупности. Необходимо было выяснить, повлияет ли это на распределение значимости (рис.3.6) показателей.

Рисунок 3.6 Значимость параметров после изменения выборки

Параметр X1 в данном случае - это регистрационный номер банка. Параметры X10 и X11 - это месяц и год записи. Все параметры с 12 по 22 - это макроэкономические показатели за этот месяц. Напрашивается вывод, что нормативы ликвидности (параметры со 2 по 9) практически не влияли на решение модели. Для проверки этого следует убрать те вводные параметры, которые можно посчитать дублирующими. Это X1, X10 и X11, о которых я рассказал выше. Первый не указывает на состояние банка, так как это просто порядковый номер несквозной нумерации, а десятый и одиннадцатый можно вычислить исходя из макроэкономических показателей.

Исключив их и заново обучив модель, я снова провёл исследование значимости вводных параметров. На этот раз значимость нормативов ликвидности (рис 3.7) упала ещё сильнее. Влияние на прогноз среди них оказывали только первые три - Н1.0, Н1.1 и Н1.2, фактически демонстрирующие достаточность ликвидности банка - и последний, Н10.1, совокупная величина риска по инсайдерам банка.

Рисунок 3.7 Значимость параметров после исключения и изменения выборки

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

При этом, при понижении показателя X15 (доходы населения) риск банкротства для банка снижался, а при повышении - резко возрастал, что. впрочем, тоже логично, ведь кредиты берут чаще люди, оказавшиеся в трудном экономическом положении, а не наиболее преуспевающие, для развития собственного успеха.

Подведём итоги наблюдений:

·        богатые банки реже становятся банкротами, чем бедные;

·        диверсификация активов позволяет снизить риск банкротства;

·        банки с меньшими кредитными рисками реже теряют лицензии;

·        банки чаще становятся банкротами во время кризиса.

3.6 Вторая модель с макроэкономическими показателями


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

Проектирование и обучение модели

Для этого было достаточно трёх нейронов на скрытом слое, одиннадцати входных нейронов и одного конечного. На рисунке 3.7 приведена схема этой сети из 15 нейронов с 36 связями.

Рисунок 3.7 Графическое представление модели

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

Рисунок 3.8 График обучения второй модели

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

Значимость вводных параметров этой сети (рис.3.8) распределилась гораздо более равномерно.

Рисунок 3.8 Значимость параметров второй модели

Параметрами с наибольшей значимостью оказались курс доллара и денежный агрегат М2 - условно, указывающий на объём денежной массы в стране.

3.7 Влияние изменения показателей на прогнозируемый результат


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

В данном случае, (рис.3.9) примерами станут март 2011 с относительно низким значением показателя X5 и октябрь 2016 - с относительно высоким.

Рисунок 3.9 Макроэкономические показатели и предполагаемое количество банкротов

Для первого рассматриваемого месяца (рис 3.10) только существенное, пятикратное превышение исходного значения X5 продемонстрировало хоть какое-то увеличение предполагаемого количества банков, когда как для второго (рис 3.11) ни увеличение, ни уменьшение исходного значения не повлияло на результат.

Рисунок 3.10. Изменение исходно низкого значения параметра X5

Рисунок 3.11. Изменение исходно высокого значения параметра X5

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

Параметр X2 (денежный агрегат М2) также существенно отличается в этих двух примерах, а значит, можно провести и его исследование. Для первого примера (рис 3.12) даже незначительное (15%) понижение исходного значения вызывало рост предполагаемого количество банкротов в следующем месяце, однако в случае с повышением исходного значения, требовалось увеличить значение параметра почти вдвое для изменения прогнозируемого результата.

Рисунок 3.12. Изменение исходно низкого значения параметра X2

Для второго примера (рис.3.13) только значительное понижение значения параметра влияло на прогноз, но в случае с повышением требовалось ещё более значительное (от 155% до 1000%) вмешательство.

Рисунок 3.13. Изменение исходно высокого значения параметра X2

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

3.8 Эксперимент с исключением показателей


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

1.      X1 - дефицит или профицит федерального бюджета;

2.      X2 - международные резервы Центрального Банка;

3.      X3 - валютные резервы Центрального Банка;

4.      X4 - RTSI;

.        X5 - среднемесячная кредиторская задолженность предприятий с поправкой на инфляцию;

6.      X6 - среднемесячная дебиторская задолженность предприятий с поправкой на инфляцию;

7.      X7 - инфляция в текущем месяце;

8.      X8 - среднемесячная зарплата граждан с поправкой на инфляцию.

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

Рисунок 3.14. Значимость параметров после исключения

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

Рисунок 3.15. Кривые прогнозирования второй модели

3.9 Третья модель с показателями ликвидности


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

Несмотря на это, внутренние показатели по-прежнему можно использовать для выяснения поведения банка на фоне внешнего давления.

Применение Trait Recognition

Метод распознавания признаков или trait recognition был описан в первой главе и выделение признаков выборки по этому методу может облегчить работу сети, повысить её точность и позволить работать исключительно с нормативами ликвидности для определения рисков банка на основании его внутреннего состояния. Так как записи с компрометированными данными были уже исключены из выборки, не понадобится распознавать нули, однако, этот метод хорошо подходит для пороговых значений нормативов, также описанных в первой главе.

Отдельно проведём исследование по всей выборке. Средние значения параметров банков, ставших банкротами в следующем месяце, слабо отличаются от средних значений общей выборки, но гораздо сильнее как те, так и другие (рис 3.16) отличаются от пороговых значений нормативов, заданных Центральным Банком.

Рисунок 3.16. Исследование значений выборки

Таким образом, можно рассматривать не номинальные, а относительные значения нормативов ликвидности в контексте их пороговых заданных значений. Следует заметить, что многие банки пересекали эти пороговые значения, не теряя лицензии, но политика Центрального Банка позволяет это, если банк не злоупотребляет подобными нарушениями. По текущему предписанию, регулятор призывает соблюдать три из них: норматив мгновенной ликвидности Н2, норматив текущей ликвидности Н3 и норматив долгосрочной ликвидности Н4.

3.10 Проектирование и обучение модели


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

По формулам (1) и (2) можно вычислить количество нейронов на скрытом слое для сети с восемью входами, одним выходом и 463 элементами в выборке. Это число N будет находится в промежутке между 5,22 и 65,52. На практике разумно будет использовать наименьшее количество.

Рисунок 3.17. График обучения третьей модели

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

3.11 Оценка значимости показателей


Вводные показатели распределились (рис 3.18) практически равномерно, а наибольшее значение принял параметр X6, соответствующий относительному значению норматива ликвидности Н4 - долгосрочной ликвидности. Любопытно также то, что показатели X3-6 оказывают наибольшее влияние на прогнозируемый результат, ведь Н2, Н3 и Н4 - это те нормативы, выполнение которых в данный момент предписывается регулятором (Центральным Банком), а Н1.2 - норматив, указывающий на достаточность общего капитала банка.

Рисунок 3.18 Значимость параметров третьей модели

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

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

3.12 Объединение результатов действия моделей


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

3.13 Обоснование использования результатов моделей


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

Также нельзя обратиться и исключительно к данным второй сети.

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

Только третью модель нельзя использовать из-за высокой погрешности выводимого ей результата прогнозирования.

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

3.14 Применение результатов прогнозирования моделей


Так как искомый прогноз риска банкротства кредитной организации N будет являться не числом, но диапазоном, в первую очередь интересовать должны границы этого диапазона. Чтобы выяснить границы, которые предоставляет третья модель, можно обратиться к простой формуле.


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

Вторая модель в качестве результата выдаёт дробное число, соответствующее предполагаемому количеству банков-банкротов в следующем месяце. Разделим это число на количество банков, сдавших отчётность в этом месяце (4) и назовём частное . Эта модель также обладает погрешностью в 0,0721, поэтому искомая величина R также будет являться диапазоном (5).


Теперь остаётся узнать ширину диапазона для конечного результата (6).


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

Заключение


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

Проблема банкротства сохраняется и с каждым днём становится всё более серьёзной, и на её фоне необходимы новые исследования и новые модели прогнозирования.

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

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

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

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

Библиографический список


1.      О внесении изменений в отдельные законодательные акты российской федерации: федеральный закон Российской Федерации от 29 июня 2015 г.

2.      Beaver W. Financial Ratios as Predictors of Failure. - Journal of Accounting Research, vol.4, 1966. - 71-111 c.

.        Altman E. Financial Ratios, Discriminant Analysis and the Prediction of Corporate Bankruptcy. - The Journal of Finance, vol.23 (4), 1968. - 589-609 c.

4.      Пересецкий А.А. Модели причин отзыва лицензий российских банков. Влияние неучтенных факторов. - Прикладная эконометрика, ч.30 (2), 2013. - 49-64 c.

5.      Charnes A. Data envelopment analysis: theory, methodology and application. - Kluwer academic publishers, 1994.

6.      Кошелюк Ю.М. Граничный анализ эффективности функционирования российских банков в период 2004-2005 годов. - Сборник докладов VIII Международной научной конференции "Модернизация экономики и общественное развитие". - М: ГУ-ВШЭ, 2006. - 113-121 c.

7.      Kolari J. Looking for trouble: Early detection of inadequate capitalization of U. S.commercial banks. - International Company and Commercial Law Review, vol.13 (7), 2002. - 269-279 с.

.        Rosenblatt F. The perceptron: a probabilistic model for information storage and organization in the brain. - Psychological Review Vol.65 No.6, 1958. - 386 c.

9.      Хайкин С. Нейронные сети: полный курс. - М.: Издательский дом "Вильямс", 2006. - 198-204 с.

10.    Hopfield J. J. Neural networks and physical systems with emergent collective computational abilities. - Proceedings of National Academy of Sciences, 1982, vol.79 no.8. - 2554-2558 c.

11.    Нормативы ликвидности. [Электронный ресурс] - URL: #"896916.files/image049.gif">

Приложение Б. Пример собранной отчётности



Приложение В. Техническое задание


Введение

Настоящее техническое задание распространяется на разработку web-сайта прогнозирования вероятности банкротства банков.

. Общие сведения

.1 Наименование системы

.1.1 Полное наименование системы: "Интеллектуальная система прогнозирования вероятности банкротства банков"

.2 Заказчик

.2.1 Кафедра информационных технологий в бизнесе НИУ ВШЭ - Пермь

.3 Исполнитель работ

.3.1 Исполнитель работ студент факультета экономики, менеджмента и бизнес-информатики "НИУ ВШЭ - Пермь" Гребнев Никита Антонович

. Основание для разработки

Программа разрабатывается на основании положения НИУ ВШЭ - Пермь "О государственной итоговой аттестации студентов образовательных программ высшего образования - программ бакалавриата, специалитета и магистратуры Национального исследовательского университета "Высшая школа экономики"" № 6.18.1-01/2004-08 от 20.04.2017.

. Назначение

Программа предназначена для работы системы прогнозирования банкротства банков.

. Требования к программе или программному изделию

.1Требования к функциональным характеристикам

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

. Ввод названия или регистрационного номера банка.

. Прогнозирование вероятности банкротства на основе собранных о банке параметров.

. Предоставление справочной информации о необходимых показателях.

. Предоставление исторической информации о макроэкономических показателях.

. Просмотр контактов создателя сайта.

.1.2 Исходные данные

Функции, полученные после обучения и тестирования нейронной сети прогнозирования банкротства на основании нормативов ликвидности, и на основании общей экономической ситуации.

.1.3 Организация входных и выходных данных

Входные данные поступают от с помощью заполнения полей поиска на странице сайта.

Выходные данные отображаются на странице сайта.

.2Требования к надежности

Предусмотреть блокировку некорректных действий пользователя при работе с системой.

.3Требования к составу и параметрам технических средств.

Наличие веб-браузера на пользовательском компьютере.

Минимальная конфигурация:

тип процессора Pentium и выше;

объем оперативного запоминающего устройства 32 Мб и более;

объем свободного места на жестком диске 40 Мб.

Рекомендуемая конфигурация:

Intel Pentium-IV 2400 MHz;

объем оперативного запоминающего устройства 512 Mb;

объем свободного места на жестком диске 60 Мб.

.4 Требования к программной совместимости.

Веб-сайт должен работать под управлением всех популярных операционных систем, при наличии установленного браузера

. Требования к программной документации

.1 Разрабатываемые программные модули должны быть самодокументированы, т.е. тексты программ должны содержать все необходимые комментарии.

.2 Разрабатываемая программа должна включать справочную информацию о работе программы, описания методов.

. Стадии и этапы разработки

. Разработка и тестирование нейронной сети.

. Генерация функции для расчета вероятности банкротства.

. Проектирование веб-сайта.

. Разработка интерфейса.

. Детальная разработка.

. Тестирование.

. Сдача в эксплуатацию.

. Порядок контроля и приемки

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

Приложение Г. Формула второй модели


Y2 =(Math. Tanh

(

(-0.410535745432846) *. Tanh

(

(-0.753993827125983) * (0.001118443127167 * X1 - (-0.367520411587071)) +

.57541248142059 * (0.010582010582011 * X2 - 4.76719576719577) -

.98898600391785 * (0.010598834128246 * X3 - 4.26126126126126) -

.72881473557489 * (0.001543865066193 * X4 - 2.0698984908719) -

.09940750926392 * (0.000318636844051 * X5 - 6.41051737758997) -

.2909705769552 * (0.00037568831641 * X6 - 7.32799205482326) +

.7684024383798 * (0.488997555012225 * X7 - 0.882640586797066) +

.108523380234 * (0.000145399722886 * X8 - 3.69140092371281) + 11.4316011842742

) +

.459556838003578 *. Tanh

(

(-6.61634385048516) * (0.001118443127167 * X1 - (-0.367520411587071)) -

.97753541147134 * (0.010582010582011 * X2 - 4.76719576719577) +

.99222041051853 * (0.010598834128246 * X3 - 4.26126126126126) -

.84728824744538 * (0.001543865066193 * X4 - 2.0698984908719) +

.6169773855694 * (0.000318636844051 * X5 - 6.41051737758997) -

.18922315612881 * (0.00037568831641 * X6 - 7.32799205482326) +

2.29776077527238 * (0.488997555012225 * X7 - 0.882640586797066) -

.793282335318324 * (0.000145399722886 * X8 - 3.69140092371281) - 1.08476157470122

) - 0.564179095598791

) + 1

) / 0.181818181818182;

Приложение Д. Формула третьей модели


Y3 =

(Math. Tanh

(

.11015521711839 *. Tanh

(

(-0.501470977762706) * (0.061448651970197 * X1 - 0.978800215070282) -

.778943076335783 * (0.034567521892764 * X2 - 0.978952220003073) -

.750481452315044 * (0.046090029190352 * X3 - 0.978952220003073) +

.375229570462166 * (0.014300559628567 * X4 - 1.00038134825676) +

.218321910816093 * (0.00839284842029 * X5 - 1.00056232084416) +

.403068045487486 * (0.000333380261861 * X6 - 1.00028157116711) +

.77353357297607 * (0.016085715445834 * X7 - 0.995127497157707) +

.502838233121193 * (0.006296296296296 * X8 - 0.888888888888889) -

.144261062229623

) -

.85483031817679 *. Tanh

(

.2651111076382 * (0.061448651970197 * X1 - 0.978800215070282) -

.4830407334928 * (0.034567521892764 * X2 - 0.978952220003073) -

.0313616848902 * (0.046090029190352 * X3 - 0.978952220003073) -

.68647281220141 * (0.014300559628567 * X4 - 1.00038134825676) +

.576712528087854 * (0.00839284842029 * X5 - 1.00056232084416) +

.183174043425955 * (0.000333380261861 * X6 - 1.00028157116711) -

.34212512673077 * (0.016085715445834 * X7 - 0.995127497157707) +

.1994189741987 * (0.006296296296296 * X8 - 0.888888888888889) -

.25411282675237

) +

.81364881452648 *. Tanh

(

.80909233673298 * (0.061448651970197 * X1 - 0.978800215070282) +

.189511369971027 * (0.034567521892764 * X2 - 0.978952220003073) -

.996057235954168 * (0.046090029190352 * X3 - 0.978952220003073) -

.89299487039896 * (0.014300559628567 * X4 - 1.00038134825676) -

.371143381215108 * (0.00839284842029 * X5 - 1.00056232084416) +

.42238000155479 * (0.000333380261861 * X6 - 1.00028157116711) +

.62486750845002 * (0.016085715445834 * X7 - 0.995127497157707) -

.411447042087672 * (0.006296296296296 * X8 - 0.888888888888889) +

.344278768242371

) -

.13159848563647 *. Tanh

(

.00266897807028 * (0.061448651970197 * X1 - 0.978800215070282) -

.075045336444157 * (0.034567521892764 * X2 - 0.978952220003073) +

.333500370067636 * (0.046090029190352 * X3 - 0.978952220003073) -

.68292177124973 * (0.014300559628567 * X4 - 1.00038134825676) +

.359026648126369 * (0.00839284842029 * X5 - 1.00056232084416) +

.29905271774295 * (0.000333380261861 * X6 - 1.00028157116711) +

.72582249823967 * (0.016085715445834 * X7 - 0.995127497157707) -

.081116315231472 * (0.006296296296296 * X8 - 0.888888888888889) -

.196821501079183

) +

.7116258929272 *. Tanh

(

.114799691970129 * (0.061448651970197 * X1 - 0.978800215070282) +

.201162952519735 * (0.034567521892764 * X2 - 0.978952220003073) -

.148258898360457 * (0.046090029190352 * X3 - 0.978952220003073) -

.420155114714008 * (0.00839284842029 * X5 - 1.00056232084416) +

.234855109834512 * (0.000333380261861 * X6 - 1.00028157116711) -

.129687402035756 * (0.016085715445834 * X7 - 0.995127497157707) +

.136989283594989 * (0.006296296296296 * X8 - 0.888888888888889) +

.001477622977292

) +

.24741524961086 *. Tanh

(

(-0.112700656526394) * (0.061448651970197 * X1 - 0.978800215070282) -

.8506190973417 * (0.034567521892764 * X2 - 0.978952220003073) -

.801029481462 * (0.046090029190352 * X3 - 0.978952220003073) -

.74703088588443 * (0.014300559628567 * X4 - 1.00038134825676) -

.09774979394308 * (0.00839284842029 * X5 - 1.00056232084416) -

.131880017940985 * (0.000333380261861 * X6 - 1.00028157116711) -

16.1045555410116 * (0.016085715445834 * X7 - 0.995127497157707) -

.992611312096357 * (0.006296296296296 * X8 - 0.888888888888889) +

.189585731515306

) +

.419633134679638

) + 1

) / 2;

Приложение Е. Листинг программы


Класс Bank.

public class Bank

{int Id { get; set; }string Name { get; set; }bool Bankrupt { get; set; }int year { get; set; }int month { get; set; }double otkl { get; set; }double risk { get; set; }DataTable liquidytyDataTable = new DataTable ();void PullLiquidity ()

{connS = @"Data Source=ROOT-PC\SQL2016;Catalog=bankruptcy; Integrated Security=True";query = "select * from liquidity where bank_id=@val1";conn = new SqlConnection (connS);comm = new SqlCommand (query, conn);. Parameters. AddWithValue ("@val1", Id);. Open ();da = new SqlDataAdapter (comm);. Fill (liquidytyDataTable);. Close ();. Dispose ();

}

}

Контроллер Banks.

public class BanksController: Controller

{

// GET: BanksActionResult Index (int? page)

{entities = new bankruptcyEntities ();pageSize = 15;pageNumber = (page?? 1);View (entities. list. ToList (). ToPagedList (pageNumber, pageSize));

}ActionResult Details (int id, int pagenumber)

{entities = new bankruptcyEntities ();bank = new Bank ();. Id = id;. Bankrupt = entities. list. Find (id). bankrupt;. Name = entities. list. Find (id). name;. otkl = Math. Round (Convert. ToDouble (entities. liquidity. SqlQuery ("select top 1 * from liquidity where bank_id = @id order by month_id desc", new SqlParameter ("@id", id. ToString ())). First (). Otklon), 0);. risk = Math. Round (Math. Abs (100 - bank. otkl) * Convert. ToDouble (entities. macro. ToList (). Last (). Progn) /25, 0);control = Convert. ToDouble (entities. macro. ToList (). Last (). Progn);(bank. Bankrupt)

{. month = entities. list. Find (id). liquidity. LastOrDefault (). months. month;. year = entities. list. Find (id). liquidity. LastOrDefault (). months. year;

}viewModel = new DetailsViewModel () { bankdetails = bank, listpage = pagenumber };View (viewModel);

}ActionResult ShowLiquidity (int id, int pagenumber)

{entities = new bankruptcyEntities ();viewModel = new LiquidityViewModel () { liqlist = entities. liquidity. SqlQuery ("select * from liquidity as string where bank_id = @id", new SqlParameter ("@id", id. ToString ())). ToList (), listpage = pagenumber };View (viewModel);

}

}

Контроллер Macros.

public class MacrosController: Controller

{

// GET: MacrosActionResult Index (int? page)

{entities = new bankruptcyEntities ();pageSize = 12;pageNumber = (page?? 1);View (entities. macro. ToList (). ToPagedList (pageNumber, pageSize));

}

}

Контроллер Search

public class SearchController: Controller

{

// GET: SearchActionResult Index (string search)

{entities = new bankruptcyEntities ();bank = new Bank ();id = 0;found = 0;<list> liqlist = entities. list. SqlQuery ("select * from list"). ToList ();(! (search == ""))

{

{(Int32. TryParse (search, out id))

{. Id = id;. Bankrupt = entities. list. Find (id). bankrupt;. Name = entities. list. Find (id). name;. risk = Math. Round (Convert. ToDouble (entities. liquidity. SqlQuery ("select top 1 * from liquidity where bank_id = @id order by month_id desc", new SqlParameter ("@id", id. ToString ())). First (). Otklon),

);(bank. Bankrupt)

{. month = entities. list. Find (id). liquidity. LastOrDefault (). months. month;. year = entities. list. Find (id). liquidity. LastOrDefault (). months. year;

}= 1;

}

{. Id = entities. list. ToList (). Find (x => x. name == search). id;. Bankrupt = entities. list. Find (bank. Id). bankrupt;. Name = entities. list. Find (bank. Id). name;. risk = Math. Round (Convert. ToDouble (entities. liquidity. SqlQuery ("select top 1 * from liquidity where bank_id = @id order by month_id desc", new SqlParameter ("@id", id. ToString ())). First (). Otklon),

);(bank. Bankrupt)

{. month = entities. list. Find (id). liquidity. LastOrDefault (). months. month;. year = entities. list. Find (id). liquidity. LastOrDefault (). months. year;

}= 1;

}

}{ found = 0; }

}viewModel = new DetailsViewModel () { bankdetails = bank, listpage = found };View (viewModel);

}ActionResult CharterColumn (int bid)

{_context = new bankruptcyEntities ();xValue = new ArrayList ();yValueLow = new ArrayList ();yValueHigh = new ArrayList ();temp = "<Chart Palette=\"SemiTransparent\" BorderColor=\"#000\" BorderWidth=\"2\" BorderlineDashStyle=\"Solid\">\r\n<ChartAreas>\r\n <ChartArea _Template_=\"All\" Name=\"Default\">\r\n <AxisX Interval = \"365\">\r\n <LabelStyle Format=\"yyyy\"></LabelStyle> <MinorGrid Enabled=\"False\" />\r\n <MajorGrid Enabled=\"False\" />\r\n </AxisX>\r\n <AxisY>\r\n <MajorGrid Enabled=\"False\" />\r\n <MinorGrid Enabled=\"False\" />\r\n </AxisY>\r\n </ChartArea>\r\n</ChartAreas>\r\n</Chart>";results = (from c in _context. liquidity. Where (x => x. bank_id == bid) select c);. ToList (). ForEach (rs => xValue. Add (new DateTime (rs. months. year + 1, rs. months. month, 1)));. ToList (). ForEach (rs => yValueLow. Add ( (rs. Otklon - 0.2507) * 100));. ToList (). ForEach (rs => yValueHigh. Add ( (rs. Otklon + 0.2507) * 100));myChart = new Chart (width: 1000, height: 200, theme: temp)

. AddTitle ("Риск банкротства за период полученной отчётности, выраженный в процентах")

. AddSeries (: "Максимальный риск",: "Range",: xValue,: Cut (yValueHigh))

. AddSeries (: "Минимальный риск",: "Range",: xValue,: Cut (yValueLow))

. AddLegend ()

. GetBytes ("png");File (myChart, "image/png");

}ArrayList Cut (ArrayList patient)

{high = 100;low = 0;newpatient = new ArrayList ();(int i = 0; i < patient. Count; i++)

{(Convert. ToDouble (patient [i]) > 100) newpatient. Add (high);if (Convert. ToDouble (patient [i]) < 0) newpatient. Add (low);newpatient. Add (patient [i]);

}newpatient;

}

}

Представление Banks/Index

@model PagedList. IPagedList<Bankruptcy11. Models. list>

@using PagedList. Mvc;

@{. Title = "IndexList";= "~/Views/Shared/_Layout. cshtml";

}

<h2>Список банков</h2>

<table>

@foreach (var item in Model)

{(item. bankrupt)

{

<tr>

<td>

@Html. DisplayFor (modelItem => item. id)

</td>

<td>

@if (item. name == "")

{

<p>Неизвестный банк</p>

}

else

{

@Html. DisplayFor (modelItem => item. name)

}

</td>

<td>

<p>Банкрот</p>

</td>

<td>

@Html. ActionLink ("Общая информация", "Details", new { id = item. id, pagenumber = Model. PageNumber }) |

@Html. ActionLink ("Ликвидность", "ShowLiquidity", new { id = item. id, pagenumber = Model. PageNumber })

</td>

</tr>

}

{

<tr>

<td>

@Html. DisplayFor (modelItem => item. id)

</td>

<td>

@if (item. name == "")

{

<p>Неизвестный банк</p>

}

else

{

@Html. DisplayFor (modelItem => item. name)

}

</td>

<td>

<p>Действует</p>

</td>

<td>

@Html. ActionLink ("Общая информация", "Details", new { id = item. id, pagenumber = Model. PageNumber }) |

@Html. ActionLink ("Ликвидность", "ShowLiquidity", new { id = item. id, pagenumber = Model. PageNumber })

</td>

</tr>

}

}

</table>

<br />

Страница @ (Model. PageCount < Model. PageNumber? 0: Model. PageNumber) из @Model. PageCount

@Html. PagedListPager (Model, page => Url. Action ("Index", new { page }))

Представление Banks/Details

@model Bankruptcy11. ViewNodels. DetailsViewModel

@{. Title = "Details";= "~/Views/Shared/_Layout. cshtml";

}

<h2>Информация о банке @Model. bankdetails. Name</h2>

<div>

<h4></h4>

<hr />

<dl>

<dt>

Регистрационный номер

</dt>

<dd>

@Html. DisplayFor (model => model. bankdetails. Id)

</dd>

<dt>

Банкротство

</dt>

<dd>

@Html. DisplayFor (model => model. bankdetails. Bankrupt)

</dd>

@if (Model. bankdetails. Bankrupt)

{

<dt>

Лишён лицензии

</dt>

<dd>

@Html. DisplayFor (model => model. bankdetails. month) /@Html. DisplayFor (model => model. bankdetails. year)

</dd>

}

{

<dt>

Текущий риск

</dt>

<dd>

@Html. DisplayFor (model => model. bankdetails. risk) %

</dd>

<img src="@Url. Action ("CharterColumn", "Banks", new { bid = Model. bankdetails. Id})" alt="Chart" />

}

</dl>

</div>

<p>

@Html. ActionLink ("Посмотреть ликвидность", "ShowLiquidity", new { id = Model. bankdetails. Id, pagenumber = Model. listpage })

</p>

<p>

@Html. ActionLink ("К списку банков", "Index", new { page = Model. listpage })

</p>

Представление Banks/ShowLiquidity

@model Bankruptcy11. ViewNodels. LiquidityViewModel

@{. Title = "ShowLiquidity";= "~/Views/Shared/_Layout. cshtml";

}

<h2>@Html. DisplayFor (modelItem => Model. liqlist. First (). list. name) </h2>

<table>

<tr>

<th>

Год

</th>

<th>

Месяц

</th>

<th>

Н1.0

</th>

<th>

Н1.1

</th>

<th>

Н1.2

</th>

<th>

Н2

</th>

<th>

Н3

</th>

<th>

Н4

</th>

<th>

Н7

</th>

<th>

Н9

</th>

<th>

Н10

</th>

<th>

Н12

</th>

<th>

Н18

</th>

<th>

Отклонение от нормы

</th>

<th></th>

</tr>

@foreach (var item in Model. liqlist)

{

<tr>

<td>

@Html. DisplayFor (modelItem => item. months. year)

</td>

<th>

@Html. DisplayFor (modelItem => item. months. month)

</th>

<td>

@Html. DisplayFor (modelItem => item. N100)

</td>

<td>

@Html. DisplayFor (modelItem => item. N101)

</td>

<td>

@Html. DisplayFor (modelItem => item. N102)

</td>

<td>

@Html. DisplayFor (modelItem => item. N2)

</td>

<td>

@Html. DisplayFor (modelItem => item. N3)

</td>

<td>

@Html. DisplayFor (modelItem => item. N4)

</td>

<td>

@Html. DisplayFor (modelItem => item. N7)

</td>

<td>

@Html. DisplayFor (modelItem => item. N9)

</td>

<td>

@Html. DisplayFor (modelItem => item. N10)

</td>

<td>

@Html. DisplayFor (modelItem => item. N12)

</td>

<td>

@Html. DisplayFor (modelItem => item. N18)

</td>

<td>

@Html. DisplayFor (modelItem => item. Otklon)

</td>

</tr>

}

</table>

<p>

@Html. ActionLink ("К списку банков", "Index", new { page = Model. listpage })

</p>

<div class="jumbotron">

<h1>Справочная информация</h1>

<p>

<p>

Н1.0 определяется как отношение размера собственных средств (капитала) банка к сумме его активов

(за вычетом сформированных резервов на возможные потери и резервов на возможные потери по ссудам,

ссудной и приравненной к ней задолженности, взвешенных по уровню риска.

</p>

<p>

Минимальное значение 8%

</p>

<p class="lead"><em>Н2</em></p>

<p>

Н2 регулирует (ограничивает) риск потери банком ликвидности в течение одного операционного дня и

определяет минимальное отношение суммы высоколиквидных активов банка к сумме обязательств (пассивов) банка по

счетам до востребования, скорректированных на величину минимального совокупного остатка средств

по счетам физических и юридических лиц до востребования.

</p>

<p>

Минимальное значение 15%

</p>

<p class="lead"><em>Н3</em></p>

<p>

Н3 регулирует (ограничивает) риск потери банком ликвидности в течение ближайших к дате расчета норматива 30 календарных дней и

определяет минимальное отношение суммы ликвидных активов банка к сумме обязательств (пассивов) банка по счетам до востребования и

со сроком исполнения обязательств в ближайшие 30 календарных дней, скорректированных на величину минимального совокупного остатка

средств по счетам физических и юридических лиц до востребования и со сроком исполнения обязательств в ближайшие 30 календарных дней.

</p>

<p>

Минимальное значение 50%

</p>

<p class="text-danger">

Нарушение Н2 и Н3 говорит о недостаточном запасе ликвидности банка.

</p>

<p>

<p>

Н4 регулирует (ограничивает) риск потери банком ликвидности в результате размещения средств в долгосрочные активы и определяет максимально допустимое отношение кредитных требований банка с оставшимся сроком до даты погашения свыше 365 или 366 календарных дней, к собственным средствам (капиталу) банка и обязательствам (пассивам) с оставшимся сроком до даты погашения свыше 365 или 366 календарных дней, скорректированным на величину минимального совокупного остатка средств по счетам со сроком исполнения обязательств до 365 календарных дней и счетам до востребования физических и юридических лиц (кроме банков-клиентов).

</p>

<p>

Максимальное значение 120%

</p>

<p class="text-danger">

Несоблюдение Н4 говорит о том, что банк злоупотребляет размещением в долгосрочные активы краткосрочных пассивов (например банк выдает ипотеку сроком на 25 лет, при этом деньги на эти кредиты он заимствует у банков-контрагентов на 30 дней).

</p>

<p>

<p>

Н7 регулирует (ограничивает) совокупную величину крупных кредитных рисков банка и определяет максимальное отношение совокупной величины крупных кредитных рисков и размера собственных средств (капитала) банка.

</p>

<p>

Максимальное значение 800%

</p>

<p class="lead"><em>Н9.1</em></p>

<p>

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

</p>

<p>

Максимальное значение 50%

</p>

<p class="lead"><em>Н10.1</em></p>

<p>

</p>

<p>

Максимальное значение 3%

</p>

<p class="lead"><em>Н12</em></p>

<p>

Н12 регулирует (ограничивает) совокупный риск вложений банка в акции (доли) других юридических лиц и определяет максимальное отношение сумм, инвестируемых банком на приобретение акций (долей) других юридических лиц, к собственным средствам (капиталу) банка.

</p>

<p>

Максимальное значение 25%

</p>

<p class="lead"><em>Н18</em></p>

<p>

Н18 регулирует (ограничивает) минимальное соотношение размера ипотечного покрытия и объема эмиссии облигаций с ипотечным покрытием.

</p>

<p>

Минимальное значение 100%

</p>

</div>

Представление Macros/Index

@model PagedList. IPagedList<Bankruptcy11. Models. macro>

@using PagedList. Mvc;

@{. Title = "Index";= "~/Views/Shared/_Layout. cshtml";

}

<h2>Макроэкономические показатели</h2>

<table class="table">

<tr>

<th>

Год

</th>

<th>

Месяц

</th>

<th>

Гос. бюджет

</th>

<th>

Агрегат М2

</th>

<th>

Резерв ЦБ

</th>

<th>

Валютный резерв ЦБ

</th>

<th>

Курс доллара ММВБ

</th>

<th>

Индекс РТС

</th>

<th>

Кредиторская задолженность

</th>

<th>

Дебиторская задолженность

</th>

<th>

Инфляция

</th>

<th>

ВВП

</th>

<th>

Средняя зарплата

</th>

</tr>

@foreach (var item in Model) {

<tr>

<td>

@Html. DisplayFor (modelItem => item. months. year)

</td>

<td>

@Html. DisplayFor (modelItem => item. months. month)

</td>

<td>

@Html. DisplayFor (modelItem => item. DefProf)

</td>

<td>

@Html. DisplayFor (modelItem => item. M2)

</td>

<td>

@Html. DisplayFor (modelItem => item. MrezCB)

</td>

<td>

@Html. DisplayFor (modelItem => item. VrezCB)

</td>

<td>

@Html. DisplayFor (modelItem => item. MMVB)

</td>

<td>

@Html. DisplayFor (modelItem => item. RTSI)

</td>

<td>

@Html. DisplayFor (modelItem => item. KredZad)

</td>

<td>

@Html. DisplayFor (modelItem => item. DebZad)

</td>

<td>

@Html. DisplayFor (modelItem => item. Infl)

</td>

<td>

@Html. DisplayFor (modelItem => item. VVP)

</td>

<td>

@Html. DisplayFor (modelItem => item. Zarp)

</td>

</tr>

}

</table>

<br />

Страница @ (Model. PageCount < Model. PageNumber? 0: Model. PageNumber) из @Model. PageCount

@Html. PagedListPager (Model, page => Url. Action ("Index", new { page }))

Представление Search/Index

@model Bankruptcy11. ViewNodels. DetailsViewModel

@{. Title = "Details";= "~/Views/Shared/_Layout. cshtml";

}

@if (Model. listpage == 0)

{

<hr/>

<p>Банк с таким регистрационным номером или названием отсутствует</p>

}

else

{

<h2>Информация о банке @Model. bankdetails. Name</h2>

<div>

<h4></h4>

<hr />

<dl>

<dt>

Регистрационный номер

</dt>

<dd>

@Html. DisplayFor (model => model. bankdetails. Id)

</dd>

<dt>

Банкротство

</dt>

<dd>

@Html. DisplayFor (model => model. bankdetails. Bankrupt)

</dd>

@if (Model. bankdetails. Bankrupt)

{

<dt>

Лишён лицензии

</dt>

<dd>

@Html. DisplayFor (model => model. bankdetails. month) /@Html. DisplayFor (model => model. bankdetails. year)

</dd>

}

else

{

<dt>

Отклонение

</dt>

<dd>

@Html. DisplayFor (model => model. bankdetails. otkl)

</dd>

<dt>

Риск

</dt>

<dd>

@Html. DisplayFor (model => model. bankdetails. risk) %

</dd>

}

</dl>

</div>

<p>

@Html. ActionLink ("Посмотреть ликвидность", "ShowLiquidity", "Banks", new { id = Model. bankdetails. Id, pagenumber = 1 }, new Dictionary<string, object> ())

</p>

}

Представление Shared/_Layout

<body>

<div>

<div>

<div>

<button type="button">

<span>

<span>

<span>

</button>

@Html. ActionLink ("На главную", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })

</div>

<form id="searchForm" method="get" action="~/Search/Index">

<div>

<input id="search" name="search" type="text">

</div>

<button value="Search" type="submit">

</form>

<div>

<ul>

<li>@Html. ActionLink ("Макроэкономические показатели", "Index", "Macros") </li>

<li>@Html. ActionLink ("Список банков", "Index", "Banks") </li>

</ul>

</div>

</div>

</div>

<div>

@RenderBody ()

<hr />

<footer>

<p>&copy; Никита Гребнев - @DateTime. Now. Year</p>

</footer>

</div>

</body>

</html>

Класс Parser

public class Parser

{static DataTable GetLiquid (string nfile)

{initialtable = new DataTable ();returntable = new DataTable ();wd40 = new WDBF ();= wd40. GetAll (nfile);[] drs = initialtable. Select (null, null, DataViewRowState. CurrentRows);. Columns. Add ("РЕГН");. Columns. Add ("Н1.0");. Columns. Add ("Н1.1");. Columns. Add ("Н1.2");. Columns. Add ("Н2");. Columns. Add ("Н3");. Columns. Add ("Н4");. Columns. Add ("Н7");. Columns. Add ("Н10.1");lontghh = 0;lastrow = Convert. ToInt32 (drs [0] [0]);height = 0;workrow = null;(int i = 0; i < drs. Length; i++)

{(Convert. ToInt32 (drs [i] [0])! = lastrow)

{++;= returntable. NewRow ();[0] = lastrow;(int j = 0; j < height; j++)

{(Convert. ToString (drs [i - height + j] [1]) == "Н1.0") workrow [1] = Convert. ToDouble (drs [i - height + j] [2]);(Convert. ToString (drs [i - height + j] [1]) == "Н1.1") workrow [2] = Convert. ToDouble (drs [i - height + j] [2]);(Convert. ToString (drs [i - height + j] [1]) == "Н1.2") workrow [3] = Convert. ToDouble (drs [i - height + j] [2]);(Convert. ToString (drs [i - height + j] [1]) == "Н2") workrow [4] = Convert. ToDouble (drs [i - height + j] [2]);(Convert. ToString (drs [i - height + j] [1]) == "Н3") workrow [5] = Convert. ToDouble (drs [i - height + j] [2]);(Convert. ToString (drs [i - height + j] [1]) == "Н4") workrow [6] = Convert. ToDouble (drs [i - height + j] [2]);(Convert. ToString (drs [i - height + j] [1]) == "Н7") workrow [7] = Convert. ToDouble (drs [i - height + j] [2]);(Convert. ToString (drs [i - height + j] [1]) == "Н10.1") workrow [8] = Convert. ToDouble (drs [i - height + j] [2]);

}. Rows. Add (workrow);= 0;= Convert. ToInt32 (drs [i] [0]);

}height++;

}= returntable. Select (null, null, DataViewRowState. CurrentRows);returntable; }static string [,] GetMacros ()

{infbase = 46.96;[,] gov_m = ParserSophist (new int [] { 6, 6, 6, 6 }, "http://sophist. hse.ru/exes/tables/GOV_M. htm");[,] m_m = ParserSophist (new int [] { 6, 7, 5, 5 }, "http://sophist. hse.ru/exes/tables/M_M. htm");[,] finmar_m = ParserSophist (new int [] { 5, 5, 7, 1, 1, 1, 1 }, "http://sophist. hse.ru/exes/tables/FINMAR_M. htm");[,] finent_m = ParserSophist (new int [] { 7, 6, 6, 4, 7, 6, 6 }, "http://sophist. hse.ru/exes/tables/FINENT_M. htm");[] inflation = ParserInflation ("https: // www.statbureau.org/ru/russia/inflation-tables/inflation. monthly. csv");[,] wag_m = ParserSophist (new int [] { 5, 5, 7 }, "http://sophist. hse.ru/exes/tables/WAG_M. htm");findlowest = 12;(gov_m. GetLength (0) < findlowest) findlowest = gov_m. GetLength (0);(m_m. GetLength (0) < findlowest) findlowest = m_m. GetLength (0);(finmar_m. GetLength (0) < findlowest) findlowest = finmar_m. GetLength (0);(finent_m. GetLength (0) < findlowest) findlowest = finent_m. GetLength (0);(wag_m. GetLength (0) < findlowest) findlowest = wag_m. GetLength (0);[,] macros = new string [findlowest, 8];(int i = 0; i < macros. GetLength (0); i++)

{+= Convert. ToDouble (inflation [i]);[i, 0] = (Convert. ToDouble (gov_m [i, 0]) - Convert. ToDouble (gov_m [i, 1])). ToString ();[i, 1] = m_m [i, 2];[i, 2] = m_m [i, 3];[i, 3] = finmar_m [i, 2];[i, 4] = (Convert. ToDouble (finent_m [i, 0]) / (infbase)). ToString ();[i, 5] = (Convert. ToDouble (finent_m [i, 4]) / (infbase)). ToString ();[i, 6] = inflation [i];[i, 7] = (Convert. ToDouble (wag_m [i, 2]) / (infbase)). ToString ();

}macros;

}string [,] ParserSophist (int [] b, string path)

{req = (HttpWebRequest) WebRequest. Create (path);resp = (HttpWebResponse) req. GetResponse ();sr = new StreamReader (resp. GetResponseStream (), Encoding. GetEncoding ("windows-1251"));cn = sr. ReadToEnd ();. Close ();. Close ();= cn. Substring (cn. IndexOf ("2017 1"));= cn. Replace ("<TD ALIGN='right'><FONT size=+0 face=\"Tahoma\">", "");= cn. Replace ("</FONT></TD>", "");= cn. Substring (0, cn. Length - cn. Substring (cn. IndexOf ("<TR bgColor")). Length);= cn. Replace ("</TR>", "");= cn. Replace ("<TR ALIGN='center' VALIGN='bottom'>", "");= cn. Replace (Environment. NewLine, " ");= cn. Trim ();= cn. Remove (0,5);= cn. Replace ("", "");[,] boxen = new string [cn. Length / (b. Sum () + 1), b. Length];tmpread = 0;tmpstr = "";(int i = 0; i < boxen. GetLength (0); i++)

{= cn. Substring (i * (b. Sum () + 1), (b. Sum () + 1));(int j = 0; j < b. Length; j++)

{[i, j] = tmpstr. Substring (1 + tmpread, b [j]);+= b [j];

}= 0;

}boxen;

}string [] ParserInflation (string path)

{req = (HttpWebRequest) WebRequest. Create (path);resp = (HttpWebResponse) req. GetResponse ();sr = new StreamReader (resp. GetResponseStream ());cn = sr. ReadToEnd ();. Close ();. Close ();= cn. Substring (cn. IndexOf ("2017"));= cn. Remove (0,5);[] splitted = cn. Split (',');[] bordersplitted;border = 0;iteration = 0;( (border == 0) && (iteration < splitted. Length))

{(splitted [iteration] == "") border = iteration;++;

}(border > 0)

{= new string [border];(int i = 0; i < bordersplitted. Length; i++) bordersplitted [i] = splitted [i]. Replace ('. ', ',');= bordersplitted;

}

{= new string [12];(int i = 0; i < bordersplitted. Length; i++) bordersplitted [i] = splitted [i]. Replace ('. ', ',');= bordersplitted;

}splitted;

} }

Класс Compute

public class Compute

{double [] Start (double [] m, double [] l, int n)

{[] res = Calculate (m, l, n);res;

}static double [] Calculate (double [] macro, double [] liquid, int quantity)

{[] result = new double [2];err = 0.2507;X1 = macro [0];X2 = macro [1];X3 = macro [2];X4 = macro [3];X5 = macro [4];X6 = macro [5];X7 = macro [6];X8 = macro [7];Y1 =

(Math. Tanh

(

(-0.410535745432846) *. Tanh

(

(-0.753993827125983) * (0.001118443127167 * X1 - (-0.367520411587071)) +

.57541248142059 * (0.010582010582011 * X2 - 4.76719576719577) -

.98898600391785 * (0.010598834128246 * X3 - 4.26126126126126) -

.72881473557489 * (0.001543865066193 * X4 - 2.0698984908719) -

.09940750926392 * (0.000318636844051 * X5 - 6.41051737758997) -

.2909705769552 * (0.00037568831641 * X6 - 7.32799205482326) +

.7684024383798 * (0.488997555012225 * X7 - 0.882640586797066) +

.108523380234 * (0.000145399722886 * X8 - 3.69140092371281) + 11.4316011842742

) +

.459556838003578 *. Tanh

(

(-6.61634385048516) * (0.001118443127167 * X1 - (-0.367520411587071)) -

.97753541147134 * (0.010582010582011 * X2 - 4.76719576719577) +

.99222041051853 * (0.010598834128246 * X3 - 4.26126126126126) -

.84728824744538 * (0.001543865066193 * X4 - 2.0698984908719) +

.6169773855694 * (0.000318636844051 * X5 - 6.41051737758997) -

.18922315612881 * (0.00037568831641 * X6 - 7.32799205482326) +

.29776077527238 * (0.488997555012225 * X7 - 0.882640586797066) -

.793282335318324 * (0.000145399722886 * X8 - 3.69140092371281) - 1.08476157470122

) - 0.564179095598791

) + 1

) / 0.181818181818182;= liquid [0];= liquid [1];= liquid [2];= liquid [3];= liquid [4];= liquid [5];= liquid [6];= liquid [7];Y2 =

(Math. Tanh

(

.11015521711839 *. Tanh

(

(-0.501470977762706) * (0.061448651970197 * X1 - 0.978800215070282) -

.778943076335783 * (0.034567521892764 * X2 - 0.978952220003073) -

.750481452315044 * (0.046090029190352 * X3 - 0.978952220003073) +

.375229570462166 * (0.014300559628567 * X4 - 1.00038134825676) +

.218321910816093 * (0.00839284842029 * X5 - 1.00056232084416) +

.403068045487486 * (0.000333380261861 * X6 - 1.00028157116711) +

.77353357297607 * (0.016085715445834 * X7 - 0.995127497157707) +

.502838233121193 * (0.006296296296296 * X8 - 0.888888888888889) -

.144261062229623

) -

.85483031817679 *. Tanh

(

.2651111076382 * (0.061448651970197 * X1 - 0.978800215070282) -

.4830407334928 * (0.034567521892764 * X2 - 0.978952220003073) -

.0313616848902 * (0.046090029190352 * X3 - 0.978952220003073) -

.68647281220141 * (0.014300559628567 * X4 - 1.00038134825676) +

.576712528087854 * (0.00839284842029 * X5 - 1.00056232084416) +

.183174043425955 * (0.000333380261861 * X6 - 1.00028157116711) -

.34212512673077 * (0.016085715445834 * X7 - 0.995127497157707) +

.1994189741987 * (0.006296296296296 * X8 - 0.888888888888889) -

.25411282675237

) +

.81364881452648 *. Tanh

(

.80909233673298 * (0.061448651970197 * X1 - 0.978800215070282) +

.189511369971027 * (0.034567521892764 * X2 - 0.978952220003073) -

.996057235954168 * (0.046090029190352 * X3 - 0.978952220003073) -

.89299487039896 * (0.014300559628567 * X4 - 1.00038134825676) -

.371143381215108 * (0.00839284842029 * X5 - 1.00056232084416) +

.42238000155479 * (0.000333380261861 * X6 - 1.00028157116711) +

.62486750845002 * (0.016085715445834 * X7 - 0.995127497157707) -

.411447042087672 * (0.006296296296296 * X8 - 0.888888888888889) +

.344278768242371

) -

.13159848563647 *. Tanh

(

.00266897807028 * (0.061448651970197 * X1 - 0.978800215070282) -

.075045336444157 * (0.034567521892764 * X2 - 0.978952220003073) +

.333500370067636 * (0.046090029190352 * X3 - 0.978952220003073) -

.68292177124973 * (0.014300559628567 * X4 - 1.00038134825676) +

.359026648126369 * (0.00839284842029 * X5 - 1.00056232084416) +

.29905271774295 * (0.000333380261861 * X6 - 1.00028157116711) +

.72582249823967 * (0.016085715445834 * X7 - 0.995127497157707) -

.081116315231472 * (0.006296296296296 * X8 - 0.888888888888889) -

.196821501079183

) +

.7116258929272 *. Tanh

(

.114799691970129 * (0.061448651970197 * X1 - 0.978800215070282) +

.201162952519735 * (0.034567521892764 * X2 - 0.978952220003073) -

.148258898360457 * (0.046090029190352 * X3 - 0.978952220003073) -

.07723696682859 * (0.014300559628567 * X4 - 1.00038134825676) -

.420155114714008 * (0.00839284842029 * X5 - 1.00056232084416) +

.234855109834512 * (0.000333380261861 * X6 - 1.00028157116711) -

.129687402035756 * (0.016085715445834 * X7 - 0.995127497157707) +

.136989283594989 * (0.006296296296296 * X8 - 0.888888888888889) +

.001477622977292

) +

.24741524961086 *. Tanh

(

(-0.112700656526394) * (0.061448651970197 * X1 - 0.978800215070282) -

.8506190973417 * (0.034567521892764 * X2 - 0.978952220003073) -

.801029481462 * (0.046090029190352 * X3 - 0.978952220003073) -

.74703088588443 * (0.014300559628567 * X4 - 1.00038134825676) -

.09774979394308 * (0.00839284842029 * X5 - 1.00056232084416) -

.131880017940985 * (0.000333380261861 * X6 - 1.00028157116711) -

.1045555410116 * (0.016085715445834 * X7 - 0.995127497157707) -

.992611312096357 * (0.006296296296296 * X8 - 0.888888888888889) +

.189585731515306

) +

.419633134679638

) + 1

) / 2;[0] = Y2 + Y1/quantity - err;[1] = Y2 + Y1/quantity + err;result;

}

}