作者:huozi07
http://blog.csdn.net/huoz07/artile/details/48176587
为防范股票市场上的不确定性和风险,有效地度量股票指数收益率的波动性显得尤为重要。本文运用GARCH族模型拟合了股票指数收益率的波动性方程并实证研究了全球有代表性的上证综指、NASDAQ指数、德国DAX、日本日经指数。结果表明四个国家股票收益率均有聚集性、持续性,股票市场存在着冲击的非对称性。具体而言,美国、德国、日本股票市场对利空消息敏感,而对利好消息保持谨慎。而中国对利好利空消息均敏感,体现市场抗风险的薄弱性。此外,本文尝试使用SGARCH模型对股票收益率序列进行滚动预测,取得较好预测精度,同时文章首创性的基于Var曲线提出了股市危机预警信号。这些方案可以帮助投资者合理投资,增强股市的合理性、抗风险性。
各个股票市场操作方法类似,以上证指数为例展示代码。
包载入与数据预处理:
- #包载入
- library(fGarch)
- library(rugarch)#garch拟合与预测
- library(TSA)#BIC准则确定arma阶数 eacf确定garch阶数
- library(tseries)
- library(zoo)#转换成时间序列类型
- library(forecast)#auto.arima() arma阶数确定方法
- library(psych)#数据描述统计分析
- library(ggplot2)#绘图
- library(ccgarch)#JB统计量
- ###NASDAQ
- #数据预处理
- StockData<-read.csv("D:\\rwork\\课程设计\\SHANGZHENG1992-2015.csv",encoding='utf-8',header = T) #header = Falese
- time<-as.Date(StockData$'time',format="%Y/%m/%d")
- closeprice<-StockData$'closeprice'
- data<-zoo(closeprice,time)
- #选中局部数据
- selectdata=window(data, start = as.Date("2005-01-01"), end = as.Date("2015-05-01"))
- plot(selectdata,xlab="time",ylab="index",main="Shanghai Composite Index")
- rlog=log(selectdata)
- rlogdiff=diff(log(selectdata))*100 #数据转换
- rlogdifftime=index(rlogdiff)
- 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模型拟合收益率序列切实可行。
基于VAR曲线的收益风险预警
实现代码:
- spec = ugarchspec(variance.model = list(model = "sGARCH"), distribution.model = "std")
- cl = makePSOCKcluster(10)
- #滚动预测
- roll = ugarchroll(spec, rlogdiff, n.start =300,refit.every = 300,
- refit.window = "moving", solver = "hybrid", calculate.VaR = TRUE,
- VaR.alpha = c(0.01, 0.025, 0.05), cluster = cl,keep.coef = TRUE)
预测残差
- report(roll, type = "fpm")
结果展示
[plain] view plain copy
- plot(roll,which=4,VaR.alpha=0.01)
由上图可知在较大波动率之前确实有一些点落在Var曲线以下(标注为红点)。但在波动平稳期,模型预警正确率不高(如2011年4月到2013年4月)所以该模型在波动率非平稳期有一定参考价值。
以上证指数为例,在五月以前有不少收益率值落在了var曲线以下。可见,现在上证指数的大跌在之前是有留下一定信号的。