用R語言預測股票價格漲跌—基於KNN分類器
阿新 • • 發佈:2022-05-04
K最近鄰(kNN,k-NearestNeighbor)分類演算法是資料探勘分類技術中最簡單的方法。所謂K最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。 kNN演算法的核心思想是如果一個樣本在特徵空間相鄰的樣本中的大多數屬中的k個最於某一個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。該方法在確定分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 kNN方法在類別決策時,只與極少量的相鄰樣本有關。由於kNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,kNN方法較其他方法更為適合。
kNN演算法屬於非參方法,即不需要假設資料服從某種分佈。
kNN演算法R語言實現
- 載入程式包&讀入資料
library(class)
library(dplyr)
library(lubridate)
library(scatterplot3d)
stocks <- read.csv(file.choose())
- 資料檢視
head(stocks)
summary(stocks[,-1])
cl <- stocks$Increase #已知漲跌 colors <- 3-cl scatterplot3d(stocks[,2:4],color=colors, col.axis=5, col.grid="lightblue", main="scatterplot3d - stocks", pch=20)
資料包由Date、Apple、Google、MSFT、Increase五列資料構成,Increase列表示的是蘋果股價當日的漲跌情況。 3D散點圖中,紅色表示股價上漲,綠色表示下跌。
- 資料集劃分
stocks$Date <- ymd(stocks$Date) stocksTrain <- year(stocks$Date) < 2014 predictors <- cbind(lag(stocks$Apple, default = 210.73), lag(stocks$Google, default = 619.98), lag(stocks$MSFT, default = 30.48)) colnames(predictors)=c("Apple","Google","MSFT") train <- predictors[stocksTrain, ] #2014年以前的資料為訓練資料 test <- predictors[!stocksTrain, ] #2014年以後的資料為測試資料 par(mfrow=c(3,2)) acf(stocks$Apple) #檢視自相關圖 pacf(stocks$Apple) #檢視偏相關圖 acf(stocks$Google) pacf(stocks$Google) acf(stocks$MSFT) pacf(stocks$MSFT)
- 進行KNN演算法分類
cl <- stocks$Increase[stocksTrain]
#已知漲跌
prediction <- knn(train, test, cl, k = 1)
#建立kNN預測模型
table(prediction, stocks$Increase[!stocksTrain])
#檢視預測情況
mean(prediction == stocks$Increase[!stocksTrain]) #計算準確率
## [1] 0.5076923
k=1時,基於KNN分類器的蘋果股票價格預測準確率只有50.8%,略強於拋硬幣。
- 通過蒙特卡洛模擬選出最好的k值
accuracy <- rep(0, 10)
k <- 1:10for(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', col=125,lwd=3)
通過模擬可以發現,當k = 5時,模型的準確率達到了52.5%。此外,我還用BP神經網路做了對比測試,BP神經網路模型的預測準確率只有51.5%,可見,基於KNN分類器的股票價格預測模型既簡單又實用。