Главная > Искусственные нейронные сети. Теория и практика
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

6.8. Прогнозирование на финансовом рынке

Рассмотрим пример создания нейронной сети для финансового прогнозирования, разобрав методику использования средств пакета BrainMaker 3.1 (пример взят из статьи Блинов С. Практикум применения пакета BrainMaker для прогнозирования на финансовых рынках //http://win.aha.ru/~mdo/office/bm_fin.htm).

6.8.1. Построение нейросетевой модели

Первым этапом при разработке нейронной сети является определение того, что же она должна делать. В рассматриваемом примере целью создания нейронной сети будет являться прогнозирование изменения значения индекса цен на акции вымышленной фирмы Bart-Davis-100 (BD100).

Вторым этапом является определение состава исходных данных и сбор этих данных Предположим, что эти данные подготовлены в файле Файл представляет собой текстовую таблицу, в которой находятся упорядоченные по строкам и столбцам технические индикаторы, индексы и цены. Каждой строке соответствуют данные одного дня В столбцах: рпсе содержатся данные одного типа.

Столбец day содержит порядковый номер дня и не используется в качестве входных данных Записи сделаны за 185 дней

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

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

На третьем этапе проводится анализ и предварительная обработка данных. Это делается в программе NetMaker.

Четвертый, пятый и шестой этапы - обучение, тестирование и использование нейронной сети будут выполнены в самом BrainMaker и рассмотрены позднее.

6.8.2. Предварительный анализ и подготовка данных

Загрузка данных.

1) Запустите NetMaker

2) Выберите в главном меню опцию Read in Data File.

3) Загрузите файл

4) Перейдите в режим Manipulate Data.

Построение графика.

1) В пункте Operate главного меню выберите Graph Columns Появится окно, в заголовке которого будет запрос Select Columns То Graph

2) Щелкните мышью на столбец BD100. Обратите внимание, что теперь значение поля изменилось на BD100.

3) Выберите Make Graph.

4) Исправьте текст «Index» на «Fact».

5) Выберите Trace ranges, а затем Create Plot, В окне появится график, изображенный на рис. 6.13.

Рис. 6.13. График изменения BD100

На горизонтальной оси показано время, на вертикальной -значения BD100. Таким же образом можно построить графики pricel и price2. Значение BD100 сильно колеблется, но при этом общее движение цены (тренд) направлено вверх.

Создание столбца с изменениями цен.

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

1) В пункте «Operate» главного меню выберите Difference Columns, а в подменю - Simple.

2) В ответ на запрос Select Column выберите BD100.

3) Задайте смещение, равное 1.

4) Пометьте новый столбец BD100D. Он будет размещен в крайней правой колонке таблицы.

5) Сделайте то же самое с pricel и price2 и обозначьте новые столбцы: pricel D и price2D. Столбцы indexlD, index2D, utilD, transpD уже представлены в виде приращений.

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

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

Анализ цикличности данных.

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

1) В пункте Operate главного меню выберите Cyclic Analysis.

2) Щелкните мышкой на столбец BD100.

3) Значения количества рядов в периоде, метки осей и режим Graph Only должны быть уже заданы по умолчанию, поэтому нажмите Analyze.

4) Выберите Trace ranges, а затем Create Plot на появляющихся запросах. В окне появится график вида рис. 6.14.

Рис. 6.14. График для определения взаимосвязи между переменными

На горизонтальной оси показана частота цикла, на вертикальной его «сила». Пик с частотой 1, т. е. цикл, появившийся один раз, соответствует общему движению рынка. Нам же нужно найти наиболее короткий ярко выраженный цикл. Этому циклу соответствует другой пик с частотой 51. Для того, чтобы его разглядеть получше, нужно изменить масштаб графика:

1) В меню окна с графиком нажмите Plot, выберите Modify в подменю, а затем перейдите в режим Trace ranges.

2) Измените Plot Min и Plot Мах для Frequency на, скажем, 47 и 63.

3) После нажатия Create Plot можно разглядеть этот пик.

Найдем длину этого цикла. Общее количество дней - 185, частота - 51. Следовательно, длина цикла: 185/51 - приблизительно 4 дня.

Создание набора выходных данных для обучения.

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

1) В пункте Column главного меню выберите подпункт Shift Column Up.

2) Щелкните мышкой на столбец BD100D.

3) Укажите, что величина сдвига равна 4, а метка новой колонки -

Сглаживание данных скользящей средней.

Для уменьшения случайного шума сгладим BD100D с помощью скользящего среднего.

1) В пункте Operate главного меню выберите Moving Average, а затем Simple в появившемся подменю.

2) Щелкните мышкой на столбец BD100D.

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

