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

суббота, 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="" span="" stocks.csv=""> 
  
   head(stocks)         
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 <- nbsp="" span="">ymd(stocks$Date 
stocksTrain <- nbsp="" span="">year(stocks$Date< 2014 
  
Теперь нам необходимо построить обучающую выборку. Она будет состоять из цен акций AppleGoogle и Microsoft за предыдущий день. Для этого мы задействуем функцию lag из пакета dplyr. 
  
predictors <- nbsp="" span="">cbind(lag(stocks$Appledefault = 210.73), lag(stocks$Googledefault = 619.98), lag(stocks$MSFTdefault = 30.48)) 
  
Так как для самого первого значения (соответствующего 4 января 2010 года), у функции lag нет значения для сравнения, по умолчанию оно будет равно NA. Чтобы избежать этого, я задал значения по умолчанию для каждой акции, равные их ценам на предыдущий рабочий день (31 декабря 2009 года). 
  
Теперь давайте построим нашу прогнозную модель. 
  
prediction <- nbsp="" span="">knn(predictors[stocksTrain, ], predictors[!stocksTrain, ], stocks$Increase[stocksTrain], k = 1) 
  
Мы можем посмотреть ее точность в таблице. 
  
table(predictionstocks$Increase[!stocksTrain])  

prediction FALSE TRUE  
   FALSE     29 32  
   TRUE     192 202 
      
а также рассчитать точность: 
  
mean(prediction == stocks$Increase[!stocksTrain])  

[1] 0.5076923 
  
Это только немного лучше случайного угадывания (50%). Давайте посмотрим, сможем ли мы улучшить точность, меняя значение k. Мы можем использовать для этого цикл for. 
  
accuracy <- nbsp="" span="">rep(0, 10)  
> k <- 1:10=""> for(x in k){  
prediction <- nbsp="" span="">knn(predictors[stocksTrain, ], predictors[!stocksTrain, ], + stocks$Increase[stocksTrain], k = x)  
accuracy[x] <- nbsp="" span="">mean(prediction == stocks$Increase[!stocksTrain])  
+ } 
  
plot(k, accuracytype = 'b') 
  
Мы получим следующий график: 
  
 
  
Как мы можем видеть, модель имеет наибольшую точность ~52.5% при k = 5. Хотя это значение не кажется выдающимся, очень сложно предсказать цену акций точно. Улучшение всего на 2,5% по сравнению со случайным угадыванием может позволить заработать больше денег.  

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

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