После рассмотрения основ машинного обучения в первой части, мы перейдем к примеру использования наивного байесовского классификатора для предсказания направления движения цены акций 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) #Создаем наш набор данных
Наконец, все готово для использования НБК:
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%, было предсказано снижение цены.
Результаты нашей модели не очень впечатляют, но целью данной статьи является предоставление информации о том, как построить собственную стратегию машинного обучения. Надеемся, что вы разработаете алгоритм с более высокими вероятностями предсказания, используя другой набор индикаторов, лучше объясняющих состояние рынка.
Очень похоже, что в обучающей выборке падающих дней больше, чем растущих. И в обоих вариантах классификатор просто поймал эту тенденцию, и на любой контрольной выборке будет показывать преобладание падения над ростом
Да, возможно и так. Все примеры обучающие и не предназначены для реального применения.