Маркировка колонок.

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

Результат проделанных шагов запишите в файл price2.dat.

Анализ корреляции данных.

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

1) В пункте Operate меню войдите в Data Correlator.

2) На запрос о выборе колонок укажите indexlD и BD100.

3) Значения количества рядов в периоде, метки осей и режим Graph Only должны быть уже заданы по умолчанию, поэтому нажмите Correlate.

4) Выберите Trace ranges, а затем Create Plot на появляющихся запросах. Появится график, изображенный на рис. 6.15.

Рис. 6.15. График для выявления возможных циклов

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

На вертикальной оси представлена степень корреляции. Положительная корреляция означает, что если значения в первом столбце увеличиваются, то увеличиваются и значения во втором столбце, и, наоборот. Отрицательная корреляция означает, что если значения в первом столбце увеличиваются, то значения во втором столбце уменьшаются, и, наоборот. Степень корреляции может изменяться от -1 до 1.

Проанализируем полученный график Обратите внимание на пик, расположенный немного левее нулевого значения на горизонтальной оси Для того, чтобы его получше разглядеть увеличьте масштаб графика Временное смещение равно -1, а степень корреляции - около 0,25

Нулевой означает, что изменения значений в первом и втором столбцах происходят одновременно Отрицательный означает, что сначала происходит изменение значений в первом столбце, а затем, через промежуток времени, равный лагу, изменяются значения второго столбца Положительный означает, что сначала происходит изменение значений во втором столбце, а затем, через промежуток времени, равный лагу, изменяются значения первого столбца Таким образом, наибольший интерес представляет сильная корреляция с отрицательным лагом, при которой изменения входного параметра влекут за собой изменение прогнозируемой величины через какое-то время Следовательно, можно использовать значения mdexlD для предсказания значений BD100 на 1 день вперед

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

Добавим столбец, в котором содержатся вчерашние значения mdexlD

1) В пункте Column главного меню выберите Shift Column mdexlD

2) Щелкните мышью на столбец mdexlD

3) Укажите, что величина сдвига равна 1, а метка новой колонки -

Наводим порядок (1).

1) Удалите столбец BD100, так он больше не понадобится Для этого выделив его, укажите Column/Delete Column

2) Таким же образом удалите столбцы pricel и рпсе2

3) Пометьте столбец как Input

4) Переместите в правый крайний столбец Для этого выберите «Move Column» в разделе «Column» главного меню и укажите на запрос об выборе колонок

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

Результат проделанных шагов запишите в файл рriсеЗ dat

Представление временных рядов.

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

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

1) Выберите Repeat в разделе Operate главного меню

2) Укажите число повторений команды - 10

3) Выберите Shift Column Down в разделе Column главного меню

4) На запрос Select Column укажите

5) Величина сдвига равна 4, а метка новой колонки -

6) В последующих запросах укажите метки Вы получили десять новых столбцов с данными

Наводим порядок (2).

В десяти столбцах справа, вследствие сдвига на четыре строки вниз, первые пять строк идентичны друг другу Кроме того, ранее мы делали сдвиг на одну строку вниз в столбцах Следовательно, надо удалить первые пять строк, которые не содержат корректные данные Для этого можно воспользоваться командой Repeat или пять раз проделать

следующую операцию: выделив строку, выберите Delete Row в разделе Row главного меню и подтвердите удаление.

Для формирования был осуществлен сдвиг вверх на 4 строки. Поэтому нужно удалить четыре нижние строки.

В результате всех этих операций осталось 176 фактов из 185. То есть, на подготовке данных в нашем примере потеряно около 5% входных данных. Эти потери следует учитывать при планировании количества данных при создании нейронной сети.

Результат всех проделанных операций запишите в файл price4.dat.

Создание файлов для BrainMaker.

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

1) Выберите Shiffle Rows в разделе Row главного меню.

2) Сделайте это еще раз.

3) В разделе Label главного меню выберите All Unmarked Columns/Inputs.

4) Выберите Create BrainMaker Files в разделе File главного меню и подтвердите имена файлов, предлагаемые по умолчанию.

5) Выйдите из NetMaker. Подготовка данных завершена.

6.8.3 Обучение, тестирование и опрос нейронной сети

Обучение нейронной сети.

1) Запустите BrainMaker.

2) В пункте File главного меню выберите Read Network и загрузите файл price4.def.

3) Прогнозирование на финансовых рынках является достаточно сложной задачей. Поэтому будем считать точность прогноза 80% вполне приемлемой. В пункте Parameters главного меню выберите Training Control Flow. Измените значения Training tolerance и Testing tolerance на 0,2. Остальные параметры остаются без изменения. Нажмите Ок.

