Introduction
This is the home page of the article "Estimation of Conditional Covariance Using Kernel Regression", written by Jussi Klemelä.
Supplementary Material
Supplementary material about Dow Jones 30 stocks is in covapred-supple-dj30.pdf.
Supplementary material about evaluation of the predictors with Dow Jones 30 stocks data using sum of squared prediction errors is in covapred-supple-dj30-eval.pdf.
Supplementary material about evaluation of the predictors with Dow Jones 30 stocks data using Markowith portfolio selection is in covapred-supple-dj30-wealth.pdf.
Reproducing the computations
Install software
source("http://jklm.fi/denpro/denpro.R")
source("http://jklm.fi/regpro/regpro.R")
source("http://jklm.fi/finatool/finatool.R")
source("http://jklm.fi/art/covapred/covapred.R")
Read Daily SP 500 and Nasdaq-100 Data
file<-"http://jussiklemela.com/art/covapred/sp500-ndx100.csv" data<-read.csv(file=file) n<-dim(data)[1]-1 d<-dim(data)[2] r<-matrix(0,n,d) for (j in 1:d) for (i in 1:n) r[i,j]<-(data[i+1,j]-data[i,j])/data[i,j] times0<-matrix(0,dim(data)[1],1) delta<-1/251.63 alku<-1985+9/12 for (i in 1:length(times0)) times0[i]<-alku+(i-1)*delta times<-times0[2:length(times0)] plot(r,xlab="S&P 500",ylab="Nasdaq-100") plot(times,r[,1]) plot(times,r[,2])
Read Daily SP 500 and 10 Year Bond Data
file<-"http://jussiklemela.com/art/covapred/sp500-dgs10.csv" data<-read.csv(file=file) r<-data n<-dim(r)[1] times<-matrix(0,dim(data)[1],1) delta<-1/251.63 alku<-1962+1/12 for (i in 1:length(times)) times[i]<-alku+(i-1)*delta plot(r,xlab="S&P 500",ylab="10 year bond") plot(times,r[,1]) plot(times,r[,2])
Estimation in the DCC Model
SP 500 and Nasdaq-100
file<-"http://jussiklemela.com/art/covapred/sp500-ndx100.csv"
data<-read.csv(file=file)
n<-dim(data)[1]-1
d<-dim(data)[2]
r<-matrix(0,n,d)
for (j in 1:d) for (i in 1:n) r[i,j]<-(data[i+1,j]-data[i,j])/data[i,j]
library("rmgarch")
t0<-250
parat<-matrix(0,n,8)
sigmat<-matrix(0,n,4)
cort<-matrix(0,n,1)
cort.eps<-matrix(0,n,1)
sigmat1<-matrix(0,n,1)
sigmat2<-matrix(0,n,1)
step<-50
ota<-seq(t0+1,n,step)
for (t in 2:t0){
now<-r[1:t,]
sigmat[t,1]<-var(now[,1])
sigmat[t,4]<-var(now[,2])
sigmat[t,2]<-cov(now[,1],now[,2])
sigmat[t,3]<-cov(now[,1],now[,2])
sigmat1[t]<-sd(now[,1])
sigmat2[t]<-sd(now[,2])
cort[t]<-cor(now[,1],now[,2])
cort.eps[t]<-cort[t] #cor(now[,1]/sigmat1,now[2:t,2]/sigmat2)
}
sigmat[1,]<-sigmat[2,]
cort[1]<-cort[2]
cort.eps[1]<-cort.eps[2]
sigmat1[1]<-sigmat1[2]
sigmat2[1]<-sigmat2[2]
#
q<-cov(now[,1]/sigmat1[1:t],now[,2]/sigmat2[1:t]) #sigmat[t,2]
q11<-var(now[,1]/sigmat1[1:t])
q22<-var(now[,2]/sigmat2[1:t])
for (i in 1:length(ota)){ # for (t in (t0+1):n){
t<-ota[i]
if (i==length(ota)) up<-n else up<-ota[i+1]-1
#
now<-ts(r[1:t,])
dc<-dccfit(dspec,now)
#
parat[t:up,1]<-as.numeric(coef(dc)[1]) #alpha0
parat[t:up,2]<-as.numeric(coef(dc)[2]) #alpha1
parat[t:up,3]<-as.numeric(coef(dc)[3]) #beta
parat[t:up,4]<-as.numeric(coef(dc)[4]) #alpha0
parat[t:up,5]<-as.numeric(coef(dc)[5]) #alpha1
parat[t:up,6]<-as.numeric(coef(dc)[6]) #beta
parat[t:up,7]<-as.numeric(coef(dc)[7]) #e
parat[t:up,8]<-as.numeric(coef(dc)[8]) #f
}
for (t in (t0+1):n){
alpha0<-parat[t,1]
alpha1<-parat[t,2]
beta<-parat[t,3]
sigmat1[t]<-sqrt(alpha0+alpha1*r[t,1]^2+beta*sigmat1[t-1]^2)
alpha0<-parat[t,4]
alpha1<-parat[t,5]
beta<-parat[t,6]
sigmat2[t]<-sqrt(alpha0+alpha1*r[t,2]^2+beta*sigmat2[t-1]^2)
#
e1<-parat[t,7]
f<-parat[t,8]
e0<-(1-e1-f)*cov(r[1:t,1]/sigmat1[1:t],r[1:t,2]/sigmat2[1:t])
q<-e0+e1*(r[t,1]/sigmat1[t])*(r[t,2]/sigmat2[t])+f*q
q11<-e0+e1*(r[t,1]/sigmat1[t])^2+f*q11
q22<-e0+e1*(r[t,2]/sigmat2[t])^2+f*q22
#
cort[t]<-q/sqrt(q11*q22)
cort.eps[t]<-q
sigmat[t,1]<-sigmat1[t]^2
sigmat[t,2]<-cort[t]*sigmat1[t]*sigmat2[t]
sigmat[t,3]<-cort[t]*sigmat1[t]*sigmat2[t]
sigmat[t,4]<-sigmat2[t]^2
}
Estimation in the BEKK Model
SP 500 and Nasdaq-100
file<-"http://jussiklemela.com/art/covapred/sp500-ndx100.csv"
data<-read.csv(file=file)
n<-dim(data)[1]-1
d<-dim(data)[2]
r<-matrix(0,n,d)
for (j in 1:d) for (i in 1:n) r[i,j]<-(data[i+1,j]-data[i,j])/data[i,j]
library("mgarchBEKK")
t0<-250
parat<-matrix(0,n,11)
sigmat<-matrix(0,n,4)
step<-20
ota<-seq(t0+1,n,step)
for (t in 2:t0){
now<-r[1:t,]
sigmat[t,1]<-var(now[,1])
sigmat[t,4]<-var(now[,2])
sigmat[t,2]<-cov(now[,1],now[,2])
sigmat[t,3]<-cov(now[,1],now[,2])
}
S<-matrix(0,2,2)
S[1,1]<-sigmat[t,1]
S[1,2]<-sigmat[t,2]
S[2,1]<-sigmat[t,3]
S[2,2]<-sigmat[t,4]
for (i in 1:length(ota)){ # for (t in (t0+1):n){
t<-ota[i]
if (i==length(ota)) up<-n else up<-ota[i+1]-1
#
now<-ts(r[1:t,])
bek<-BEKK(now) #-mean(y))
C<-bek$est.params$"1"
A<-bek$est.params$"2"
B<-bek$est.params$"3"
#
parat[t:up,1]<-C[1,1]
parat[t:up,2]<-C[1,2]
parat[t:up,3]<-C[2,2]
parat[t:up,4]<-A[1,1]
parat[t:up,5]<-A[1,2]
parat[t:up,6]<-A[2,1]
parat[t:up,7]<-A[2,2]
parat[t:up,8]<-B[1,1]
parat[t:up,9]<-B[1,2]
parat[t:up,10]<-B[2,1]
parat[t:up,11]<-B[2,2]
}
for (t in (t0+1):n){
C<-matrix(0,2,2)
A<-matrix(0,2,2)
B<-matrix(0,2,2)
C[1,1]<-parat[t,1]
C[1,2]<-parat[t,2]
C[2,1]<-0
C[2,2]<-parat[t,3]
A[1,1]<-parat[t,4]
A[1,2]<-parat[t,5]
A[2,1]<-parat[t,6]
A[2,2]<-parat[t,7]
B[1,1]<-parat[t,8]
B[1,2]<-parat[t,9]
B[2,1]<-parat[t,10]
B[2,2]<-parat[t,11]
#
e<-matrix(r[t,],2,1)
E<-e%*%t(e)
S<-t(C)%*%C+t(A)%*%E%*%A+t(B)%*%S%*%B
sigmat[t,1]<-S[1,1]
sigmat[t,2]<-S[1,2]
sigmat[t,3]<-S[2,1]
sigmat[t,4]<-S[2,2]
#sigmat[t]<-sqrt(alpha0+alpha1*r[t]^2+beta*sigmat[t-1]^2)
}
sigmat[1,]<-sigmat[2,]
Prediction Using Moving Averages
SP 500 and Nasdaq-100
file<-"http://jussiklemela.com/art/covapred/sp500-ndx100.csv"
data<-read.csv(file=file)
n<-dim(data)[1]-1
d<-dim(data)[2]
r<-matrix(0,n,d)
for (j in 1:d) for (i in 1:n) r[i,j]<-(data[i+1,j]-data[i,j])/data[i,j]
# Exponentially weighted moving average
t0<-250
hoot<-c(8,10,12,14,16,18,20)
ce<-covapred.ewma(r,hoot,t0=t0)
# Exponentially weighted moving average correlation predictor
file<-"http://jussiklemela.com/art/covapred/garch-sp500-ndx100.csv"
sigmat<-read.csv(file=file)
sigmat<-sigmat[,c(2,3)]
t0<-250
hoot<-c(10,50,200,400,800,1500,3000,6000)
cec<-covapred.ewma.cor(r,hoot,sigmat,t0=t0)
# Comparison of cumulative sums of squared prediction errors
t00<-1000
cspe.ma<-matrix(0,n,1)
cspe<-matrix(0,n,1)
for (i in t00:n){
ine<-which.min(cspe.ma[i-1,])
cspe.ma[i]<-cspe.ma[i-1]+ce$spe[i,ine]
#
ine<-which.min(cspe[i-1,])
cspe[i]<-cspe[i-1]+cec$spe[i,ine]
}
ero<-cspe-cspe.ma
jako<-cspe/cspe.ma
times<-matrix(0,dim(data)[1],1)
delta<-1/251.63
alku<-1985+9/12
for (i in 1:n) times[i]<-alku+(i-1)*delta
ota<-c(1000:(n-10))
plot(times[ota],ero[ota],type="l",lty=1)
segments(0,0,20000,0,col="green")
ota<-c(1000:(n-10))
plot(times[ota],jako[ota],type="l",lty=1,ylim=c(0.98,1.02))
segments(0,1,20000,1,col="green")
Prediction Using Kernel Regression
SP 500 and Nasdaq-100
file<-"http://jussiklemela.com/art/covapred/sp500-ndx100.csv"
data<-read.csv(file=file)
n<-dim(data)[1]-1
d<-dim(data)[2]
r<-matrix(0,n,d)
for (j in 1:d) for (i in 1:n) r[i,j]<-(data[i+1,j]-data[i,j])/data[i,j]
# Kernel prediction
t0<-1000
hoot<-c(0.6,0.7,0.8,0.9,1,1.1,1.2)
ck<-covapred.kernel(r,hoot,t0=t0,g1=20,g2=20,g3=10)
# Kernel correlation prediction
t0<-1000
hoot<-c(0.6,0.7,0.8,0.9,1,1.1,1.2)
ckc<-covapred.kernel.cor(r,hoot,sigmat,t0=1000,g1=20,g3=10)
# Comparison of cumulative sums of squared prediction errors
t00<-1000
cspe.ck<-matrix(0,n,1)
cspe.ckc<-matrix(0,n,1)
for (i in t00:n){
ine<-which.min(cspe.ck[i-1,])
cspe.ck[i]<-cspe.ck[i-1]+ck$spe[i,ine]
#
ine<-which.min(cspe.ckc[i-1,])
cspe.ckc[i]<-cspe.ckc[i-1]+ckc$spe[i,ine]
}
ero<-cspe.ckc-cspe.ck
jako<-cspe.ckc/cspe.ck
times<-matrix(0,dim(data)[1],1)
delta<-1/251.63
alku<-1985+9/12
for (i in 1:n) times[i]<-alku+(i-1)*delta
ota<-c(1000:(n-10))
plot(times[ota],ero[ota],type="l",lty=1)
segments(0,0,20000,0,col="green")
ota<-c(1000:(n-10))
plot(times[ota],jako[ota],type="l",lty=1) #,ylim=c(0.9,1.2))
segments(0,1,20000,1,col="green")