2 мая 2015 QuantAlgos
В последнее время приобретают все большую популярность алгоритмы машинного обучения. Они применяются для решения задачи классификации входных данных, или, проще говоря, выявления паттернов в структуре этих данных. Небольшой цикл статей про машинное обучение опубликован на сайте inovancetech.com, здесь я представляю их перевод.
В этой серии статей мы рассмотрим построение и тестирование простой стратегии машинного обучения. В первой части отметим основные принципы машинного обучения и их применение к финансовым рынкам.
Машинное обучение становится одной из самых многообещающих областей в алгоритмической торговле за последние два года, но имеет репутацию слишком сложного математического подхода. В действительности это не столь трудно в практическом применении.
Цель машинного обучения (МО) в том, чтобы правильно смоделировать исторические данные, и затем использовать эту модель в предсказании будущего. В алгоритмической торговле применяется два типа МО:
Регрессия: используется для предсказания направления и амплитуды исследуемой величины. Например, цена акций Гугл возрастет на 7 долларов на следующий день.
Классификация: используется для предсказания категории, например, направления движения цены акций Гугл на следующий день.
Модель должна быть создана из исторических данных, используя независимые и зависимые переменные. Для моделей классификации, зависимой переменной,например, является направление движения цены на следующий день. Независимые переменные - это индикаторы, например, пересечение скользящих средних или новостные события. Модель, созданная на исторических данных, используется для предсказания будущих движений цены.
В нашем примере мы будем использовать день недели для предсказания цены акций Гугл на закрытии следующего дня ( вверх или вниз. В следующей части мы будем использовать множество индикаторов, но в данном случае, для иллюстрации основ, мы применяем лишь один - день недели).
В заглавии поста приведен график цены акций Гугл, а ниже - скриншот экспортируемых данных.
На следующем шаге надо проверить правильность выбора индикаторов и переменных для предсказания. Мы знаем, что используем день недели для предсказания движения цены на следующий день. Создадим один столбец для дней недели и второй - для цены закрытия минус цена открытия. В последней колонке отмечаем UP (вверх), если разница между ценами больше 0 и DOWN (вниз), если разница меньше 0:
В машинном обучении этот набор данных называется тренировочным, потому что алгоритм обучается на этих данных. Другими словами, алгоритм устанавливает соотношение между направлением цены и днем недели и вычисляет нелинейное соответствие. Обратите внимание, что это маленький набор данных - только 23 строки. В следующей части мы будем использовать сотни строк данных для построения модели. В общем случае, чем больше данных, тем лучше.
Затем выберем алгоритм, какой будем использовать для МО. Их существует большое количество, включая модели скрытого состояния Маркова, нейронные сети, байесовские классификаторы, деревья решений и т.п. Здесь есть хороший список моделей, где вы сможете получить подробную информацию по каждому. Мы рекомендуем использовать наиболее применяемые алгоритмы из всех, например, вектор опорных векторов или наивный байесовский классификатор. Не теряйте много времени на выбор алгоритма, наиболее важные части анализа - это используемые индикаторы и переменная, которую вы предсказываете.
Заключение 1 части.
День недели - наш индикатор, который мы собираемся использовать для предсказания направления завтрашней цены. Мы собираемся использовать исторические данные для обучения алгоритма распознованию паттерна соответствия между днем недели и направлением цены следующего дня.
В следующей части серии мы выберем алгоритм и создадим модель на языке R, следуя пошаговым инструкциям.
После рассмотрения основ машинного обучения в первой части, мы перейдем к примеру использования наивного байесовского классификатора для предсказания направления движения цены акций Apple. Сначала разберем основные принципы работы наивного байесовского классификатора, затем создадим простой пример использования дня недели для предсказания направления цены закрытия - выше или ниже текущей, а в окончании построим более сложную модель, включающую технические индикаторы.
Что представляет собой наивный байесовский классификатор (НБК)?
НБК старается найти вероятность события А при условии, что событие В уже произошло, обзначаемую как Р(А|B) (вероятность А при условии В).
В нашем случае, мы должны спросить : какова вероятность того, что цена возрастет, при условии, что сегодня - среда? НБК берет во внимание обе вероятности - общую вероятность роста цены, то есть число дней, когда цена закрытия была выше цены открытия относительно всех рассматриваемых дней, и вероятность роста цены при условии, что сегодня среда, то есть сколько прошедших сред имело цену закрытия выше цены открытия?
Тогда возможно будет сравнить вероятность роста цены с вероятностью ее падения, и выбрать большую для нашего предсказания.
Пока мы говорили только об одном индикаторе, если же их будет несколько, математические выкладки резко усложнятся. Для того, чтобы обойти это, НБК рассматривает каждый индикатор как независимый, или некореллированный с другими. Таким образом, очень важно выбирать некореллированые между собой индикаторы. На практике, в НБК не определяется некореллированость используемых индикаторов ( например , если сегодня среда и RSI выше 75, есть высокая вероятность, что на следующий день цена упадет), но модель работает относительно хорошо, даже если небольшая корреляция присутствует.
Этот очень упрощенный обзор наивного байесовского классификатора должен донести до вас основные принципы его работы. Если вы хотите получить более глубокие знания по НБК и другим алгоритмам машинного обучения - здесь хороший источник.
Пошаговый пример на языке R.
Разберем очень простой пример на R. Будем использовать день недели для предсказания, где будет цена акций Apple на закрытии дня - выше или ниже текущей.
Сначала загружаем необходимые библиотеки:
install.packages("quantmod")
library("quantmod")
#позоляют импортировать нужные данные
install.packages("lubridate")
library("lubridate")
#делают работу с датами легче
install.packages("e1071")
library("e1071")
#доступ к наивному байесовскому классификатору
Затем, получаем все нужные данные:
startDate = as.Date("2012-01-01")
# Дата начала диапазона данных
endDate = as.Date("2014-01-01")
# Дата окончания диапазона данных
getSymbols("AAPL", src = "yahoo", from = startDate, to = endDate)
# Получаем дневные бары Apple из Yahoo Finance
Сейчас мы имеем все необходимые данные, получим наш индикатор - день недели:
DayofWeek<-wday(AAPL, label=TRUE)
#Find the day of the week
Далее- то что нам нужно предсказать, закрытие дня - вверх или вниз, и создание окончательного набора данных:
PriceChange<- Cl(AAPL) - Op(AAPL)
#Находим разницу между ценой закрытия и открытия
Class<-ifelse(PriceChange>0,"UP","DOWN")
#Преобразуем в двоичную классификацию. (в нашем наборе данных нет баров с нулевым изменением цены, для упрощения, они исключены)
DataSet<-data.frame(DayofWeek,Class)
#Создаем наш набор данных
[/code]
Наконец, все готово для использования НБК:
[code]MyModel< -naiveBayes(DataSet[,1],DataSet[,2])
#Вход, или независимая переменная(DataSet,1]), и то, что мы пытаемся предсказать,зависимая переменная (DataSet[,2]).
Поздравляем! Только что мы применили алгоритм машинного обучения для анализа акций Apple. Теперь посмотрим в результаты:
На рисунке мы видим вероятность роста или снижения цены для исходного набора данных (априорная вероятность). Отметим небольшой перевес в сторону снижения цены.
Рисунок выше показывает условные вероятности ( при условии определенного дня недели, вероятность снижения или роста цены). Все они значительно меньше 50%, так как отсчитываются от априорной вероятности исхода ( вероятности роста цены для всего набора данных).
Заметно, что наша модель не очень хороша, так как мы не получили высоких значений вероятности. Тем не менее, можно отметить, что будет значительно лучше входить в длинную позицию в начале недели и в короткую - в конце.
Улучшение модели.
Очевидно, нам нужна более сложная стратегия, чем просто смотреть на день недели. Добавим пересечение скользящих средних в нашу модель ( вы можете получить больше информации о добавлении других индикаторов в модель здесь).
Автор предпочитает использование экспоненциальных скользящих средних, возьмем пересечение 5 и 10 периодных EMA.
Сначала вычислим EMA:
EMA5<-EMA(Op(AAPL),n = 5)
#Вычисляем 5-периодную EMA по ценам открытия
EMA10<-EMA(Op(AAPL),n = 10)
#Вычисляем 10-периодную EMA по ценам открытия
Вычисляем пересечение средних:
EMACross <- EMA5 - EMA10
#Положительные величины соответствуют превышению значения 5-периодной EMA над 10-периодной
Округляем величины до 2 знаков после запятой. Это важно, потому что если возникнет состояние, которое НБК еще не встречал, это автоматически приравняет вероятность к 0%. Например, если мы вычислим пересечение EMA с 6 знаками после запятой, и будет найдена высокая вероятность снижения цены при значении 2.349181, а затем возникнет точка в данных, где пересечение равно 2.349182, это приведет к 0 вероятности события роста или снижения цены. Округляя до 2 знаков, мы значительно снижаем такой риск на достаточно больших выборках. Это важное ограничение, которое нужно запомнить при построении ваших собственных моделей.
EMACross<-round(EMACross,2)
Далее создадим новый набор данных и разделим его на тренировочную и тестовую выборки, чтобы проверить, насколько хорошо модель работает на новых данных:
DataSet2<-data.frame(DayofWeek,EMACross, Class)
DataSet2<-DataSet2[-c(1:10),]
#Нам нужно исключить вхождения, где 10 периодная средняя уже вычислена
TrainingSet<-DataSet2[1:328,]
#Мы используем часть данных для тренировочной выборки
TestSet<-DataSet2[329:492,]
#и часть для тестовой выборки
И строим нашу модель:
EMACrossModel<-naiveBayes(TrainingSet[,1:2],TrainingSet[,3])
Для переменной условной вероятности пересечения EMA, вычисляется средняя величина для каждого случая ([,1]) и среднеквадратичное отклонение ([,2]). Мы можем видеть, что средняя разница между 5 периодной EMA и 10-периодной EMA для длинных и коротких сделок получилось 0.54 и -0.24 соответственно.
И тестируем на новых данных (тестовая выборка):
table(predict(EMACrossModel,TestSet),TestSet[,3],dnn=list('predicted','actual'))
Мы получаем, что в 79 из 164 случаев пересечение средних предсказывает верное направление цены, что составляет 48% от всей выборки. Из всей выборки в 95 случаях, или 58%, было предсказано снижение цены.
Результаты нашей модели не очень впечатляют, но целью данной статьи является предоставление информации о том, как построить собственную стратегию машинного обучения. Надеемся, что вы разработаете алгоритм с более высокими вероятностями предсказания, используя другой набор индикаторов, лучше объясняющих состояние рынка.
Не является индивидуальной инвестиционной рекомендацией | При копировании ссылка обязательна | Нашли ошибку - выделить и нажать Ctrl+Enter | Жалоба