Научная статья на тему 'Использование методов машинного обучения для создания биржевого робота'

Использование методов машинного обучения для создания биржевого робота Текст научной статьи по специальности «Математика»

CC BY
875
253
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
МАШИННОЕ ОБУЧЕНИЕ / MACHINE LEARNING / МАТЕМАТИКА / MATHEMATICS / ЛИНЕЙНАЯ АЛГЕБРА / LINEAR ALGEBRA / СТАТИСТИКА / STATISTICS / ВРЕМЕННЫЕ РЯДЫ / TIME SERIES / БИРЖЕВОЙ РОБОТ / TRADING ROBOT / МАТЕМАТИЧЕСКАЯ МОДЕЛЬ / MATHEMATICAL MODELS / ARMA / ARIMA / AR / MA / МЕТОД НАИМЕНЬШИХ КВАДРАТОВ / МНК / PYTHON / SCIKIT-LEARN / PANDAS / NUMPY / MEAN SQUARED ERROR / MSQ

Аннотация научной статьи по математике, автор научной работы — Бросалин Дмитрий Сергеевич

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

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по математике , автор научной работы — Бросалин Дмитрий Сергеевич

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Использование методов машинного обучения для создания биржевого робота»

ФИЗИКО-МАТЕМАТИЧЕСКИЕ НАУКИ

Using the machine learning techniques for the creation of trading robot

Brosalin D.

Использование методов машинного обучения для создания биржевого робота

Бросалин Д. С.

Бросалин Дмитрий Сергеевич /Brosalin Dmitriy — студент, факультет кибернетики и информационной безопасности, Национальный исследовательский ядерный университет, Московский инженерно-физический институт, г. Москва

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

Abstract: in that research work there are reviews on mathematical and statistical methods for predictions and online trading. Existing machine learning models for forecasting were analyzed and their accuracy was measured. There are both mathematical calculations and examples of programming code in that work.

Ключевые слова: машинное обучение, математика, линейная алгебра, статистика, временные ряды, биржевой робот, математическая модель, ARMA, ARRIMA, AR, MA, метод наименьших квадратов, МНК, python, scikitlearn, pandas, numpy.

Keywords: machine learning, mathematics, linear algebra, statistics, time series, trading robot, mathematical models, ARMA, ARIMA, AR, MA, mean squared error, MSQ, python, scikitlearn, pandas, numpy.

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

Мы привыкли пользоваться поисковиками, такими как Google или Yandex. Эти компании используют анализ данных, введенных пользователями для обучения поисковой машины. Так как просто невозможно учесть все критерии запросов пользователей и релевантные ответы к ним.

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

Виды моделей машинного обучения

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

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

Обучение с учителем

Подход к машинному обучению можно логично разделить на два типа: обучение с учителем, то есть на размеченных данных, и обучение без учителя. В случае обучения с учителем у нас есть данные, которые разделены на области признаков объектов и ответов. X = (XI,У1) 1 , 1= 1..1. Постановка задачи обучения с учителем заключается в том, чтобы найти такой алгоритм <3(а, X) —> 7П£71 д > на котором будет достигаться минимум функционала ошибки. Тип задачи обучения с учителем заключается в ответах, которые необходимо получить. В простейшем случае пространством ответов является множество 2 элементов, например {0, 1} или {-1, 1}. В этом случае множество объектов, которые имеют один ответ, называются классом, и перед нами задача классификации.

В общем случае задача классификации заключается в том, чтобы провести прямую через множества объектов таким образом, что разделяющая прямая отсекала один класс от другого. Задачи классификации бываю многоклассовыми. В этом случае множество ответов не ограничивается двумя числами, Y = {0, 1, ..., К}.

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

Рис. 1. Бинарная классификация

Рис. 2. Многоклассовая классификация

Рис. 3. Восстановление регрессии

Обучение без учителя

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

О

Рис. 4. Кластеризация

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

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

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

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

Прикладное применение машинного обучения

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

прогноза. Во второй части будет затронута тема восстановления регрессии. Будет показано, как можно спрогнозировать выручку компании в зависимости от её вложений в рекламу по телевидению, радио и газетам. Также введем понятие стохастического градиентного спуска и попробуем применить его для задачи прогноза дохода компании. В заключение сравним результаты работы обучения с помощью нормального уравнения и стохастического градиентного спуска. Инструментарий, который будет использован: Python, Ipython notebook, scipy, skleam, numpy, pandas.

