原创R语言股票时间序列分析报告代码.docx
《原创R语言股票时间序列分析报告代码.docx》由会员分享,可在线阅读,更多相关《原创R语言股票时间序列分析报告代码.docx(25页珍藏版)》请在冰豆网上搜索。
原创R语言股票时间序列分析报告代码
library(quantmod)
#library(neuralnet)
library(quantmod)
library(plyr)
library(TTR)
library(ggplot2)
library(scales)
library(tseries)
data=read.csv("600119.csv")
a=data$收盘价
a=diff(a)/a[-length(a)]
a[a=="NaN"]=0
a[a=="Inf"]=0
##浏览数据
data[,2]=data$日期
data[,4]=c(0,a)
##绘制时间序列图
##收集历史资料,加以整理,编成时间序列,并根据时间序列绘成统计图。
时间序列分析通常是把各种可能发生作用的因素进行分类,传统的分类方法是按各种因素的特点或影响效果分为四大类:
(1)长期趋势;
(2)季节变动;(3)循环变动;(4)不规则变动。
data=data[nrow(data):
1,]
plot(data[,2],data[,4])
##技术指标
lines(data[,2],DEMA(data[,4]),col="green")
lines(data[,2],SMA(data[,4]),col="red")
legend("bottomright",col=c("green","red"),legend=c("DEMA","SMA"),lty=1,pch=1)
##从时间序列图形来看,序列有明显趋势,所以该序列一定不是平稳序列。
因为原序列为非平稳序列,所以选择一阶差分继续分析
birthstimeseries=data[,4]
birthstimeseries<-ts(birthstimeseries,frequency=300,start=c(1998,15))
birthstimeseries=na.omit(birthstimeseries)
##2)Decomposethetimeseriesdataintotrend,seasonalityanderrorcomponents.(10points)
##开始分解季节性时间序列。
##一个季节性时间序列中会包含三部分,趋势部分、季节性部分和无规则部分。
分解时间序列就是要把时间序列分解成这三部分,然后进行估计。
##对于可以使用相加模型进行描述的时间序列中的趋势部分和季节性部分,我们可以使用R中的“decompose()”函数来估计。
这个函数可以估计出时间序列中趋势的、季节性的和不规则的部分,而此时间序列须是可以用相加模型描述的。
##“decompose()”这个函数返回的结果是一个列表对象,里面包含了估计出的季节性部分,趋势部分和不规则部分,他们分别对应的列表对象元素名为“seasonal”、“trend”、和“random”。
birthcomponents<-decompose(birthstimeseries)
plot(birthcomponents)
##要剔除某个趋势时(我们就去掉季节因素),我们可以运用减法去掉该因素,下图就是去掉季节性因素后的修正序列。
birthstimeseriesseasonallyadjusted<-birthstimeseries-birthcomponents$seasonal
plot(birthstimeseriesseasonallyadjusted)
acf(birthstimeseriesseasonallyadjusted)
##看图中的横轴lag表示滞后阶数,纵轴表示对应各阶的相关系数,0阶滞后表示对自己的自相关系数,所以一般对应的相关系数值为1,再看图中上下的蓝色虚线内为95%置信区间,若lag>0对应的相关系数均在该区间内则表示该变量自相性问题不严重
pacf(birthstimeseriesseasonallyadjusted)
##看图中的横轴lag表示滞后阶数,纵轴表示对应各阶的相关系数,0阶滞后表示对自己的自相关系数,所以一般对应的相关系数值为1,再看图中上下的蓝色虚线内为95%置信区间,若lag>0对应的相关系数均在该区间内则表示该变量自相性问题不严重
datad=diff(birthstimeseriesseasonallyadjusted)
##3)UseHolt’sexponentialsmoothingtomakeshort-termforecasts.
##指数平滑法(ExponentialSmoothing,ES)是布朗(RobertG..Brown)所提出,布朗认为时间序列的态势具有稳定性或规则性,所以时间序列可被合理地顺势推延;他认为最近的过去态势,在某种程度上会持续到未来,所以将较大的权数放在最近的资料。
##指数平滑法是生产预测中常用的一种方法。
也用于中短期经济发展趋势预测,所有预测方法中,指数
##一次指数平滑法
##平滑是用得最多的一种。
简单的全期平均法是对时间数列的过去数据一个不漏地全部加以同等利用;移动平均法则不考虑较远期的数据,并在加权移动平均法中给予近期资料更大的权重;而指数平滑法则兼容了全期平均和移动平均所长,不舍弃过去的数据,但是仅给予逐渐减弱的影响程度,即随着数据的远离,赋予逐渐收敛为零的权数。
##也就是说指数平滑法是在移动平均法基础上发展起来的一种时间序列分析预测法,它是通过计算指数平滑值,配合一定的时间序列预测模型对现象的未来进行预测。
其原理是任一期的指数平滑值都是本期实际观察值与前一期指数平滑值的加权平均。
##简单指数平滑法。
简单指数平滑适用于可用相加模型描述,并且处于恒定水平和没有季节变动的时间序列地短期预测。
##简单指数平滑法提供了一种方法估计当前时间点上的水平。
为了更加准确的估计当前时间的水平,我们使用alpha参数来控制平滑,alpha的取值在0-1之间。
当alpha越接近0,临近预测的观测值在预测中的权重就越小。
plot(datad)
##从该图中可以看出整个曲线处于大致不变的水平,且随机变动在整个时间序列范围内也可以认为是大致不变的,所以该序列可以大致被描述为一个相加模型,因此我们可以使用简单指数平滑法进行预测。
我们采用R中的HoltWinters()函数,为了能够使用HoltWinters中的指数平滑,我们需要进行参数设置:
beta=FALSE和gamma=FALSE,预测结果如下图:
##此外我们可以画出预测值和实际值,看看预测效果:
hm=HoltWinters(datad,beta=F,gamma=F)
hm
##Holt-Wintersexponentialsmoothingwithouttrendandwithoutseasonalcomponent.
##
##Call:
##HoltWinters(x=datad,beta=F,gamma=F)
##
##Smoothingparameters:
##alpha:
0.0009575354
##beta:
FALSE
##gamma:
FALSE
##
##Coefficients:
##[,1]
##a-0.0001333355
cat("HoltWinters()告诉我们alpha参数的估计值约为",hm$alpha,",非常接近0,说明该序列比较平稳,默认情况下HoltWInters仅会给出原始时间序列所覆盖时期内的预测,预测值存在房子名为为fitted的变量中,我们可以通过rainseriesforecasts$fitted来获取这些值。
"
)
##HoltWinters()告诉我们alpha参数的估计值约为0.0009575354,非常接近0,说明该序列比较平稳,默认情况下HoltWInters仅会给出原始时间序列所覆盖时期内的预测,预测值存在房子名为为fitted的变量中,我们可以通过rainseriesforecasts$fitted来获取这些值。
plot(hm)
##从之前的alpha和上图,可见我们预测的过于平滑,R提供了样本预测误差平方和(SSE)来衡量预测效果。
可以通过rainseriesforecasts$SSE来获取该值。
hm$SSE
##[1]91.00893
##4)FitthedatawithappropriateARIMAModels.
z=datad
##然后我们绘制自相关图和偏自相关图对序列进行进一步的检测
acf(z)
##从上面的图中我们可以发现自相关系数在滞后一期之后,很快录入到置信区间之内,因此可以认为该序列平稳
pacf(z)
##从偏相关系数的置信区间来看,由于相关系数都在置信区间之内,因此可以认为该序列平稳
##Predictivemodel:
ARIMAmodelspredict
##然后检测序列的平稳性和独立性,这里我们使用的是Box-Ljungtest
Box.test(z,lag=10,type="Ljung")
##
##Box-Ljungtest
##
##data:
z
##X-squared=1128.9,df=10,p-value<2.2e-16
##由于p值大于0.05,因此我们接受原假设认为该数列独立,即原数列为白噪声序列
##然后我们对序列进行单位根检测,如果序列不存在单位根,那么该数列是平稳序列
adf.test(z)
##Warninginadf.test(z):
p-valuesmallerthanprintedp-value
##
##AugmentedDickey-FullerTest
##
##data:
z
##Dickey-Fuller=-28.804,Lagorder=16,p-value=0.01
##alternativehypothesis:
stationary
##由于p值大于0.05,因此我们接受原假设认为该数列平稳
##从上面的自相关图和偏相关图,我们可以看到该模型为arima(1,0,0)
library("forecast")
##Warning:
package'forecast'wasbuiltunderRversion3.3.3
x<-arima(z,c(1,0,0))
##因此建立模型之后对该序列进行预测
r1<-predict(x,n.ahead=12)
plot(forecast(x,h=12))
##在预测之后,我们可以得到该序列的预测置信区间,深蓝色的区域是95%的置信区间,而且蓝色的区域代表90%的置信区间。
从置信区间的范围来看,该序列趋向于平稳
##然后我们可以得到该模型的误差
accuracy(x)
##MERMSEMAEMPEMAPEMASE
##Trainingset5.608387e-070.12133