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

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 07.08.2018
Размер файла 1,7 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

ѕ Полностью совместим со многими средами разработки. Проекты, собираемые c помощью maven, легко открываются основными средами разработки на java. При чем, практически во всех случаях проект сразу готов к дальнейшей разработке и не требует дополнительных настроек.

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

ѕ Декларативное описание проекта.

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

Состав файла pom.xml:

· Корневой элемент и заголовок.

<project xmlns="http://maven.apache.org/POM/4.0.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.avdeeva.neural</groupId>

<artifactId>neural-networks</artifactId>

<version>0.0.1-SNAPSHOT</version>

<packaging>jar</packaging>

.............

</project>

· Корневой элемент <project>, схема, облегчающая редактирование и проверку, и версия POM.

· Внутри тэга project содержится основная и обязательная информация о проекте:

<!-- The Basics -->

<groupId>...</groupId>

<artifactId>...</artifactId>

<version>...</version>

В Maven каждый проект идентифицируется парой groupId artifactId. Во избежание конфликта имен, groupId - наименование организации или подразделения и обычно действуют такие же правила, как и при именовании пакетов в Java - записывают доменное имя организации или сайта проекта. artifactId - название проекта. Внутри тэга version, как можно догадаться хранится версия проекта. Тройкой groupId, artifactId, version (далее - GAV) можно однозначно идентифицировать jar файл приложения или библиотеки. Если состояние кода для проекта не зафиксировано, то в конце к имени версии добавляется "-SNAPSHOT" что обозначает, что версия в разработке и результирующий jar файл может меняться. <packaging>...</packaging> определяет какого типа файл будет создаваться как результат сборки. Возможные варианты pom, jar, war, ear

Зависимости - следующая очень важная часть pom.xml - тут хранится список всех библиотек (зависимостей) которые используюся в проекте. Каждая библиотека идентифицируется также, как и сам проект - тройкой groupId, artifactId, version (GAV). Объявление зависимостей заключено в тэг <dependencies>...</dependencies>.

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

<build>

<sourceDirectory>src/main/java</sourceDirectory>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<configuration>

<source>1.8</source>

<target>1.8</target>

</configuration>

</plugin>

<plugin>

<artifactId>maven-compiler-plugin</artifactId>

<version>3.1</version>

<configuration>

<source/>

<target/>

</configuration>

</plugin>

<plugin>

<groupId>org.codehaus.mojo</groupId>

<artifactId>exec-maven-plugin</artifactId>

<version>1.2.1</version>

<executions>

<execution>

<goals>

<goal>java</goal>

</goals>

</execution>

</executions>

<configuration>

<mainClass>com.avdeeva.neural.Test</mainClass>

</configuration>

</plugin>

</plugins>

<finalName>output.jar</finalName>

</build>

Рассмотрим пример более подробно.

<sourceDirectory> определяет, откуда maven будет брать файлы исходного кода. По умолчанию это src/main/java, но вы можете определить, где это вам удобно. Директория может быть только одна (без использования специальных плагинов)

<finalName> - имя результирующего jar (war, ear..) файла с соответствующим типу расширением, который создается на фазе package. Значение по умолчанию - artifactId-version.

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

ѕ Основные фазы сборки проекта:

ѕ Compile Компилирование проекта

ѕ Test Тестирование с помощью JUnit тестов

ѕ Package Создание .jar файла или war, ear в зависимости от типа проекта

ѕ install Копирование .jar (war , ear) в локальный репозиторий

ѕ deploy публикация файла в удаленный репозиторий

К примеру, нам нужно создать jar проекта. Чтобы его создать нужно задать команду: mvn package.

Но перед созданием jar-файла будут выполняться все предыдущие фазы compile и test, а фазы integration-test, install, deploy не выполнятся. Если набрать mvn deploy, то выполнятся все приведенные выше фазы.

Особняком стоят фазы clean и site. Они не выполняются, если специально не указаны в строке запуска.

Clean - удаление всех созданных в процессе сборки артефактов: .class, .jar и др. файлов. В простейшем случае результат - просто удаление каталога target

Site - предназначена для создания документации (javadoc+сайт описания проекта) Так как команда mvn понимает когда ему передают несколько фаз то для сборки проекта создания документации "с нуля" выполняют: mvn clean package site.

3.2 Структура и компоненты приложения

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

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

В целом диаграмма выглядит следующим образом:

Рис. 3.2 - Диаграмма классов проекта

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

3.3 Процесс разработки

Решение было выполнено в виде standalone приложения с типичной для такого типа приложения архитектурой.

Рассмотрим классы более подробнее.

Neuron - абстрактный класс для всех нейронов, имеет входные значения, значение биаса и значение подсчитанного выхода.

Пример функции для суммирования входов:

private double summation(){ double temp = 0; for(int i = 0; i < inputValues.length; i++) temp += inputValues[i]; return temp + bias; }

Рис. 3.3 - Класс Neuron

Bias Neuron - создает Bias нейрон с фиксированным значением -1.

Рис. 3.4 - Класс BiasNeuron

Cbr - класс для получения данных с сайта cbr.ru, параметрами для получения данных является

