library(quantmod)
Price <- get(getSymbols("^GSPC"))

A very useful function designed to work with time series objects such as zoo and xts is the rollaplly function. The function comes with the zoo package, which is built in the quantmod package. I find the function very handy, as it allows the users to generate computations on a rolling window, e.g. moving average.

R <- dailyReturn(Price[,6])
R_ma <- rollapply(R,25,mean)
R_mv <- rollapply(R,25,sd)

The R_ma and R_mv objects return the moving average (MA) and moving volatility (MV) of the S&P 500 daily return. One can compare today’s S&P 500 return with respect to its MA and MV, for instance.

Additionally, one can define a new function to run on a rolling basis. For example, one can easily calculate the market beta (\(\beta\)) of Apple on a daily basis using 50 days of history:

Price2 <- get(getSymbols("AAPL"))
R2 <- dailyReturn(Price2[,6])
R12 <- merge(R,R2)
Beta <- rollapply(R12,50, by.column = F,  function(x) lm(x[,2] ~ x[,1])[[1]][[2]] )
plot(Beta)

Note that by.column = F indicates that the rolling window computation is done on multiple columns rather than a single column. In this case, x is treated as a matrix of two columns. Looking at the plot, one observes how the stock \(\beta\) fluctuates over time.

LS0tCnRpdGxlOiAiVGlwIG9mIHRoZSBNb250aDogYHJvbGxhcHBseWAiCiNvdXRwdXQ6IHJtYXJrZG93bjo6Z2l0aHViX2RvY3VtZW50Cm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CmF1dGhvcjogTWFqZWVkIFNpbWFhbgpkYXRlOiAyMDE4LTAzLTA1CmZpZ193aWR0aDogMjAKLS0tCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkocXVhbnRtb2QpClByaWNlIDwtIGdldChnZXRTeW1ib2xzKCJeR1NQQyIpKQpgYGAKQSB2ZXJ5IHVzZWZ1bCBmdW5jdGlvbiBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGltZSBzZXJpZXMgb2JqZWN0cyBzdWNoIGFzIGB6b29gIGFuZCBgeHRzYCBpcyB0aGUgYHJvbGxhcGxseWAgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBjb21lcyB3aXRoIHRoZSBgem9vYCBwYWNrYWdlLCB3aGljaCBpcyBidWlsdCBpbiAgdGhlIGBxdWFudG1vZGAgcGFja2FnZS4gIEkgZmluZCB0aGUgZnVuY3Rpb24gdmVyeSBoYW5keSwgYXMgaXQgYWxsb3dzIHRoZSB1c2VycyB0byBnZW5lcmF0ZSBjb21wdXRhdGlvbnMgb24gYSByb2xsaW5nIHdpbmRvdywgZS5nLiBtb3ZpbmcgYXZlcmFnZS4KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KUiA8LSBkYWlseVJldHVybihQcmljZVssNl0pClJfbWEgPC0gcm9sbGFwcGx5KFIsMjUsbWVhbikKUl9tdiA8LSByb2xsYXBwbHkoUiwyNSxzZCkKYGBgClRoZSBgUl9tYWAgYW5kIGBSX212YCBvYmplY3RzIHJldHVybiB0aGUgbW92aW5nIGF2ZXJhZ2UgKE1BKSBhbmQgbW92aW5nIHZvbGF0aWxpdHkgKE1WKSBvZiB0aGUgUyZQIDUwMCBkYWlseSByZXR1cm4uIE9uZSBjYW4gY29tcGFyZSB0b2RheSdzIFMmUCA1MDAgcmV0dXJuIHdpdGggcmVzcGVjdCB0byBpdHMgTUEgYW5kIE1WLCBmb3IgaW5zdGFuY2UuCgpBZGRpdGlvbmFsbHksIG9uZSBjYW4gZGVmaW5lIGEgbmV3IGZ1bmN0aW9uIHRvIHJ1biBvbiBhIHJvbGxpbmcgYmFzaXMuIEZvciBleGFtcGxlLCBvbmUgY2FuIGVhc2lseSBjYWxjdWxhdGUgdGhlIG1hcmtldCBiZXRhICgkXGJldGEkKSBvZiBBcHBsZSBvbiBhIGRhaWx5IGJhc2lzIHVzaW5nIDUwIGRheXMgb2YgaGlzdG9yeToKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSxmaWcuYWxpZ249ImNlbnRlciJ9ClByaWNlMiA8LSBnZXQoZ2V0U3ltYm9scygiQUFQTCIpKQpSMiA8LSBkYWlseVJldHVybihQcmljZTJbLDZdKQpSMTIgPC0gbWVyZ2UoUixSMikKQmV0YSA8LSByb2xsYXBwbHkoUjEyLDUwLCBieS5jb2x1bW4gPSBGLCAgZnVuY3Rpb24oeCkgbG0oeFssMl0gfiB4WywxXSlbWzFdXVtbMl1dICkKcGxvdChCZXRhKQpgYGAKCk5vdGUgdGhhdCBgYnkuY29sdW1uID0gRmAgaW5kaWNhdGVzIHRoYXQgdGhlIHJvbGxpbmcgd2luZG93IGNvbXB1dGF0aW9uIGlzIGRvbmUgb24gbXVsdGlwbGUgY29sdW1ucyByYXRoZXIgdGhhbiBhIHNpbmdsZSBjb2x1bW4uIEluIHRoaXMgY2FzZSwgYHhgIGlzIHRyZWF0ZWQgYXMgYSBtYXRyaXggb2YgdHdvIGNvbHVtbnMuIExvb2tpbmcgYXQgdGhlIHBsb3QsIG9uZSBvYnNlcnZlcyBob3cgdGhlIHN0b2NrICRcYmV0YSQgZmx1Y3R1YXRlcyBvdmVyIHRpbWUuCgo=