R语言实现:基于GARCH模型的股市危机预警
包载入与数据预处理:
1. #包载入
2. library(fGarch)
3. library(rugarch)#garch拟合与预测
4. library(TSA)#BIC准则确定arma阶数 eacf确定garch阶数
5. library(tseries)
6. library(zoo)#转换成时间序列类型
7. library(forecast)#auto.arima() arma阶数确定方法
8. library(psych)#数据描述统计分析
9. library(ggplot2)#绘图
10. library(ccgarch)#JB统计量
11. ###NASDAQ
12. #数据预处理
13. StockData<-read.csv("D:\\rwork\\课程设计\\SHANGZHENG1992-2015.csv",encoding='utf-8',header = T) #header = Falese
14. time<-as.Date(StockData$'time',format="%Y/%m/%d")
15. closeprice<-StockData$'closeprice'
16. data<-zoo(closeprice,time)
17. #选中局部数据
18. selectdata=window(data, start = as.Date("2005-01-01"), end = as.Date("2015-05-01"))
19. plot(selectdata,xlab="time",ylab="index",main="Shanghai Composite Index")
20. rlog=log(selectdata)
21. rlogdiff=diff(log(selectdata))*100 #数据转换
22. rlogdifftime=index(rlogdiff)
23. rlogdiffdata=coredata(rlogdiff)
数据描述与模型匹配检验
(1)正态性检验
- par(mfrow=c(1,3),oma=c(0.2,0.2,0.2,0.2))
- hist(rlogdiff,main="Shanghai Composite Index Log Return Distribution",col="yellow",xlab="",ylim=c(0,0.4),probability=T)
- lines(density(rlogdiff),lwd=1);rug(rlogdiff)#first graph
- qqnorm(rlogdiff);qqline(rlogdiff)#second graph
- plot(rlogdiff,ylab="value");abline(h=0,lty=2)#third graph
分布为数据分布函数,QQ图,对数收益率序列折现图。
收益率分布图、QQ图可以看出金融时间序列确实表现出尖峰厚尾性,相对于标准正态分布,峰度更高,两段的尾部更厚,也就是极值更多。由收益率波动序列可以看出各国股票指数收益率序列在样本区间内均表现出一定的波动性和聚集性,其中2008-2009年波动幅度尤为明显。
同时也可以用统计量检验正态性
- shapiro.test(rlogdiffdata)
#值越大,越表示不是正态,P越小越非正态
其他数据描述:
- describe(rlogdiffdata)
- jb.test(rlogdiffdata)
(2)平稳性检验
- #若 ADF p<0.0 认为序列是均值回归的
- adf.test(rlog,alt="stationary")
#注意 这是未差分的数据
- adf.test(rlogdiffdata,alt="stationary"
#这是差分后的数据
p<0.01序列为平稳序列
(3)ARCH 效应检验
- #得先arima拟合模型,对残差进行LM检验
- armamodel=auto.arima(rlogdiff)
#自动基于AIC最小准则,寻找最佳拟合模型
- armamodel
- plot(residuals(armamodel))
- par(mfrow=c(1,1))
- lmresult=McLeod.Li.test(y=residuals(armamodel))
#残差arch效应很显著
由图可知,残差序列滞后36阶后,残差自回归函数的系数显著,序列仍然存在自相关。因此 拒绝原假设,说明样本序列存在显著的ARCH效应。
综上,对数收益率序列具有波动聚集性,序列平稳,有显著ARCH效应。序列时候GARCH模型建模。
模型拟合
分别使用SGARCH与EGARCH模型拟合序列,SGARCH拟合效果更合适。但是EGARCH能分析收益率序列的“杠杆效应”此处以EGARCH做演示
- myspec=ugarchspec(
- variance.model = list(model = "eGARCH", garchOrder = c(1, 1)),
- mean.model = list(armaOrder = c(0,0), include.mean = TRUE),
- distribution.model = "std"
- )
-
- myfit=ugarchfit(myspec,data=rlogdiff,solver="gosolnp")
- myfit
模型诊断
- #残差正态性检验
- plot(myfit,which=8)
- plot(myfit,which=9)
- shapiro.test(coredata(residuals(myfit)))
#值越大,越表示不是正态,P越小越非正态
- #残差相关性检验
- acf(coredata(residuals(myfit)))
- acf(residuals(myfit))
- plot(myfit,which=10)
- plot(myfit,which=11)
- #系数是否显著
- myfit #看P值是否够小
- #拟合效果 残差如何
- plot(myfit,which=3)
- plot(residuals(myfit)) #看残差
插曲:
各国收益率信息冲击曲线
- plot(myfit,which=12)
从上图可以看出,美国、德国、日本股票指数收益率在信息冲击小于零(即利空消息或负冲击)时比较陡峭,而在信息冲击大于零(即利好消息或正冲击时)则比较平缓。而上证综指在利空利好消息时曲线均走势陡峭。与其他国家有明显差异,说明上证综指对对消息敏感,抗风险能力较弱。
综上,用GARCH模型拟合收益率序列切实可行。
#############################################