1) Дата начала обучения

2) Дата окончания тестирования

2) Код валюты

Пример кода из класса Cbr, для получения документа с значениями валют:

public static Document readFromCbr(String dateStart, String dateEnd, String ValCode) throws ParserConfigurationException, IOException, SAXException { String apiUrl = "http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1="+dateStart+"&date_req2="+dateEnd+"&VAL_NM_RQ=" + ValCode; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); return factory.newDocumentBuilder().parse(new URL(apiUrl).openStream()); }

Рис. 3.5 - Класс Cbr

ContextNeuron - создает контекстный нейрон для реализации рекурентности в RNN. Для подсчета выходного значения используется следующая формула:

public void calculateOutput(){ setOutputValue(getInputValue() + memoryContents * memoryDepth); }

Где memoryContents это значение которое храниться в памяти, а memoryDepth - глубину памяти.

Рис. 3.6 - Класс ContextNeuron

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

Рис. 3.7 - Класс ContextSynapse

DataProcessor - класс для преобразования данных, что бы значения обучающей выборки были между 0 и 1 и нахождения минимума и максимума в выборке.

Пример кода для преобразования выборки и нахождения минимума и максимума:

public double[] scale(){ double[] temp = new double [inputs.length]; minimum = inputs[0]; maximum = inputs[0]; for(int i = 0; i < inputs.length; i++){ if (inputs[i] < minimum) minimum = inputs[i]; if (inputs[i] > maximum) maximum = inputs[i]; } for(int i = 0; i < inputs.length; i++) //temp[i] = (inputs[i] - minimum) / (maximum - minimum); //:TODO Maybe wrong formula temp[i] = inputs[i] / 100.0; return temp; }

Рис. 3.8 - Класс DataProcessor

DateUtil - класс для работы с датами, он создан из-за специфики API сайта cbr.ru, так как cbr.ru как аргументы для получения значений курсов принимает даты в формате ДД/ММ/ГГГГ, а Java работает с датами в формате ДД.ММ.ГГГГ. Из-за этого при расчете временных периодов конвертировать формат cbr.ru в формат java и после расчета периодов - обратно.

Пример кода для преобразования даты из формата ДД/ММ/ГГГГ в ДД.ММ.ГГГГ:

public static DateTime parseWithSlash(String date){ String[] dateArr = date.split("/"); return new DateTime(Integer.parseInt(dateArr[2]),Integer.parseInt(dateArr[1]),Integer.parseInt(dateArr[0]),0,1); }

Рис. 3.8 - Класс DateUtil

HiddenNeuron - класс для создания скрытого нейрона.

Пример функции для расчета выходного значения с задержкой:

public void calculateDelayedOutput(){ super.calculateOutput(); for(int i = timeDelay.length - 1; i > 0; i--) timeDelay[i] = timeDelay[i-1]; timeDelay[0] = getOutputValue(); double tempOutput = 0; for(int i = 0; i < timeDelay.length; i++){ tempOutput += timeDelay[i]; } setOutputValue(tempOutput); }

Рис. 3.9 - Класс HiddenNeuron

InputNeuron - класс для создания входных нейронов.

Пример функции для расчета выходного значения с задержкой:

public void calculateDelayedOutput(){ super.calculateOutput(); for(int i = timeDelay.length - 1; i > 0; i--) timeDelay[i] = timeDelay[i-1]; timeDelay[0] = getOutputValue(); double tempOutput = 0; for(int i = 0; i < timeDelay.length; i++){ tempOutput += timeDelay[i]; } setOutputValue(tempOutput); }

Рис. 3.10 - Класс InputNeuron

Network - класс для манипулирования нейронами и их инициализации.

Пример кода для подсчета изменения скрытых весов:

protected void calculateHiddenWeightChange(){ for (int i = 0; i < inputToHidden.length; i++){ for(int j = 0; j < inputToHidden[i].length; j++){ inputToHidden[i][j].calculateWeightChange(learningRate, momentum, hiddenErrorTerm[j]); } } for (int i = 0; i < biasToHidden.length; i++){ biasToHidden[i].calculateWeightChange(learningRate, momentum, hiddenErrorTerm[i]); } }

Рис. 3.11 - Класс Network

NumUtil - класс для работы с числами, для нахождения среднего аритмического ряда, моды ряда. Сам класс создан для удаления элементов из ряда с выбросами.

Пример кода для получения моды ряда чисел:

private double getMode(double[] numberList) { HashMap<Double,Double> freqs = new HashMap<Double,Double>(); for (double d: numberList) { Double freq = freqs.get(d); freqs.put(d, (freq == null ? 1 : freq + 1)); } double mode = 0; double maxFreq = 0; for (Map.Entry<Double,Double> entry : freqs.entrySet()) { double freq = entry.getValue(); if (freq > maxFreq) { maxFreq = freq; mode = entry.getKey(); } } return mode; }

Рис. 3.12 - Класс NumUtil

OutputNeuron - класс для создания выходного нейрона.

Рис. 3.13 - Класс OutputNeuron

RNN - класс для рекурентрой нейронной сети.

Пример кода для инициализации сети:

protected void initialise(){ for(int i = 0; i < getInputNeurons().length; i++){ getInputNeuron(i).input(getInputData((getNextInput() + i + getInputData().length)%getInputData().length)); getInputNeuron(i).calculateOutput(); } getBiasHidden().calculateOutput(); getBiasOutput().calculateOutput(); for(int i = 0; i < contextNeurons.length; i++){ contextNeurons[i].calculateOutput(); } setTargetOutput(getInputData((getNextInput() + getInputNeurons().length - 1)%getInputData().length)); }

Рис. 3.14 - Класс RNN

Synapse - класс для создания синапса, в нем происходит подсчет изменения весов во время обучения, корректировка весов.

Пример кода для передачи значения со входа нейрона на выход нейрона:

public void transferValue(){ if(inputNeuron instanceof BiasNeuron){ outputNeuron.setBias(inputNeuron.getOutputValue() * weight); } else{ outputNeuron.input(inputNeuron.getOutputValue() * weight); } }

Рис. 3.15 - Класс Synapse

Test - класс с которого начинается запуск.

Пример кода для запуска сети TDNN:

public double testTDNN(){ TDNN tdnn = new TDNN(INPUT, HIDDEN, DELAY, 1, LEARNING_RATE, MOMENTUM, EPOCH, "TDNN_" + "_"); tdnn.train(trainingData); tdnn.test(testingData); tdnn.validate(validatingData); return tdnn.getvalues(); }

Рис. 3.16 - Класс Test

CurrID - класс для работы с кодами валют с сайта cbr.ru, в нем хранится коллекция типа Ключ-Значение, ключ это название валюты - типа «BYR», а значение это кодовое имя валюты, например «R01090».

Пример кода для инициализации и добавления разных валют:

public CurrID() { currencyList = new ArrayList<Currency>(); currencyList.add(new Currency("USD","R01235")); currencyList.add(new Currency("BYN","R01090")); currencyList.add(new Currency("EUR","R01239")); currencyList.add(new Currency("CNY","R01375")); //currencyList.add(new Currency("DEM","R01510")); }

Рис. 3.17 - Класс CurID

3.4 Примеры работы

Описание работы:

При запуске, программа просит ввести число, на которую будет сделан прогноз, формат вводимой даты - ДД/ММ/ГГГГ, если нажать enter, то введется текущее число. После того как пользователь введет дату и нажмет клавишу enter. Далее программа попросит выбрать валюту для прогнозирования и предупредит что рекомендуемые параметры работают только для валюты доллар и типа сети MLP. После, программа предлагает выбрать - использовать настроенные параметры или настроить параметры сети вручную. Если пользователь выберет ручную настройку - программа попросит вести такие параметры как:

· Момент

· Уровень обучения

· Задержку

· Глубину памяти

· Количество эпох обучения

· Количество входных нейронов

· Количество скрытых нейронов

После этого, программа начинает построение пределов дат для обучения, тестирования и валидации, используя эти пределы получает значения курса белорусского рубля на данные временные промежутки. Используя полученные данные начинает процесс обучения. После процесса обучения идут стадии тестирования и валидации. После этих 3х циклов идет предсказание курса на выбранный день и результат выводиться на экран в строке типа «Forecasted value equals XX.XXXXXXXXXXXX».

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

Рис. 3.18 - Скриншот работающей программы

Так же был произведен тест точности предсказаний который показал что если допустимой погрешностью разницы между предсказанным курсом и реальным курсом, равной меньше , то точность предсказания можно считать от 60 до 1000%; Было произведено 2 теста:

1) Тест нескольких дней

2) Тест нескольких расчетов на один день