Метод К ближайших соседей

Метод ближайших соседей, пожалуй, является самым простым алгоритмом в машинном обучении. Алгоритм относит поступивший объект и к тому классу, элементов которого окажется больше среди К

к

ближайших соседей X®, Í Е ... Icj : a('u. к ) = =

1=1

Алгоритм К ближайших соседей чувствителен к масштабу признаков. Так, если масштаб одного из признаков существенно превосходит масштабы остальных признаков, то их значения практически не будут влиять на ответы алгоритма. Поэтому очень важно производить масштабирование признаков. Обычно это делается путем вычитания среднего значения признака и деления результата на стандартное отклонение текущего столбца. Для обучения модели будем пользоваться кросс-валидацией, суть проста. На I-м шаге I-блок выступает в качестве тестовой выборки, объединение всех остальных блоков - в качестве обучающей выборки. Таким образом, на каждом шаге алгоритм обучается на некоторой обучающей выборке, после чего вычисляется его качество на тестовой выборке.

DATA

1 Г

TEST

TEST

TEST

TEST

Рис. 5. Кросс-валидация

После выполнение m шагов мы получаем m показателей качества, усреднение которых и дает оценку кросс-валидации. Для обучения возьмем данные, описывающие вина [1]. Набор данных представляет информацию о винах, их свойствах, таких как: крепость алкоголя, яблочная кислота, магний, количество фенолов, влаваноиды и т. д. Более подробное описание признаков можно узнать, ознакомившись с интернет ресурсом. При обучении модели нам нужно узнать оптимальное количество соседей, чтобы получить лучшее качество работы алгоритма. Загрузим датасет, посмотрим, что он из себя представляет.

dala = pd.read_csv("wÍDe.dala", header=Noce)

Рис. 6. Считывание данных

У

0 1 2 3 4 5 6 7 8 9 10 11 12 13

0 1 14 23 1.71 2 43 15.6 127 280 3 06 028 229 5 64 1 04 392 1065

1 1 1320 1.78 2 14 11.2 100 265 2 76 026 1 28 4 38 1.05 340 1050

2 1 13.16 2 36 267 186 101 280 324 0.30 281 568 1.03 3.17 1185

3 1 14 37 1 95 2 50 168 113 385 349 024 2 18 780 086 345 1480

4 1 13 24 2 59 287 21.0 118 280 269 0 39 1 82 4 32 1.04 293 735

5 1 14 20 1.76 245 15 2 112 327 3 39 0 34 1.97 6 75 1 05 285 1450

6 1 14 39 1 87 245 14 6 96 2 50 2 52 0 30 1 98 5 25 1.02 3 58 1290

7 1 1406 2.15 261 17.6 121 260 251 031 1 25 505 1 06 358 1295

8 1 14 83 1 64 2.17 14.0 97 280 298 029 1 98 520 1 08 285 1045

9 1 13 86 1.35 227 16 0 98 298 3.15 022 1 85 722 1.01 355 1045

Рис. 7. Данные о винах

Теперь выделим из данных целевой вектор, то есть вектор ответов и матрицу признаков.

Рис. 8. Выделение целевого вектора и матрицы признаков Посмотрим матрицу признаков и вектор ответов для первых 5 объектов.

1

14.23 13.20 13.16 14.37

13.24

2 3 4 5 6 7 8 9 10 11 12

1. 71 2. .43 15.6 127 2. .80 3. .06 0. 28 2. 29 5. 64 1. .04 3. .92

1. 78 2. . 14 11.2 100 2. 65 2. 76 0. 26 1. 28 4. 38 1. 05 3. 40

2. 36 2. .67 18.6 101 2. .80 3. .24 0. 30 2. 81 5. 68 1. .03 3. .17

1. 95 2. .50 16.8 113 3. 85 3. .49 0. 24 2. 18 7. 80 0. 86 3. 45

2. 59 2. .87 21.0 118 2. .80 2. .69 0. 39 1. 82 4. 32 1. .04 2. .93

13 1065 1050 1185 1480 735

Рис. 9. Признаки вин

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

kf=KFold(len(X), shuffle^Tnie, n_ftifc=5, raridom_stale=42)

scores = crossvalscoretlcnrL X; Y, cv=t£ 5согпщ='ассигасу')

