时间序列(arima)+支持向量机(svm)+优化=组合预测

看见大家想学习组合预测,我今晚就准备加班,给大家上一个arima+svm的组合预测,有什么不足的请指出了,时间序列是一个大类,我今天主要是给大家展示的是最常用的arima. 这里原理就不介绍了,只讲应用,你可以自己搜索网上原理或者关注我后面论文,我会专门写一个原理部分,目前也是帮别人处理的模型,根本不需要研究原理,只是给大家提供一个思路。


串联组合的原理都是这样的,前面用灰色预测或者时间序列或者回归等等,求出单预测,然后滚动残差,再把残差值与实际预测值相加的结果在拿去与目标值做比较。


先来看看组合预测原理:
这里写图片描述

如果还不清楚可以留言,我详细给你解答。接下来我们进入正题,废话已经说了那么多

载入数据

dt=read.csv(“C://Users//yelang//Desktop//matlabyewu//股票预测//数据.csv”) #读入数据


将数据转换成时间序列

airline2 <- dt[1:55,2] #选取55个来做时间序列,后面的拿来测试模型
airts <- ts(airline2,start=c(2011,2),frequency=12)
plot.ts(airts)# 转化为时间序列,以2011年2月为起点,12个月周期
`
这里写图片描述


差分及去除季节性(这个是重点)

##少一个diff,看效果就不一样

严重具有季节性,需要去除,所以要多加diff()


airdiff <- diff(diff(airts, differences=1))
plot.ts(airdiff) #这个是重点,这里的第一个diff是一阶差分,让数据更平稳;第二个diff是对数据去除周期性

这里写图片描述

现在季节性完全消失了,接下来做adf检验,


adf检验

这里写图片描述
p=0.01<0.05 通过检验

扫描二维码关注公众号,回复: 3807017 查看本文章

这里写图片描述


这个图像截尾图
这里写图片描述
这个图像拖尾图
通过上面2个图还是不好判断阶数,


自动定阶

自动定阶,很多是在原始数据上面自动确定,但是在差分以后的数据自动定阶,求解出的结果中间差分变量需要加上前面几阶差分最为最后模型的差分数


auto.arima(airdiff,trace=T)#自动定阶


这里写图片描述


轮流组合


求出最优组合的以后,预测的方式有2种
1: 在差分以及去季节化以后的数据,采用这个最优组合预测,预测结果再差分还原
2: 直接在原始数据上面,再最优组合上面,差分的地方分别加前面的差分 ;比如求解为 3,0,0加上前面一阶差分就是3,1,0
我这里选择的第二种
airarima1 <- arima(airline2,order=c(3,1,0),seasonal=list(order=c(3,1,0),period=12),method=”ML”)

airarima1

airarima2 <- arima(airline2,order=c(3,1,0),seasonal=list(order=c(1,1,0),period=12),method=”ML”)

airarima2

airarima3 <- arima(airline2,order=c(1,1,0),seasonal=list(order=c(1,1,0),period=12),method=”ML”)

airarima3


预测结果为

这里写图片描述


预测结果与实际值相减,

这里写图片描述


残差4个循环

选择4个的原因是当初模板这样的,数据量太少。合理的做法是需要循环的残差的个数按1逐步增加(例如第一次选择一个残差数据,他的下一个最为模型的输出,保留误差,第二次选择2个残差数据输入,第三个残差数据最为模型输出,依次循环递增),选择让模型误差最小的循环的残差数据的个数,
这里写图片描述


前面4列作为svm的输入,第5列作为svm的输出
前面4列作为输入,第5列作为输出


组合预测结果

这里写图片描述

参考链接

附录–详细代码

#安装包
install.packages("zoo")
install.packages("forecast")
install.packages("tseries")
install.packages("e1071")
# 载入包
library("e1071")
library("tseries")
library("zoo")
library("forecast")

dt=read.csv("C://Users//yelang//Desktop//matlabyewu//股票预测//数据.csv") #读入数据



airline2 <- dt[1:55,2] 
airts <- ts(airline2,start=c(2011,2),frequency=12)
plot.ts(airts)# 转化为时间序列,以2011年2月为起点,12个月周期




airdiff <- diff(diff(airts, differences=1))
plot.ts(airdiff) #这个是重点,这里的第一个diff是一阶差分,让数据更平稳;第二个diff是对数据去除周期性
adf.test(airdiff, alternative="stationary", k=0)  #检验序列平稳性 用过了检验才可以去测试acf and pcaf  不然。无用功。

#adf与pacf的检验,初期定阶
acf(airdiff, lag.max=20)
acf(airdiff, lag.max=20,plot=FALSE)
pacf(airdiff, lag.max=20)
pacf(airdiff, lag.max=20,plot=FALSE)

auto.arima(airdiff,trace=T)#自动定阶

#根据自动定阶的结果,选择最优的组合
airarima1 <- arima(airline2,order=c(3,1,0),seasonal=list(order=c(3,1,0),period=12),method="ML")

airarima1

airarima2 <- arima(airline2,order=c(3,1,0),seasonal=list(order=c(1,1,0),period=12),method="ML")

airarima2

airarima3 <- arima(airline2,order=c(1,1,0),seasonal=list(order=c(1,1,0),period=12),method="ML")

airarima3
airforecast <- forecast.Arima(airarima3,h=16,level=c(99.5))

airforecast

plot.forecast(airforecast)   #画预测图
ycforecast <- forecast.Arima(airarima1,h=16)  #预测后面16个

write.csv(tq[1],file="C://Users//yelang//Desktop//matlabyewu//股票预测//yc1.csv")#写出数据

sub1=dt[56:68,2]-tq[1] #残差
sub1=as.matrix(sub1)  #转换成矩阵


#4个数据循环
xindt=matrix(NA,4,length(sub1)-6)
for (i in 1: 10){

   xindt[,i]=c(sub1[i],sub1[i+1],sub1[i+2],sub1[i+3])

 }



inputData<-cbind(t(xindt[,1:9]),sub1[5:13])

set.seed(100) # for reproducing results
rowIndices <- 1 : nrow(inputData) # prepare row indices
sampleSize <- 0.8 * length(rowIndices) # training sample size
trainingRows <- sample (rowIndices, sampleSize) # random sampling
trainingData <- inputData[trainingRows, ] # training data
testData <- inputData[-trainingRows, ] # test data


----------

#这里解释下,样本太少了,莫法交叉寻优,本人亲测,样本多了,就可以寻找最优的Cost and gamma
#tuned <- tune.svm(V5 ~., data = trainingData,  type="eps-regression" , gamma = 10^(-4,-1), cost = 10^(1:2)) # tune寻优
#summary (tuned) # to select best gamma and cost  


----------


svmfit <- svm (V5 ~ ., data = trainingData, type="eps-regression" , kernel = "radial", cost = 1000, gamma=0.0001, scale = FALSE) # radial svm, scaling turned OFF
print(svmfit)
predict(svmfit, trainingData[,1:4])
compareTable <- cbind(testData[,5], predict(svmfit, testData[,1:4]))  # comparison table
View(compareTable)


yc1=predict(svmfit, t(xindt))
write.csv(yc1,file="C://Users//yelang//Desktop//matlabyewu//股票预测//yc2.csv")#写出数据


#预测后面第1个
h1=sub1[10:13,1]
h1=as.matrix(h1)
row.names(h1)<-c("V1","V2","V3","V4")
th1=predict(svmfit, t(h1))

#预测后面第二个
h2=c(sub1[11:13,1],th1)
h2=as.matrix(h2)
row.names(h2)<-c("V1","V2","V3","V4")
th2=predict(svmfit, t(h2))


#预测后面第三个数
h3=c(sub1[12:13,1],th1,th2)
h3=as.matrix(h3)
row.names(h3)<-c("V1","V2","V3","V4")
th3=predict(svmfit, t(h3))


#http://www.cnblogs.com/xuancaoyy/p/5535909.html  参考网址



猜你喜欢

转载自blog.csdn.net/u014356002/article/details/53163684