Таблица 3.1 Результат теста на нескольких днях

Дата

Реальный

Предсказанный

Разница

28.05.17

56,76

56,86

-0,10

29.05.17

56,76

56,96

-0,21

30.05.17

56,71

56,95

-0,24

31.05.17

56,52

56,79

-0,27

01.06.17

56,69

56,75

-0,06

02.06.17

56,54

56,60

-0,07

03.06.17

56,69

56,65

0,04

04.06.17

56,69

56,68

0,01

05.06.17

56,69

56,72

-0,03

06.06.17

56,62

56,79

-0,17

Точность

60,00%

Таблица 3.2 Результат теста нескольких расчетов на один день

Реальный

Предсказанный

Разница

56,6876

56,6455

0,0421

56,6876

56,6577

0,0299

56,6876

56,6802

0,0074

56,6876

56,6933

-0,0057

56,6876

56,7222

-0,0346

56,6876

56,7505

-0,0629

56,6876

56,7201

-0,0325

56,6876

56,7177

-0,0301

56,6876

56,6400

0,0476

56,6876

56,7293

-0,0417

Точность

100%

Заключение

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

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

Разработаны несколько типов нейронных сетей для прогнозирования курса валют, а именно: MLP, TDNN, RNN.

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

Были реализованы основные требования:

- Приложение содержит документацию по проекту;

- Интерфейс простой - консольный

- Присутствует детальная настройка программы

- Документация по возможности сопровождается пояснениями;

- Приложение сопровождается исходным кодом

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

Размещено на Allbest.ru

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.