4) В пункте Operatre главного меню выберите Train Network В окне будет отображена информация вида рис. 6.16.

Горизонтальные столбики (термометры) показывают входные и выходные значения. Их использование облегчает наблюдение за быстро изменяющимися значениями. Обратите внимание, что соответствует два термометра. Out показывает значение, которое генерирует нейронная сеть, - то значение, которое должно быть предсказано (Pattern - образец).

Рис. 6.16. Окно программы

Для остановки обучения выберите Train Network еще раз.

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

Для обучения сети используется 158 фактов из 176. 10% или 18 фактов зарезервированы для тестирования при формировании файлов в NetMaker.

Первая строка с данными под главным меню (status line) показывает, что в настоящее время делает BrainMaker и какие используются файлы.

Learning Rate используется для более точной настройки обучения нейронной сети и сейчас рассматриваться не будет.

Tolerance является максимальной допустимой величиной ошибки во время обучения. Если tolerance равна 0, то это означает, что выходной результат (output) , выдаваемый нейронной сетью, должен абсолютно точно совпадать с образцом для обучения (pattern). Для подавляющего большинства случаев это нереалистичное требование, особенно для финансовых приложений, которые считаются наиболее сложными. При tolerance равной 0,1 выход нейронной сети будет рассматриваться как корректный, если он отличается не более чем на 10% от заданного значения. Если же output будет вне 10% интервала, то BrainMaker внесет изменения в структуру нейронной сети таким образом, чтобы в следующей попытке получить более корректный результат. Этот процесс будет продолжаться до тех пор, пока значение ошибки не снизится до установленного параметром tolerance предела.

В строке statistics line, следующей за status line, представлена информация о ходе обучения или тестирования сети:

Fact - порядковый номер примера из обучающей или тестирующей последовательности (номер строки в таблице с исходными данными), который обрабатывается в данное время;

Total - общее количество примеров, обработанных на данный момент;

Bad - количество примеров, для которых получен некорректный результат в текущем проходе входной последовательности;

Last - количество примеров, для которых получен некорректный результат в предыдущем проходе;

Good - количество примеров, для которых получен корректный результат в текущем проходе;

Last - количество примеров, для которых получен корректный результат в предыдущем проходе;

Run - общее количество проходов входной последовательности, включая текущий.

Наблюдать за процессом обучения нейронной сети можно, включив режим Network Progress Display в разделе Display главного меню (рис. 6.17).

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

Рис. 6.17 Динамика процесса обучения

По графику можно определить достижимый уровень ограничения ошибок нейронной сети. Например, в рассматриваемом примере этот уровень можно довести до 0,125.

Нижний график отражает динамику изменения общей ошибки нейронной сети RMS Error (Root Mean Squared) no формуле:

где О - output, P - pattern, N - количество фактов.

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

Сохраните обученную нейронную сеть в файле

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

1) В пункте Operate главного меню выберите Test Network.

2) Нейронная сеть обработает примеры и сравнит полученные результаты (output) с образцами (pattern). Ошибки будут вычислены, но корректировка структуры нейронной сети производится при этом не будет.

3) В строке statistics line отображается результат тестирования - Если осуществить настройку нейронной сети, то этот результат можно улучшить. Рассмотрим, как используется сеть для получения прогноза.

Получение результатов.

Запустите NetMaker и загрузите файл Этот файл содержит пять последних удаленных строк из исходного файла и одну строку с новыми данными. С этим файлом нужно проделать те же манипуляции, что и с за исключением создания столбца с известными будущими значениями Анализ циклов и корреляции данных делать также не нужно. После этого сохраните данный файл под именем выбрав Create Running Fact File в разделе File главного меню.

1) Войдите в BrainMaker и загрузите нейронную сеть из файла

2) Выберите Select Fact File в разделе File главного меню. Укажите Read Running Facts и прочитайте

3) Выберите Write Facts to File в разделе File главного меню. Предложенные по умолчанию значения менять не нужно, поэтому сразу ответьте Open File.

4) Измените способ отображения output с thermometers на number. Для этого войдите в подраздел Edit Network Display пункта Display главного меню.

5) Выберете опцию Run Trained Network в разделе Operate.

6) На экране в поле Out появится результат прогноза.

7) Выйдите из BrainMaker и посмотрите файл Число после графического символа является номером примера. В

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

6.8.4. Некоторые выводы

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

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

Самая трудоемкая для аналитика часть работы включает сбор и предварительную обработку данных. По некоторым оценкам это может занимать до 90% времени.

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

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

<< Предыдущий параграф Следующий параграф >>
Оглавление