2016-12-01 4 views
0

Ich frage mich, ob es möglich ist, benutzerdefinierte Perioden zu aggregieren.R xts to.period für benutzerdefinierte tägliche Aggregationsperioden

Ich habe versucht, to.period(x,"day",3,OHLC=FALSE) zu aggregieren, aber es hat nicht funktioniert, da es gerade die letzte Periode zurückgegeben hat.

Zum Beispiel lassen Sie x ein 2 Tage xts Objekt mit OHLC-Daten sein.

   Open  High  Low Close Volume 
1999-11-18 30.65656 33.68852 26.95082 28.80369 66392936 
1999-11-19 28.93002 28.97213 26.82449 27.45615 16173015 

Kann ich mit irgendwelchen XTS-Tools zu einer einzelnen Zeile aggregieren?

so die Ergebnisse, die ich würde aussehen wie wünschen:

   Open  High  Low Close Volume 
1999-11-19 30.65656 33.68852 26.82449 27.45615 82565951 

wo die offene, in den ersten Tagen geöffnet ist, hoch ist das maximale der beiden Tage, niedriger ist die geringe der beiden Tage, und in der Nähe ist die letzten Tage in der Nähe. Volumen ist nur die Summe der Lautstärke für die zwei Tage. Ich möchte, dass diese Lösung verallgemeinert und skalierbar ist, wie ich dies für ein ganzes N by M xts-Objekt tun möchte. Ich werde k angeben. In dem obigen Fall, k=2 .... so alle 2 Tage, aggregiere ich in eins.

Antwort

1

Mit OHLC=TRUE können Sie einen Teil des Weges bekommen.

AAPL1 <- to.period(AAPL,"days",k = 2,OHLC=TRUE) 

head(AAPL1) 
# AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted 
# 2007-01-04  86.29  86.58 81.90  85.66 521395000  11.14619 
# 2007-01-05  85.77  86.20 84.40  85.05 208685400  11.06681 
# 2007-01-08  85.96  86.53 85.28  85.47 199276700  11.12147 
# 2007-01-10  86.45  97.80 85.15  97.00 1575544600  12.62176 
# 2007-01-12  95.94  96.78 93.23  94.62 688235800  12.31207 
# 2007-01-16  95.68  97.25 95.45  97.10 311019100  12.63477 

Aber die Art und Weise to.period wird alle 2 Tage der Berechnung für Sie nicht wünschenswert sein können (einige Aggregationszeiten zurückkehren noch 1 bar von Daten aufgrund von Problemen wie Wochenenden usw.). Wenn Geschwindigkeit keine große Rolle für Sie spielt, können Sie die Balken von Grund auf in R erstellen (to.period ist schneller mit C-Code unter der Haube). Mit diesem Ansatz können Sie die Datenaggregation wesentlich flexibler gestalten.

getSymbols("AAPL") 

head(AAPL, 12) 
#AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted 
#2007-01-03  86.29  86.58 81.90  83.80 309579900  10.90416 
#2007-01-04  84.05  85.95 83.82  85.66 211815100  11.14619 
#2007-01-05  85.77  86.20 84.40  85.05 208685400  11.06681 
#2007-01-08  85.96  86.53 85.28  85.47 199276700  11.12147 
#2007-01-09  86.45  92.98 85.15  92.57 837324600  12.04533 
#2007-01-10  94.75  97.80 93.45  97.00 738220000  12.62176 
#2007-01-11  95.94  96.78 95.10  95.80 360063200  12.46562 
#2007-01-12  94.59  95.06 93.23  94.62 328172600  12.31207 
#2007-01-16  95.68  97.25 95.45  97.10 311019100  12.63477 
#2007-01-17  97.56  97.60 94.82  94.95 411565000  12.35501 
#2007-01-18  92.10  92.11 89.05  89.07 591151400  11.58990 
#2007-01-19  88.63  89.65 88.12  88.50 341118400  11.51573 
# You want to aggregate every 2 full trading days of data, so have the endpoints of each aggregation period simply increment by 2. 
ep2d <- seq(0, NROW(ep), by = 2) 

m2 <- period.apply(AAPL,INDEX=ep2d,FUN= 
         function(x) { 

          xts(x = matrix(c(coredata(Op(x))[1], max(coredata(Hi(x))), min(coredata(Lo(x))), coredata(Cl(x))[NROW(x)], 
              sum(coredata(Vo(x)))), nrow =1), order.by= index(x)[NROW(x)], 
          dimnames = list(NULL, c("Open", "High", "Low", "Close", "Volume"))) 
         }) 

head(m2) 
# Open High Low Close  Volume 
# 2007-01-04 86.29 86.58 81.90 85.66 521395000 
# 2007-01-08 85.77 86.53 84.40 85.47 407962100 
# 2007-01-10 86.45 97.80 85.15 97.00 1575544600 
# 2007-01-12 95.94 96.78 93.23 94.62 688235800 
# 2007-01-17 95.68 97.60 94.82 94.95 722584100 
# 2007-01-19 92.10 92.11 88.12 88.50 932269800 
Verwandte Themen