2016-01-13 5 views
1

J'ai besoin de produire des moyennes mobiles de différentes longueurs pour plusieurs objets de séries chronologiques. Idéalement, il me resterait une trame de données pour chaque objet de série temporelle avec les moyennes mobiles stockées dans des colonnes adjacentes. J'ai été capable de produire la sortie que je voulais pour l'un des objets, mais c'était lent et j'ai besoin de pouvoir reproduire cela sur plusieurs séries. J'ai essayé d'utiliser mapply et cbind, mais je ne finis pas avec des résultats utilisables ... merci pour toute aide que vous pouvez offrir!Application de rollmean à plusieurs séries chronologiques, avec plusieurs fenêtres

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) 

En utilisant le code ci-dessous je peux produire ce que je veux, mais je voudrais reproduire ce à travers plusieurs séries temporelles différentes en utilisant un plus large éventail de fenêtres. Il devrait ressembler à ceci, avec une base de données comme celle ci-dessous pour chaque objet de série chronologique.

  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 
+0

fenêtres ... ce qui signifie des périodes de temps? – mrp

Répondre

1

1) d'abord produire une liste L de trois composants contenant les moyens de roulement des trois périodes, respectivement. Les lignes restantes retravaillent cela dans une liste L1 de la même longueur que datalist (et symbollist) de sorte que chaque composant ait une colonne pour chaque élément de p1.

Par exemple, L1$SPX est un objet XTS dont les colonnes sont des moyens de roulement de SPX sur la base des périodes de p1 respectivement et dont les noms colonne sont les numéros de période (où la série est lui-même un rouleau en moyenne de 1, de sorte qu'il est étiqueté "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) Une autre approche est:

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) 
+0

Merci, cette réponse est fondamentalement parfaite, comment pourrais-je la modifier si je voulais que la solution produise plusieurs trames de données appelées par exemple "SPY.df" les prix et les moyennes mobiles dans les colonnes adjacentes? Puis produire une liste de ces données? – Fanderson

+0

Pas une bonne idée. Gardez-les dans les listes. –

+0

Ok, comment puis-je référencer les nouveaux objets xts si je veux comparer différentes moyennes mobiles, c'est-à-dire prendre SPY.10-SPY.50? – Fanderson