将 rollmean 应用于多个时间序列,多个 windows
applying rollmean to multiple time series, with multiple windows
我需要为多个时间序列对象生成不同长度的滚动平均值。理想情况下,我会为每个时间序列对象留下一个数据框,滚动平均值存储在相邻的列中。我能够为其中一个对象生成我想要的输出,但速度很慢,我需要能够在多个系列中复制它。我已经尝试使用 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)
使用下面的代码我可以生成我想要的东西,但我想使用更广泛的 windows.
数组在几个不同的时间序列中复制它
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)首先产生一个列表L
,三个分量分别包含三个时期的滚动方式。剩余的行将其重新加工成与 datalist
(和 symbollist
)长度相同的列表 L1
,以便每个组件都有一个列用于 p1
的每个元素。
例如,L1$SPX
是一个 xts 对象,其列分别是基于 p1
中周期的 SPX 滚动均值,其列名是周期数(其中序列本身是一个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)
我需要为多个时间序列对象生成不同长度的滚动平均值。理想情况下,我会为每个时间序列对象留下一个数据框,滚动平均值存储在相邻的列中。我能够为其中一个对象生成我想要的输出,但速度很慢,我需要能够在多个系列中复制它。我已经尝试使用 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)
使用下面的代码我可以生成我想要的东西,但我想使用更广泛的 windows.
数组在几个不同的时间序列中复制它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)首先产生一个列表L
,三个分量分别包含三个时期的滚动方式。剩余的行将其重新加工成与 datalist
(和 symbollist
)长度相同的列表 L1
,以便每个组件都有一个列用于 p1
的每个元素。
例如,L1$SPX
是一个 xts 对象,其列分别是基于 p1
中周期的 SPX 滚动均值,其列名是周期数(其中序列本身是一个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)