library(fGarch) #R語言CSI300數據分析程序
library(fBasics)
library(fUnitRoots)
library(xlsx)
library(rJava)
library(forecast)
library(timeDate)
library(zoo)
#建立對數收益率時間序列
dfile<-"D:/programsdata/2013CSI.xlsx"; #2013年CSI數據
dset<-read.xlsx(dfile,1);
dset1<-dset
dset1e=dset1[,4,drop=FALSE] #注意dset1e=dset1[4,drop=FALSE]出現警告
dv1=100*(diff(log(dset1e[,1])))
dset11=data.frame(dv1)
dfile2<-"D:/programsdata/2014CSI.xlsx"; #2014年CSI數據
dfile3<-"D:/programsdata/2015CSI.xlsx"; #2015年CSI數據
dset2014<-read.xlsx(dfile2,1);
dset2015<-read.xlsx(dfile3,1);
dset1f=dset2014[,4,drop=F]
dset1g=dset2015[,4,drop=F]
colnames(dset11)=c("rtn")
dv2=100*(diff(log(dset1f[,1])))
dset12=data.frame(dv2)
dv3=100*(diff(log(dset1g[,1])))
dset13=data.frame(dv3)
colnames(dset12)=c("rtn")
colnames(dset13)=c("rtn")
dset2=rbind(dset11,dset12,dset13) #CSI300 對數收益率序列
y=dset11[,1]
y1=dset2[,1]
dts=ts(y1,frequency=244,start=c(2013,1,9)) #建立對數收益率時間序列
plot(dts)
par(mfcol=c(2,2))
acf(dset11,lag=24)
pacf(dset11,lag=24)
pacf(abs(dset11),lag=24)
#判定“波動率”的ARCH效應
"archTest" <- function(rtn,m=10){#Tsay判斷ARCH效應函數
# Perform Lagrange Multiplier Test for ARCH effect of a time series
# rtn: time series
# m: selected AR order
#
y=(rtn-mean(rtn))^2
T=length(rtn)
atsq=y[(m+1):T]
x=matrix(0,(T-m),m)
for (i in 1:m){
x[,i]=y[(m+1-i):(T-i)]
}
md=lm(atsq~x)
summary(md)
}
archTest(dset11[,1],12)
#數據屬性
y=dset11[,1]
mean(y) #均值
Box.test((y1-mean(y1))^2,lag=12,type='Ljung') #LB統計量Q(12)值
basicStats(y1) #基本統計量信息
basicStats(y) #2013
basicStats(dv3) #2015
hist(y1,nclass=30) #直方圖
d1=density(y1) #核密度函數
range(y1)
x=seq(-10.0,7.0,0.01)
y2=dnorm(x,mean(y1),stdev(y1)) #正態分佈
plot(d1$x,d1$y,1xlab='rtn',ylab='density',type='l') #核密度圖
lines(x,y2,lty=2)
normalTest(y,method='jb') #正態分佈效應
par(mfcol=c(1,1))
pacf(y1^2,lag=100)
pacf(y1^2,lag=24)
#建立ARCH模型
cm11=garchFit(~1+garch(4,0),data=y1,trace=F) #arch(4,0)
summary(cm11)
cm12=garchFit(~1+garch(3,0),data=y1,trace=F)
summary(cm12)
cm13=garchFit(~1+garch(3,0),data=y1,trace=F,cond.dist="std") #條件分佈調整
summary(cm13)
cm15=garchFit(~1+garch(3,0),data=y1,trace=F,cond.dist="sstd")
summary(cm15)
cm16=garchFit(~1+garch(4,0),data=y1,trace=F,cond.dist="std")
summary(cm16)
resi=residuals(cm16,standardize=T) #判定模型有效性
par(mfcol=c(3,1))
plot(1:724,resi,xlab='date',ylab='stand-resi',type='l')
acf(resi,lag=20)
pacf(resi^2,lag=20)
plot(cm16)
cm1=garchFit(~1+garch(3,0),data=y1,trace=F) #比較波動率的不確定差,模型選擇
cm2=garchFit(~1+garch(3,0),data=y1,trace=F,cond.dist="std")
cm3=garchFit(~1+garch(4,0),data=y1,trace=F,cond.dist="std")
resi3.0=residuals(cm1,standardize=T)
resi3.std=residuals(cm2,standardize=T)
resi4.std=residuals(cm3,standardize=T)
par(mfcol=c(3,1))
plot(1:724,resi3.0,xlab='date',ylab='stand-resi-3.0',type='l')
plot(1:724,resi3.0,xlab='date',ylab='stand-resi-3.0std',type='l')
plot(1:724,resi3.0,xlab='date',ylab='stand-resi-4.0std',type='l')
#建立Garch模型
gcm1=garchFit(~1+garch(1,1),data=y1,trace=F) #garch(1,1)模型
summary(gcm1)
gcm2=garchFit(~1+garch(1,2),data=y1,trace=F)
summary(gcm2)
gcm3=garchFit(~1+garch(2,1),data=y1,trace=F)
summary(gcm3)
gcm4=garchFit(~1+garch(2,2),data=y1,trace=F)
summary(gcm4)
gcm5=garchFit(~1+garch(1,1),data=y1,trace=F,cond.dist="std") #garch(1,1)學生氏模型
summary(gcm5)
gcm6=garchFit(~1+garch(1,1),data=y1,trace=F,cond.dist="sstd") #garch(1,1)有偏學生氏模型
summary(gcm6)
#建立組合模型
arm=arima(y1,order=c(4,0,2)) #arima模型
summary(arm)
tsdiag(arm) #模型診斷
gcm7=garchFit(~arma(4,2)+garch(1,1),data=y1,trace=F) #arma(4,2)+garch(1,1)
summary(gcm7)
gcm8=garchFit(~arma(2,2)+garch(1,1),data=y1,trace=F) #arma(2,2)+garch(1,1)
summary(gcm8)
gcm9=garchFit(~arma(2,2)+garch(1,1),data=y1,trace=F,cond.dist="std") #arma(2,2)+garch(1,1)學生氏模型
summary(gcm9)
#garch組合模型數據擬合優度
v1=volatility(gcm9) #提取arma(2,2)+garch(1,1)學生氏模型波動率
resi=residuals(gcm9,standardize=T)
vol=ts(v1,frequency=244,start=c(2013,1,9))
res=ts(resi,frequency=244,start=c(2013,1,9))
par(mfcol=c(2,1))
plot(vol,xlab='date',ylab='volatility',type='l')
plot(res,xlab='date',ylab='st. resi',type='l')
par(mfcol=c(2,2))
acf(resi,lag=24)
pacf(resi,lag=24)
acf(resi^2,lag=24)
pacf(resi^2,lag=24)
par(mfcol=c(1,1))
upp=0.16479+2*v1
low=0.16479-2*v1
tdx=c(1:724)
plot(tdx,dts,xlab='date',ylab='series',type='l',ylim=c(-8.0,8.0))
lines(tdx,upp,lty=2,col='red')
lines(tdx,low,lty=2,col='red')