print("Optima] K:" + lst_of_answers[cot] +'". with accuracy: " +

Рис. 10. Определение точности алгоритма с параметром К = 1

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

scores = cross_va]_score(kniL X_scalei V cv kf scoring='accuracy')

priDt("Optimal K: " + lst_of_answers[cut] + with accuracy: " +

Рис. 11. Нахождение оптимального К 12

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

Восстановление регрессии. нормальное уравнение

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

Модель регрессии - линейная:

а(Х,иО= (Х.ИО = ад = рОи^и^Д Линейная регрессия

использует простой функционал качества - среднеквадратичную ошибку. Мы будем работать с выборкой, содержащей 3 признака. Для настройки параметров (весов) модели решается следующая задача:

1~ + + + ^Лг))*

где хг1, хг2, хг3 - значения признаков г-го объекта, уг - значение целевого признака г-го объекта, I -число объектов в обучающей выборке.

Нахождение вектора оптимальных весов ^ может быть сделано и аналитически. Мы хотим найти такой вектор весов ж, чтобы вектор у, приближающий целевой признак, получался умножением матрицы X (состоящей из всех признаков объектов обучающей выборки, кроме целевого) на вектор весов У1>. То есть, чтобы выполнялось матричное уравнение:

Домножим данное уравнение слева и справа на X ^ и выразим вектор весов:

иг - {ХтХТ*Хту

Матрица: X? ~ называется псевдообратной для матрицы X. Нахождение

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

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

Загрузим датасет:

Рис. 12. Загрузка датасета

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

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

ТУ ИвсНо №жзрарег 5а1ез

1 230.1 37.8 69.2 22.1

2 44.5 39.3 45.1 10.4

3 17.2 45.9 69.3 9.3

4 151.5 41.3 58.5 18.5

5 180.8 10.8 58.4 12.9

Рис. 13. Первые пять значений датасета

Рис. 14. Попарные зависимости данных

Отмасштабируем матрицу признаков объектов, вычтя из признака значение среднего, и результат поделим на стандартное отклонение:

ХНШ =(ХНШ - means[fD / stdsQ]

Рис. 15. Масштабирование матрицы признаков

Добавим к матрице X столбец из единиц, используя методы hstack, ones и reshape библиотеки NumPy. Вектор из единиц нужен для того, чтобы не обрабатывать отдельно коэффициент w0 линейной регрессии.

import пишру as Dp а = np.oDes{X.5bape[0]) а = a_resbape(a. size, 1) X = Dp.hstack((X: а»

Рис. 16. Добавление вектора из единиц

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

def шзеггог(у: y_pred):

return пр.шеаи((у - y_pred)**2)

Рис. 17. Объявление функций среднеквадратической ошибки и прогнозирования линейной модели Основной функцией для прогноза будет являться функция, которая решает нормальное уравнение:

def noraia]_equatioD(X: у)с

part_pjnv = np.lina]g.piiw(X)

Рис. 18. Функция для решения нормального уравнения 15

по1ш_ес]_луе1§1й5 = lюrшa]_equaiюll(X: у) [ 3.91925365 2.79206274 -0.02253861 14.0225 ]

Рис. 19. Значение вектора весов

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

ргмИсйопБ = Кееаг_рге<1к: 1 юп(X: погш_еч_\уе1§ЫБ)

Рис. 20. Среднеквадратичная ошибка для линейной модели

Восстановление регрессии. Стохастический градиентный спуск

Параметры w0,w1,w2,w3, по которым минимизируется среднеквадратичная ошибка, можно находить численно с помощью градиентного спуска. Градиентный шаг для весов будет выглядеть следующим образом:

2 ~ +щха+щ*12+w3*3i)) 'j ^ij2j3i

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

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

