setwd("D:/uni year 3/EE435")
#install.packages("quantmod")  
#install.packages("fBasics") 
#install.packages("sn")  
#install.packages("PerformanceAnalytics") 
#install.packages("car") 
#install.packages("tseries")  
#install.packages("forecast") 
#install.packages("fGarch")
library(fGarch)
library(quantmod) 
library(fBasics)
library(sn)
library(PerformanceAnalytics)
library(car)
library(tseries)
library(forecast)
require(quantmod)

## Question 1
getSymbols("CAT",from="2006-01-03",to="2017-04-13")
rt <- diff(log(as.numeric(CAT[,6])))
#1a serial correlation
acf(rt)
Box.test(rt,lag=15,type = 'Ljung')

#1b ARCH effect
Box.test(rt^2, lag = 15, type="Ljung")
#1c ARMA(1,0)-GARCH(1,1)
m2 = garchFit(~arma(1,0)+garch(1,1),data = rt, include.mean = F, trace = F)
m2
#plot(m2)
summary(m2)
#1d GARCH(1,1)
m3 = garchFit(~garch(1,1),data=rt, cond.dist = "std",trace=F)
m3
summary(m3)
#plot(m3)
#1e fitted model

#1f 1-step to 5-step using GARCH(1,1) --m3
predict(m3,5)
#1g 95% interval prediction

#Question 2
da=read.table("m-kovw-5116.txt",header=T)
head(da)
dim(da)
rt_ko = da[,3]
logrt_ko = log(1+rt_ko)

#2a
t.test(logrt_ko)
Box.test(logrt_ko, lag = 15, type = "Ljung")
## ARCH effect
#2b
m4 = garchFit(~arma(1,0)+garch(1,1),data = logrt_ko,include.mean = F,trace = F)
m4
summary(m4)

#2c
m5 = garchFit(~arma(1,0)+garch(1,1),data = logrt_ko,cond.dist = "std",trace = F)
m5
summary(m5)
#2d
m6 = garchFit(~garch(1,1), data = logrt_ko,trace = F)
m6
summary(m6)
#2e
m7 = garchFit(~garch(1,1), data = logrt_ko,cond.dist = "std",trace = F)
m7
summary(m7)
#2f
#Question 3
getSymbols("^GSPC",from="2005-01-02",to="2021-03-31")
rt = diff(log(as.numeric(GSPC[,6])))
#3a
t.test(rt)
Box.test(rt, lag=12,type="Ljung")
acf(rt)
#3b
m13 = garchFit(~arma(2,0)+garch(1,1),data=rt,trace=F)
summary(m13)
plot(m13)
#3c
m14 = garchFit(~arma(2,0)+garch(1,1),data=rt,cond.dist = "std", trace = F)
summary(m14)
#3d
predict(m14,5)

#Question 4
da2 = read.table("m-deciles.txt",header = TRUE)
crsp = da2[,10]
logreturn_crsp = log(1+crsp)
#4a
t.test(logreturn_crsp)
Box.test(logreturn_crsp, lag=12, type = 'Ljung')
#4b ARCH effect
Box.test(logreturn_crsp^2, lag = 12, type='Ljung')
#4c
m9 = garchFit(~arma(1,0)+garch(1,0),data = logreturn_crsp, trace=F)
m9
summary(m9)
#4d
m10 = garchFit(~arma(1,0)+garch(1,0),data = logreturn_crsp, cond.dist = "std",trace=F)
m10
summary(m10)
#4e
m11 = garchFit(~garch(1,0),data = logreturn_crsp,trace=F)
m11
summary(m11)
#4f
m12 = garchFit(~garch(1,0),data = logreturn_crsp, cond.dist = "std",trace=F)
m12
summary(m12)
