股票價格漲跌預測—基於KNN分類器
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)
## 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
summary(stocks[,-1])
## Apple Google MSFT Increase
## Min. : 90.28 Min. : 436.1 Min. :23.01 Mode :logical
## 1st Qu.:202.55 1st Qu.: 546.0 1st Qu.:27.06 FALSE:697
## Median :359.18 Median : 595.1 Median :30.68 TRUE :764
## Mean :355.49 Mean : 657.6 Mean :33.42 NA's :0
## 3rd Qu.:516.68 3rd Qu.: 694.1 3rd Qu.:40.32
## Max. :702.10 Max. :1220.2 Max. :49.61
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]) #查看預測情況
##
## prediction FALSE TRUE
## FALSE 29 32
## TRUE 192 202
mean(prediction == stocks$Increase[!stocksTrain]) #計算准確率
## [1] 0.5076923
k=1時,基於KNN分類器的蘋果股票價格預測准確率只有50.8%,略強於拋硬幣。
- 通過蒙特卡洛模擬選出最好的k值
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', col=125,lwd=3)
通過模擬可以發現,當k = 5時,模型的准確率達到了52.5%。此外,我還用BP神經網絡做了對比測試,BP神經網絡模型的預測准確率只有51.5%,可見,基於KNN分類器的股票價格預測模型既簡單又實用。
反饋與建議
- 作者:ShangFR
- 郵箱:shangfr@foxmail.com
- 參考:Teja Kodali
