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

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

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

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

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

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

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

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

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

Подход к машинному обучению можно логично разделить на два типа: обучение с учителем, то есть на размеченных данных, и обучение без учителя. В случае обучения с учителем у нас есть данные, которые разделены на области признаков объектов и ответов. X = , i=1..l. Постановка задачи обучения с учителем заключается в том, чтобы найти такой алгоритм Q(α, X) →

на котором будет достигаться минимум функционала ошибки. Тип задачи обучения с учителем заключается в ответах, которые необходимо получить. В простейшем случае пространством ответов является множество 2 элементов, например {0, 1} или {-1, 1}. В этом случае множество объектов, которые имеют один ответ, называются классом, и перед нами задача классификации.

Бинарная классификация

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

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

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

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

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

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

Кластеризация

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

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

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

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

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

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

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

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


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

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

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

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

Считывание данных

 

Данные о винах

 

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

Выделение целевого вектора и матрицы признаков

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

Признаки вин

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

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

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

Нахождение оптимального К

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

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

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

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


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

где xi1, xi2, xi3 – значения признаков i-го объекта, yi – значение целевого признака i-го объекта, ℓ -число объектов в обучающей выборке.

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


Домножим данное уравнение слева и справа на

и выразим вектор весов:

Матрица:


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

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

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

Загрузка датасета

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

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

 

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

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

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

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

Добавление вектора из единиц

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

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

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

Функция для решения нормального уравнения

 

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

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

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

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

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

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

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

где k – случайный индекс, k{1,…,ℓ}.

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

Функция градиентного шага

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

– X – матрица, соответствующая обучающей выборке; – y – вектор значений целевого признака;
– w_init – вектор начальных весов модели;
– eta – шаг градиентного спуска (по умолчанию 0.01);
– max_iter – максимальное число итераций градиентного спуска (по умолчанию 10000);
– max_weight_dist – минимальное евклидово расстояние между векторами весов на соседних итерациях градиентного спуска, при котором алгоритм прекращает работу (по умолчанию 1e-8);
– seed – число, используемое для воспроизводимости сгенерированных псевдослучайных чисел (по умолчанию 42);
– verbose – флаг печати информации (например, для отладки, по умолчанию False).

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

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

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

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

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

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

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

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

Выводы

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

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

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

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


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

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

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

Пусть w – набор из неизвестных переменных, а


– значения функции в данных точках


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


соотносятся со значениями


при этом не зная действительную зависимость


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


были максимально близки к значениям


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


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


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

Сгенерированные случайные числа

 

I

 

Xi, 10^-1

 

Yi, 10^-1

 

I

 

Xi, 10^-1

 

Yi, 10^-1

 

i

 

Xi, 10^-1

 

Yi, 10^-1

10.7471390.04124182.2161642.1115220156.4231766.2798301
20.8080720.29633592.6133012.5649689167.3069586.5155498
31.0585130.315873103.7233652.6410298177.8052587.4598499
41.2113470.327252113.959533.6557723188.0059798.6286727
51.3629100.687259124.0392415.5371714199.2610308.7890424
61.6369601.225493135.3623315.7069968209.6238299.3075027
71.6603321.457618145.9555185.7943989

 

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

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



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

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

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

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

 

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

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

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

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



целевой вектор –


Данная модель хорошо работает, когда надо спрогнозировать небольшое количество элементов ряда в будущем. Так как в каждый новый момент времени поступают новые признаки объекта t+1 временного ряда, то нам необходимо обновлять матрицу F, а также целевой вектор Y. Матрица обновляется следующим образом:



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



Учтём временной ряд с весами. Каждому историческому значению временного ряда будем ставить в соответствие коэффициент


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