В этой статье я покажу, как использовать алгоритм k ближайших соседей (kNN) для предсказания направления движения цены акций Apple. Данные я брал с Yahoo Finance. Используемый набор данных вы можете скачать здесь.
Что представляет собой алгоритм k ближайших соседей?
kNN - это непараметрический алгоритм, который может использоваться для классификации или регрессии. Непараметрический значит, что он не делает никаких допущений о природе данных или их распределении. Это один из простейших алгоритмов машинного обучения и он применяется в различных отраслях, от здравоохранения до финансов. Так как здесь мы будем использовать его для классификации, я объясню, как он работает в качестве классификатора.
Для каждой точки данных алгоритм находит k ближайших точек, и классифицирует их по близости. В качестве меры близости обычно используется евклидово расстояние между точками. Например, если k=3 и три ближайших точки принадлежат к классам A, B и A соответственно, наша точка данных будет классифицирована как принадлежащая к классу А. Если k четное, могут быть пересечения. Для того, чтобы избежать этого, точкам присваиваются веса, поэтому более близкие точки оказывают большее влияние на классификацию принадлежности выбранной точки. Например, каждой точке присваивается вес 1/d, где d - дистанция до точки данных. Если здесь все еще есть связь, класс выбирается случайно.
Построение модели
Функция knn имеется в библиотеке class. Помимо нее нам также потребуются библиотеки dplyr и lubridate. Необходимо также задать seed, чтобы быть уверенными в том, что наши результаты воспроизводимы, так как в случае связей результаты будут рандомизированы (как говорилось выше). Давайте загрузим данные и посмотрим на них.
library(class) library(dplyr) library(lubridate) set.seed(100) stocks <- read.csv('stocks.csv') Date Apple Google MSFT Increase 1 2010-01-04 214.01 626.75 30.95 TRUE 2 2010-01-05 214.38 623.99 30.96 TRUE 3 2010-01-06 210.97 608.26 30.77 FALSE 4 2010-01-07 210.58 594.10 30.45 FALSE 5 2010-01-08 211.98 602.02 30.66 TRUE 6 2010-01-11 210.11 601.11 30.27 FALSE
Здесь три три столбца представляют цены закрытия акций соответствующих компаний. Столбец "Increase" показывает, выросла или упала цена акций Apple по сравнению с предыдущим днем.
Если вы посмотрите файл помощи по функции knn с помощью команды ?knn, вы увидите, что мы должны предоставить ей тестовую выборку, обучающую выборку и вектор классификации. Для большинства прогнозных алгоритмов мы строим модель на обучающей выборке, а затем используем модель тестирования наших прогнозов. Однако функция kNN делает все это в один этап. Давайте поместим все данные до 2014 года в обучающую выборку, а остальные - в тестовую.
stocks$Date <- ymd(stocks$Date) stocksTrain <- year(stocks$Date) < 2014
Теперь нам необходимо построить обучающую выборку. Она будет состоять из цен акций Apple, Google и Microsoft за предыдущий день. Для этого мы задействуем функцию lag из пакета dplyr.
predictors <- cbind(lag(stocks$Apple, default = 210.73), lag(stocks$Google, default = 619.98), lag(stocks$MSFT, default = 30.48))
Так как для самого первого значения (соответствующего 4 января 2010 года), у функции lag нет значения для сравнения, по умолчанию оно будет равно NA. Чтобы избежать этого, я задал значения по умолчанию для каждой акции, равные их ценам на предыдущий рабочий день (31 декабря 2009 года).
Теперь давайте построим нашу прогнозную модель.
prediction <- knn(predictors[stocksTrain, ], predictors[!stocksTrain, ], stocks$Increase[stocksTrain], k = 1)
Мы можем посмотреть ее точность в таблице.
table(prediction, stocks$Increase[!stocksTrain]) prediction FALSE TRUE FALSE 29 32 TRUE 192 202
а также рассчитать точность:
mean(prediction == stocks$Increase[!stocksTrain]) [1] 0.5076923
Это только немного лучше случайного угадывания (50%). Давайте посмотрим, сможем ли мы улучшить точность, меняя значение k. Мы можем использовать для этого цикл for.
accuracy <- rep(0, 10) k <- 1:10 for(x in k){ prediction <- knn(predictors[stocksTrain, ], predictors[!stocksTrain, ], stocks$Increase[stocksTrain], k = x) accuracy[x] <- mean(prediction == stocks$Increase[!stocksTrain]) } plot(k, accuracy, type = 'b')
Мы получим следующий график:
Как мы можем видеть, модель имеет наибольшую точность ~52.5% при k = 5. Хотя это значение не кажется выдающимся, очень сложно предсказать цену акций точно. Улучшение всего на 2,5% по сравнению со случайным угадыванием может позволить заработать больше денег.
Комментариев нет:
Отправить комментарий