[R-sig-Finance] Rolling correlations with zoo object

Gabor Grothendieck ggrothendieck at gmail.com
Mon May 22 17:44:43 CEST 2006


Sorry.  I did not enclose everything in system.time so the timing
was incomplete.  Here it is again.  Doing it properly like this
gives a 2.7x speedup.


set.seed(1)
n <- 10000
x <- zoo(rnorm(n))
y <- zoo(rnorm(n))

system.time({
	x. <- rollmean(x, 30)
	y. <- rollmean(y, 30)

	xx. <- rollmean(x*x, 30)
	yy. <- rollmean(y*y, 30)

	xy. <- rollmean(x*y, 30)

	corr <- (xy. - x. * y.) / sqrt((xx. - x.^2) * (yy. - y.^2))
})

system.time(corr.rapply <- rapply(cbind(x,y), 30, cor, by.column = FALSE)[,3])

all.equal(corr, corr.rapply)




On 5/22/06, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:
> rollmean is much faster than rapply so use the fact that we
> can calculate correlations in terms of means, means of squares
> and means of cross products.   Doing this appears to be 4.6x
> faster for this example:
>
> > library(zoo)
> > set.seed(1)
> > n <- 10000
> > x <- zoo(rnorm(n))
> > y <- zoo(rnorm(n))
> >
> > x. <- rollmean(x, 30)
> > y. <- rollmean(y, 30)
> >
> > xx. <- rollmean(x*x, 30)
> > yy. <- rollmean(y*y, 30)
> >
> > xy. <- rollmean(x*y, 30)
> >
> > system.time(out <- (xy. - x. * y.) / sqrt((xx. - x.^2) * (yy. - y.^2)))
> [1] 0.94 0.12 1.45   NA   NA
> >
> > system.time(out.rapply <- rapply(cbind(x,y), 30, cor, by.column = FALSE)[,3])
> [1]  4.35  0.34 16.21    NA    NA
> >
> > all.equal(out, out.rapply)
> [1] TRUE
> >
> > R.version.string # XP
> [1] "R version 2.2.1, 2005-12-20"
>
>
> On 5/22/06, jladekarl at worldbank.org <jladekarl at worldbank.org> wrote:
> > I'm a novice user of R so, please, excuse me for asking a basic question I hope
> > there is a basic answer to:
> >
> > I have tried to created a correlation matrix using a "zoo object".  I don't have
> > any issues using the cor("zoo data") function, but when I try to expand the
> > process by introducing rolling correlations I run into problems. I have created
> > a workaround using "rapply" specifying the exact variables to use, rather than
> > the general zoo object, but it's not very practical solution for large matrixes.
> > Any hints?
> >
> > Jeppe
> >
> > ##Connect to Bloomberg through session "conn"
> > conn <- blpConnect ()
> >
> > ##download currency data for the last 3 years into a zoo object called "data"
> > data <- blpGetData(conn, c("EUR Curncy", "CHF Curncy"), "PX Last",
> > start=as.chron(Sys.time() - 86400 * (3*365)))
> >
> > ##End Bloomberg Session "conn"
> > blpDisconnect(conn)
> >
> > #plot running correlation estimated by last 30 observations rolling by "1"
> > EUR.chf.cor <- rapply(data[,c("EUR CURNCY", "CHF CURNCY")], 30,
> > function(x) cor(x[,1], x[,2]), by = 1, by.column = FALSE)
> > plot(EUR.chf.cor)
> >
> > _______________________________________________
> > R-SIG-Finance at stat.math.ethz.ch mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-sig-finance
> >
>



More information about the R-SIG-Finance mailing list