[R-SIG-Finance] [R-sig-Finance] Rolling correlations with zoo object
Gabor Grothendieck
ggrothendieck at gmail.com
Mon Apr 30 23:46:38 CEST 2012
Hi, That's from 6 years ago and things have changed. The core of R
introduced a rapply command not connected with time series so zoo
renamed its rapply command to rollapply. Also there are some small
details that work differently now too. Try this. Regards.
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))
})
kor <- function(x) cor(x)[3]
system.time(corr.rollapply <- rollapply(cbind(x,y), 30, kor, by.column = FALSE))
all.equal(corr, corr.rollapply)
On Mon, May 22, 2006 at 11:44 AM, Gabor Grothendieck
<ggrothendieck at gmail.com> wrote:
> 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
>> >
>>
>
--
Statistics & Software Consulting
GKX Group, GKX Associates Inc.
tel: 1-877-GKX-GROUP
email: ggrothendieck at gmail.com
More information about the R-SIG-Finance
mailing list