WjO ^ w40 + 2{/I (y4i — (WjO + Wjl xjil + Wj2 xji2 + WХ^СЗ ) )

WJ "WJ + xjij (yti - (WlI> + W^x^kl +Wl2Xik2 + Wl3Xlk3)) , je {1,2, 3},

где k - случайный индекс, ke {1,.. .,£}.

Напишем функцию stochastic_gradient_step, реализующую шаг стохастического градиентного спуска для линейной регрессии. Функция должна принимать матрицу X, векторы y и w, число train_ind - индекс объекта обучающей выборки (строки матрицы X), по которому считается изменение весов, а также число ц (eta) - шаг градиентного спуска (по умолчанию eta = 0.01). Результатом будет вектор обновленных весов. Наша реализация функции будет явно написана для данных с 3 признаками:

def stochastic_gradieiit_step(XI у. w, traininc! eta=0.01):

gradO = X[traiDjDd|[0]*(y[trajD ind] - (w[3] + w[0]*X[teak_ind|p)] +

gradl = X[traiojDtfl[l]*(y[train ind] - <w[3] + w[0]*X[traiD_jDd|[0] +

grad2 = X[traioiDd][2]*(y[ trainind] - <w[3] + w[0]*X[traiijDd|[0] +

return w + (2 * eta / X.siiape[0]) * Dp.array([gradCL gradl: grad2: grad3])

Рис. 21. Функция градиентного шага

Создадим функцию stochastic_gradient_descent, реализующую стохастический градиентный спуск для линейной регрессии. Функция принимает на вход следующие аргументы:

- X - матрица, соответствующая обучающей выборке;

- y - вектор значений целевого признака;

- w_init - вектор начальных весов модели;

- eta - шаг градиентного спуска (по умолчанию 0.01);

- max_iter - максимальное число итераций градиентного спуска (по умолчанию 10000);

- max_weight_dist - минимальное евклидово расстояние между векторами весов на соседних итерациях градиентного спуска, при котором алгоритм прекращает работу (по умолчанию 1e-8);

- seed - число, используемое для воспроизводимости сгенерированных псевдослучайных чисел (по умолчанию 42);

- verbose - флаг печати информации (например, для отладки, по умолчанию False).

На каждой итерации в вектор (список) должно записываться текущее значение среднеквадратичной ошибки. Функция должна возвращать вектор весов w а также вектор (список) ошибок.

def stochastic_gradient_descent(X, y, w init, eta=le-2, max_iter=le4,

while weightdist > minweightdist and iter nuim < max iter: random_ind = np.rardom.rardirt(X.shape[0]) w ciir = stochastic_gradient_step(X, y, w, randomind, eta=le-2)

Рис. 22. Реализация градиентного спуска

Запустим 10л5 итераций стохастического градиентного спуска. Укажем вектор начальных весов w_imt, состоящий из нулей. Зададим параметры eta и seed равными их значениям по умолчанию (eta = 0.01, seed = 42). Проделаем это для того, чтобы понять, как меняется функционал ошибки в зависимости от итерации, в идеальном случае, если все реализовано корректно, должны увидеть сходимость.

250 200 150

ш <л

1D0 50 О

О 1DOOO20000 300004000050000 60000 700008000090000 Iteration number

Рис. 23. Зависимость среднеквадратической ошибки от количества итераций

Посмотрим вектор весов, к которому сошелся метод:

prÍDt(stocb_grad_de scwei gbts)

[ 3.91069256^00 2.78209808^00 -8.10462217е-03 1.40190566^01 ]

Оценим среднеквадратичную оценку прогноза:

51осЬ §га(1{1г5с \уе]§Ь1а: 51осЬ_епог5_Ьу_йех = 51осЬа51к;^га<11еп1_{1ек:еп1(Х. у, тшп и/р^Ы гН 1 е-8: 5ее<1=42: лгегЬоБе=Ра1зе)

Рис. 25. Среднеквадратическая ошибка при использовании стохастического градиентного спуска

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

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

Временные ряды. Основные понятия

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

таких как прогнозирование цен на акции или в медицине для анализа ЭКГ. Вектор функции

все компоненты Xi(t), i = 1 .. г которых действительны, а t принимает значение 0, 1, 2,... Такую совокупность функций называют r-компонентным векторным временным рядом [3]. Переменная t, как правило, соответствует времени выполнения или наблюдения измерений. Среди временных рядов выделяются стационарные и нестационарные ряды. Ряд Y(t) называется стационарным, если закон распределения вероятностей случайной величины Y(t) не зависит от t.

В данной работе будет применено прогнозирование временного ряда. Другими словами, будет построена модель для предсказания будущих событий, основываясь на исторически известные данные. В качестве модели будет использована модель смешанного авто регрессионного скользящего среднего (ARIMA, Auto Regression Integrated Moving Average). С помощью данной модели можно описывать как стационарные, так и не стационарные временные ряды. Разница между стационарным и нестационарным временным рядом заключается в том, что случае стационарного временного ряда данные колеблются относительно некоторого фиксированного уровня, а в не стационарных временных рядах такого фиксированного уровня нет.

Рис. 24. Вектор весов, полученный после градиентного спуска

Выводы

Метод наименьших квадратов

Пусть \у - набор из неизвестных переменных, а ]Л* - значения функции в данных точках и7£ ■

IV;

которую нам необходимо найти, предсказать. То есть понять, как значения ряда " I соотносятся со

значениями УГ , при этом не зная действительную зависимость ^ . Задача метода наименьших

квадратов заключается в подборе таких значений \у, чтобы значения функций бьши

V.

максимально близки к значениям 1 1 . По существу, это задача решения неопределенной системы уравнений ^(М?) = . Нам необходимо найти максимальную близость левой части уравнения к

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

квадратов отклонений левых и правых частей уравнений.

Qtw=Yi<y:-yiY

t=to

Пусть на вход системы поступили два вектора Х и У. Связь между ними нам неизвестна. Давайте найдем эту связь, а также аппроксимируем пришедшую на вход зависимость У(Х) методом наименьших квадратов. Для этого будем использовать язык Python, а также библиотеки, необходимые для анализа данных: numpy, scipy, matplotlib. Продемонстрируем пришедшие на вход системы данные.

Таблица 1. Сгенерированные случайные числа

I XI, 10Л-1 Yi, 10л-1 I Xi, 10Л-1 Yi, 10Л-1 i Xi, 10Л-1 Yi, 10Л-1

1 0.747139 0.041241 8 2.216164 2.1115220 15 6.423176 6.2798301

2 0.808072 0.296335 9 2.613301 2.5649689 16 7.306958 6.5155498

3 1.058513 0.315873 10 3.723365 2.6410298 17 7.805258 7.4598499

4 1.211347 0.327252 11 3.95953 3.6557723 18 8.005979 8.6286727

5 1.362910 0.687259 12 4.039241 5.5371714 19 9.261030 8.7890424

6 1.636960 1.225493 13 5.362331 5.7069968 20 9.623829 9.3075027

7 1.660332 1.457618 14 5.955518 5.7943989

О 2 4 6 8 10

Рис. 26. Оценка линейной, экспоненциальной и квадратичной аппроксимации исходной зависимости

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

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

gkx = у ; или, другими словами, нахождение максимальной близости между правой и левой частью уравнений. Также предположим, что функционал ошибки можно минимизировать, попробовав аппроксимировать исходную зависимость линейной и квадратичной (параболической) функциями. Изучая библиотеку scipy языка Python, обнаружили модуль, способный помочь при использовании метода наименьших квадратов.

return koefí[ 1 ] * ехр(коеЩ0] * х) +кое£Е[2]

return [у - fitfîkoeff. х): у - ñf_2(koeff= х): у - ñf_3(koeff= х)]

Рис. 27. Реализация функций для экспоненциальной, линейной и квадратичной аппроксимации

Здесь мы объявили функцию, которая, по нашему соображению, может аппроксимировать распределение, поступившее на вход системы. Функция residuals (koeff, x, y), принимает на вход данные по осям х и у, полученные в ходе аппроксимации, соответственно, и возвращает разности между аппроксимируемыми значениями и значениями У, полученными на входе системы. Данные функции было необходимо ввести, чтобы использовать МНК (метод наименьших квадратов). Найдем вид аппроксимирующих функций, а затем построим их.

valx = optimize. leastsq(residuaJs: k[:]. arg={x:y): fuDoutput = True)[0] vaNin = optimize.leastsqfresiduaJs: k[:]. arg=(x:y): fuD output = True)[0] val_sq = optimize, least5q(residuals: k[:]. arg=(x:y): fuD output = Tiue)[0]

fineexp = ph.plot(y. ñf(vaJ_x[:]: x): тЛ:\ labeJ='exp dependence') Knelin = plt.plot(y: fitf_2(vaJ_]in[:]: x), 'go:1; label=']ineai dependence') Knesq = ph.plot(y. fitf_3(vaJ_sq[:]. x). 'mE:'. labeJ='squted dependence1)

Рис. 28. Построение полученных аппроксимирующих значений

Анализируя полученные результаты, вполне обоснованно можно сказать, что, сделав предположение о том, что экспоненциальная зависимость хорошо аппроксимирует входящее распределение и, применив МНК, мы оказались правы.

Модель авторегрессии

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

Пусть мы имеем 1 = 1:-п+1 моментов в истории ряда. Тогда опишем объекты временного ряда с помощью матрицы значений и вектора решений. Объекты - моменты времени, наблюдения, р ^ =

У1+1

Уt - Ус-и+

(Уь

,

Уь

целевой вектор - л . Данная модель хорошо работает, когда надо

Уи+1

спрогнозировать небольшое количество элементов ряда в будущем. Так как в каждый новый момент времени поступают новые признаки объекта И-1 временного ряда, то нам необходимо обновлять матрицу Р, а также целевой вектор У Матрица обновляется следующим образом: Ш = (рТ * Р)Л-1 *

Ру . В этом случае полученный функционал квадрата ошибки представляет следующую запись: Q t £+1

х (У^сю-УО1 и„

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

представим в форме:

Уг-су

1 = 0

где c =

.

Положим

0

(0,1).

Продифференцировав

^-^(Уг-сУ

1=0

к 0 и выразив с, получим аналитическое решение:

по переменной с и приравняв полученное выражение

с =

=

Полученное

выражение формула Надарая-Ватсона [4]. Определение константы с будет происходить по ее

Ы

г . Чем дальше объект с индексом 1 будет

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

прогрессией, знаменатель которой I

Времени на вычисление формулы

понадобиться 0(1), ! -£

количество элементов временного ряда. При бесконечном (достаточно большом) ряде

1=1

Записав выражение У£+1=——^-д. ^ ^ для Ус, а после выразив У1+1 через Уь.

получим: У£+1= Уь ) + * $ . Сделав

+ у"^ * ^ . Сделав замену 1 = а, получим Уь+л = Уь + а(

УЬ ~ Уt) = а*Уь + (1 - a)*Уt. Распишем смысл проделанной работы. Прогноз в следующий момент времени представляется возможным вычислить как линейную комбинацию с коэффициентами

, 1-^? прогноза в прошлый момент времени и значения, которое наблюдаем в текущий момент

е

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

историю ряда будем уходить, тем меньше У £ , которые мы учитываем.

Рассмотрим, что будет происходить при выборе а. Если будем брать а малую, стремящуюся к 0, то будет происходить усреднение временного ряда, если большую, стремящуюся к 1, то будет учитываться больше вес последних данных, а исторические данные практически не будут вносить изменений. Формула + «(У£ — У£ ) называется экспоненциальное скользящее средние

(ЭСС). ЭСС подходит для прогнозирования как стационарных рядов, так и не для стационарных.

Рассмотрим на примере работу ЭСС. Для этого воспользуемся языком программирования Python и библиотеками для анализа данных Pandas, numpy и matplotlib. Подадим на вход системы случайно сгенерированные числа и даты от 1 марта и до 20 включительно: x = np.random.rand (20)*10;

y = pd.date_range ('2016-3-1', '2016-3-20', freq='D').

Сопоставим временному ряду, случайно полученный вектор значений:

row = pd.Series (x, y).

Теперь запустим экспоненциальное скользящее среднее для полученного временного ряда с разными а =(0.1, 0.5, 0.9): = pd.ewmaíOíj ).

Рис. 29. Экспоненциальное скользящее среднее, а = 0.1

Рис. 30. Экспоненциальное скользящее среднее, а = 0.5 23

8

N

7

6

5

4

3

2

1

♦ 1пИ:а1 Оа1а ♦ ♦ ЕМА, 0.9

0,

О

5

10

15

20

Рис. 31. Экспоненциальное скользящее среднее, а = 0.9

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

Модель прогнозирования апша (р, д, и)

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

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

Рассмотрим стратегию Бокса-Дженкинса [3]:

Рис. 32. Стратегия Бокса-Дженкинса Из чего состоит arima (p, q, d)

Напомню, что авторегрессинная модель n-го порядка выглядит следующим образом [3]:

Перед нами формула, позволяющая значение временного ряда в момент времени t выразить как

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

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

Таблица 2. Прогнозирование временного ряда с использованием авторегрессионной модели

Т -

Период Значение Yt Прогнозы YtA Остатки

t-5 90 76.4 13.6

t-4 78 67.5 10.5

t-3 87 74 13

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

t-2 99 69.1 29.9

t-1 72 62.7 9.3

t 77.2

Взяв модель AR(2), что означает прогнозирование временного ряда, исходя из последних двух элементов ряда. Использовав метод наименьших квадратов, нашли следующие коэффициенты:

С¿р11^ ¿Р=- 0.535 (АУ=ОООЙЬ

чг* , Т1 Т'а . Работая с методом наименьших квадратов, мы

минимизировали функционал ошибки, изменяя коэффициенты. Затем выбрали те коэффициенты, которые показывали на обучающей выборке минимальную ошибку. Теперь, подставляя коэффициенты в уравнение авторегрессии, получим значение Y = 77.2.

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

Напомню про скользящее среднее. Модель со скользящим средним описывается следующим уравнением [3]:

ц - постоянное среднее процесса;

"" Ц _ ошибки в предыдущие моменты времени;

я£ ЯЧ - оцениваемые коэффициенты.

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

Таблица 3. Прогнозирование временного ряда с использованием модели скользящего среднего

Период Значение Yt Прогнозы YtA Остатки

t-5 90 76.1 13.9

t-4 78 69.1 8.9

t-3 87 75.3 11.7

t-2 99 72 27

t-1 72 64.3 7.7

t 77.2

Спрогнозируем новое значение ряда, применяя МА (2). Проделаем ту же процедуру, что было

□=7Й-* □=0.5667

описано с авторегрессией. Получили следующие коэффициенты: ^п ,

WA

77.2.

- О.ЗБбо

Теперь, подставляя коэффициенты в уравнение скользящего среднего, получим значение У =

Теперь поставим задачу совместить авторегрессию и скользящее среднее. Получится модель ARMA (р, q), р и q - параметры AR и MA соответственно [3].

Yt= ф0+ ФIyt_l + + ■■ ■ + фрУ^р + Et - W1Et_1 - WjEt.,-----фчEt_

-p 1 ьг — "l't-i г ч Г—q

Анализируя полученную формулу, делаем вывод, что ARMA (p, q) делает прогноз, который зависит от предыдущих и текущих значений Y, а также зависит от предыдущих и текущих величин ошибки е.

Итак, опишем, что такое модель ARIMA (p,q,d). Предположим, что мы имеем какой-то ряд. Возьмем последние разности этого ряда [3]:

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

Пример для разности второго порядка [3]:

Значение d в модели ARIMA (p, q, d) показывает порядок вычета.

Архитектура приложения

В разработанном приложении использовались языки программирования Java и Python. Java выступил в роли сервера, который посылает запросы на сервер биржи по протоколу HTTPS. Полученные данные от сервера биржи сохраняет в таблицу Stocks в СУБД MySQL. Также сервер Java поддерживает связь с клиентским модулем, написанным на Python, через протокол TCP/IP. Роль клиентского модуля на Python - анализ данных и прогнозирование финансового временного ряда. После расчета прогноза, принятия решения о покупке или продаже модуль python отправляет сообщение по протоколу TCP/IP серверу Java о действии, которое необходимо совершить: купить, продать, ничего не делать.

Структура таблиц базы данных

В данной работе, в СУБД было организовано только две таблицы: STOCKS и REPORT. Таблица STOCKS служит для сохранения текущих значений валютных пар, полученных сервером Java. К этой таблице также обращается клиент Python для формирования обучающей выборки. Столбцы таблицы STOCKS:

STOCK_ID - первичный ключ таблицы типа INTEGER.

BID - цена покупки акции, тип - FLOAT.

ASKID - цена покупки акции, тип - FLOAT.

TIME - актуальное время для свойств акции - TIMESTAMP.

NAME - название акции.

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

Схема приложения

Рис. 33. Схема приложения Описание технологий приложения

На стороне Python были задействованы библиотеки для анализа данных, машинного обучения и статистики. Библиотека Numpy - позволяет генерировать многомерные матрицы, вектора, a также эффективно их обрабатывать. Библиотека SciPy - дала возможность эффективно считать произведения матриц, находить среднеквадратичную ошибку, средние значения, вычислять первообратную матрицы, а также решать матричные уравнения. Библиотека Statmodels - предоставила возможность работать с

ARIMA, вычислять адекватные коэффициенты для выбранной модели. Библиотека Pandas - позволила обрабатывать датасеты, загруженные из СУБД, и преобразовывать их во временные ряды.

Измерение точности работы биржевого роботота

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

- Была взята выборка действительных значений валютных пар.

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

- Стандартное отклонение было отложено в большую и меньшую стороны относительно действительных значений.

Использованная формула, по которой строился доверительный интервал: X +- 1.96*SEM, где X -

действительное значение курса, SEM - стандартная ошибка среднего. SEM = S S - стандартное

отклонение, n - количество наблюдений. В данной формуле попадание спрогнозированной величины в интервал означает, что полученное значение находится в 95 % доверительном интервале.

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

1) Серверный модуль [7]

2) Аналитический модуль [8].

from MySQLdbComiectioii.CoimectionHandler import DataHandler

realdataseries = pd.TimeSeries(real_data_lst, index=time_lst) predicteddataseries = pd.TimeSeries(predicted_data_lst,

Рис. 34.1. Первая часть кода, отвечающего за оценку работы робота

data = DataHandlerf'localbost", "Dimas", "Dimas", "Forex") s = data.GetReportForResearchO realdata, predicted_data, time_ser = Parser(s) realdata = np.array(real_data) predicted_data = np.array(predicted_data) deviation = np.std(real_data) / np.sqrt(len(real_data)) real_data_plus = real_data + 1.96*deviation real_data_minus = real_data - 1.96*deviation

plt.plot_date(x=time_ser, y=real_data, fmt="b-", label="Real Data", linewidth-2.0)

plt.plot_date(x=time_ser, y=real_data_plus, fmt="r--", label="Trustee Interval")

plt.plot date(x=time ser, y=real data minus, fmt^"r—")

plt.plot_date(x=time_ser, y=predicted_data, fin1^"kD:", label="Predicted Data", linewidth=2.0)

plt.legend(loc-best')

plt.showO

Рис. 34.2. Вторая часть кода, отвечающего за оценку работы робота

Рис. 35. Оценка точности работы робота Литература

1. UC Irvine Machine Learning Repository. [Электронный ресурс]. Режим доступа: https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data (дата обращения: 20.05.2016).

2. An Introduction to Statistical Learning. [Электронный ресурс]. Режим доступа: http://www-bcf.usc.edu/~gareth/ISL/data.html (дата обращения: 17.05.2016).

3. БриллинджерД. Временные ряды. Обработка данных и теория. М.: Мир, 1980. 532 с.

4. Андерсон Т. Статистический анализ временных рядов. М.: Мир, 1976. 744 с.

5. Швагер Джек. Технический анализ. Полный курс. М.: Альпина Паблишер, 2001. 768 с.

6. Флах П. Машинное обучение. Наука и искусство построения алгоритмов, которые извлекают знания из данных / пер. с англ. А. А. Слинкина. М.: ДМК Пресс, 2015. 400 с.

7. GitHub repositories. [Электронный ресурс]. Режим доступа: https://github.com/DimasBro0110/Stocs (дата обращения: 8.06.2016).

8. GitHub repositories [Электронный ресурс]. Режим доступа: https://github.com/DimasBro0110/ForexAnalysis. (дата обращения: 8.06.2016).

i Надоели баннеры? Вы всегда можете отключить рекламу.