1.读取数据
a=read.table("E://金科文化.csv",sep=",",header=T)
x0=a[,2:13];x0
2.数据的归一化处理(消除量纲的影响,不改变数据表达的内在规律)
#对输入矩阵进行归一化处理(0到1)
p=function(x){
return((x-min(x))/(max(x)-min(x)))}
x=as.data.frame(lapply(x0,p));x
3.检查是否转化完成
最大值是1,最小值是0,即转化完成。
summary(x$收盘价)
summary(x0$收盘价)#作比较
4.数据处理前后对比
par(mfrow=c(1,2))
plot(x0$收盘价)
plot(x$收盘价)
基本保持了原始数据的走势规律,说明归一化不改变数据要表达的原始意义。
5.选取训练集和测试集
#数据筛选(通过相关性检验取相关性强的系数,就是做降维,一般用典型相关和主成分分析)
data=x[,c(1:5,9,11)];data
train=data[1:500,];train
test=data[501:655,];test
选取收盘价为输出变量即因变量,最高价、最低价、开盘价、前收盘、成交量、总市值为输入变量即自变量
6.训练神经网络
隐节点的选取我采用:
install.packages("neuralnet")
library(neuralnet)
#训练3层7个隐藏神经元的神经网络(依次选3-13的隐神经元训练,最后选取最优的隐层神经元个数)
model7=neuralnet(收盘价~最高价+最低价+开盘价+前收盘+成交量+总市值,train,hidden=7,threshold=0.01,learningrate=0.01)
plot(model7)#绘制神经网络拓扑图
7.对测试集做预测
model7_result=compute(model7,test)
predict7=model7_result$net.result#获得预测值
cor(predict7,test$收盘价)#预测值与真实值之间的相关性
预测准确度达到99.07%
8.可视化
par(mfrow=c(1,2))
plot(test$收盘价,model_,col='red',main='Real vs predicted',pch=18,cex=0.7)
abline(0,1,lwd=2)
#交叉检验(计算平均预测误差)
library(boot)
library(plyr)
set.seed(450)
K=10
cv.error=NULL
pbar=create_progress_bar("text")
pbar$init(K)
for(i in 1:K){
train.cv=data[1:500,]
test.cv=data[501:655,]
nn=neuralnet(收盘价~最高价+最低价+开盘价+前收盘+成交量+总市值,train.cv,hidden=7,threshold=0.01,learningrate=0.01,likelihood=T)
pr.nn=compute(nn,test.cv)
pr.nn=pr.nn$net.result*(max(x0$收盘价)-min(x0$收盘价))+min(x0$收盘价)
test.cv.r=(test.cv$收盘价)*(max(x0$收盘价)-min(x0$收盘价))+min(x0$收盘价)
cv.error[i]=sum((test.cv.r-pr.nn)^2)/nrow(test.cv)
pbar$step()
}
mean(cv.error)
cv.error
boxplot(cv.error,xlab='MSE CV',col='cyan',border='blue',names='CV error (MSE)',main='CV error (MSE) for NN',horizontal=TRUE)
箱线图可以看出平均误差为0.03
9.预测
训练集的预测值与真实值对比图和预测输出与实际输出的误差图
par(mfrow=c(1,2))
plot(model7$net.result[[1]],type='l',col='red')
points(train$收盘价,col='blue',type='l')
legend("bottomright",legend=c("红色—预测值","蓝色—真实值"))
percent7=(model7$net.result[[1]]-train$收盘价)*100/train$收盘价
plot(percent7,type='l',ylim=c(-100,100),ylab="训练集误差",xlab="时间")
测试集的预测值与真实值对比图和预测输出与实际输出的误差图
par(mfrow=c(1,2))
plot(predict7,type='l',col='red')
points(test$收盘价,col='blue',type='l')
legend("bottomright",legend=c("红色—预测值","蓝色—真实值"))
percent7=(predict7-test$收盘价)*100/test$收盘价
plot(percent7,type='l',ylim=c(-200,200),ylab="测试集误差",xlab="时间")
可以看出神经网络在短期内的预测输出与实际输出之间误差较小,但在长期内的误差震荡较大,预测值输出与实际值输出之间的偏离程度非常大,因而BP神经网络在对于长期股票的预测中存在着较大的缺陷。
(利用预测值还可以做股票的涨跌趋势)
10.总结
股价的短期行为包含了非线性的映射关系,神经网络很好地解决了非线性映射关系,且具有很强的自学习能力。BP神经网络在一定程度上可以实现对短期股票收盘价较为准确的预测,但对与长期股票的预测并不理想,在实际的股票投资中,BP神经网络可以为短期的预测提供一定的借鉴,对于长期的投资预测仍有待对预测模型进一步修正。