将rollmean应用于具有多个窗口的多个时间序列

时间:2016-01-13 23:05:04

标签: r time-series mapply rollapply

我需要为几个时间序列对象生成不同长度的滚动平均值。理想情况下,我将为每个时间序列对象留下一个数据框,其中滚动平均值存储在相邻列中。我能够为其中一个对象生成我想要的输出,但它很慢,我需要能够在多个系列中复制它。我尝试过使用mapply和cbind但是,我不会得到可用的结果...感谢您提供的任何帮助!

library(zoo)
library(quantmod)
library(plyr)

symbollist <- c("SPY", "FXY", "FXE", "GLD", "JJC", "TLT")

getSymbols(symbollist, from="2014-01-01")

#list of symbols
snp <- SPY[,6]
jpy <- FXY[,6]
eur <- FXE[,6]
gld <- GLD[,6]
cop <- JJC[,6]
lut <- TLT[,6]

#poving average periods
periods<- c(10,20,50)

datalist <- list(snp,jpy,eur,gld,cop,lut)

rm <- function(a,b){
  rollmean(a, b, align="right")
}

mapply(rm, datalist, periods)

使用下面的代码,我可以制作出我想要的代码,但我想使用更多的窗口在几个不同的时间序列中复制它。

snp <- SPY[,6]
m.av.10 <- rollmean(snp, 10, align = "right")
m.av.20 <- rollmean(snp, 20, align = "right")
m.av.50 <- rollmean(snp, 50, align = "right")

snp$ma.10 = m.av.10
snp$ma.20 = m.av.20
snp$ma.50 = m.av.50

看起来应该是这样的,每个时间序列对象都有一个类似下面的数据框。

           SPY.Adjusted ma.10 ma.20 ma.50
2014-01-02     175.7868    NA    NA    NA
2014-01-03     175.7579    NA    NA    NA
2014-01-06     175.2486    NA    NA    NA
2014-01-07     176.3249    NA    NA    NA
2014-01-08     176.3634    NA    NA    NA
2014-01-09     176.4787    NA    NA    NA

2015-12-31     203.8700 204.2948 204.5172 205.8787
2016-01-04     201.0200 204.0320 204.3485 205.8859
2016-01-05     201.3600 204.1660 203.9975 205.8322
2016-01-06     198.8200 203.8810 203.5826 205.6830
2016-01-07     194.0500 202.9360 202.9988 205.4485
2016-01-08     191.9200 201.5260 202.3886 205.1793
2016-01-11     192.1100 200.1690 201.7615 204.8672
2016-01-12     193.6600 199.0140 201.4102 204.5886

1 个答案:

答案 0 :(得分:1)

1)首先生成包含三个时期的滚动方式的三个组件的列表L。其余行将其重新编入与L1(和datalist)长度相同的列表symbollist,以便每个组件都为p1的每个元素都有一列。

例如,L1$SPX是一个xts对象,其列是SPX的滚动方式,分别基于p1中的句点,其列名是句号(系列本身是滚动均值)为1,因此标记为"1")。

p1 <- c(1, periods)
L <- lapply(p1, rollmeanr, x = do.call(merge, datalist))
f <- function(i) setNames(do.call(merge, lapply(L, function(x) x[, i])), p1)
L1 <- setNames(lapply(seq_along(datalist), f), symbollist)

2)另一种方法是:

p1 <- c(1, periods)
f2 <- function(i) setNames(do.call(cbind, 
         lapply(p1, function(p) rollmeanr(datalist[[i]], p))), p1)
L2 <- setNames(lapply(seq_along(datalist), f2), symbollist)