рекомендации

суббота, 21 июля 2018 г.

Использование классификатора kNN для предсказания направления движения цены акций

Перевод. Оригинал здесь. 
  
В этой статье я покажу, как использовать алгоритм 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
Теперь нам необходимо построить обучающую выборку. Она будет состоять из цен акций AppleGoogle и 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% по сравнению со случайным угадыванием может позволить заработать больше денег.  

Комментариев нет:

Отправить комментарий