2016-07-07 10 views
5

Ich lade Zitate von Yahoo mit quantmod herunter, berechne vierteljährliche Rückgaben und möchte die Rückgaben und Anführungszeichen in ein xts-Objekt zusammenführen. In diesem neuen Objekt möchte ich nur das Datum sehen, an dem ich sowohl eine Rendite als auch eine vierteljährliche Rendite (typischerweise letzter Tag des Quartals) habe. Was ich sehe, aber das ist:Zusammenführen von xts-Objekten mit unterschiedlichen Zeitintervallen

2011-06-29 appears two time

Hier ist der Code:

library(quantmod) 

#Define stocks 
tickers<-c("DBK.DE","DTE.DE") 
stock<-tickers 
StartDate<-'2011-6-25' 
EndDate<-'2016-06-25' 

PF <- getSymbols(tickers, src='yahoo', from=StartDate, to=EndDate) 

# combine the adjusted close values in one (xts) object 
dataset <- Ad(get(PF[1])) 
for (i in 2:length(PF)) { 
    dataset <- merge(dataset, Ad(get(PF[i]))) 
} 

#Getting Quarterly Returns 
QReturns<-as.xts(as.data.frame(lapply(dataset,quarterlyReturn))) 

#Here is where I suspect the problem 
Quarterly_Portfolio<-merge.xts(dataset,QReturns) 

Jede Idee?

Antwort

5

Während FXQuantTrader's answer das Problem löst, diagnostiziert oder adressiert es nicht richtig die Ursache.

Es ist nichts Falsches daran, zwei xts-Objekte mit unterschiedlichen Indexklassen zusammenzuführen, da alle xts-Objekte den Index intern als POSIXct speichern. Zum Beispiel:

Das Problem liegt daran, dass Ihre beiden XTS-Objekte unterschiedliche Zeitzonen haben. Beachten Sie, dass dataset eine UTC-Zeitzone hat, da ein Date-Index keine Zeitzone haben kann.

R> str(dataset) 
An ‘xts’ object on 2011-06-27/2016-06-24 containing: 
    Data: num [1:1305, 1:2] 33.5 34.3 34.6 35.1 36 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:2] "DBK.DE.Adjusted" "DTE.DE.Adjusted" 
    Indexed by objects of class: [Date] TZ: UTC 
    xts Attributes: 
List of 2 
$ src : chr "yahoo" 
$ updated: POSIXct[1:1], format: "2016-07-09 08:21:12" 

Aber QReturns hat ein ‚leeres‘ TZ-Attribut (was bedeutet, dass Ihre lokale Zeitzone verwendet wird).

R> str(QReturns) 
An ‘xts’ object on 2011-06-30/2016-06-24 containing: 
    Data: num [1:21, 1:2] 0.047 -0.354 0.118 0.267 -0.215 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:2] "quarterly.returns" "quarterly.returns.1" 
    Indexed by objects of class: [POSIXct,POSIXt] TZ: 
    xts Attributes: 
NULL 

QReturns sieht wie folgt aus, weil Sie as.xts auf einem data.frame genannt, und as.xts.data.frame gibt dateFormat = "POSIXct" standardmäßig. Wenn Sie dateFormat = "Date" festlegen, haben Sie kein Problem beim Zusammenführen dieser beiden Objekte.

Beachten Sie auch, dass es eine schlechte Methode ist, Methoden direkt aufzurufen (merge.xts). Sie sollten einfach den merge Generic aufrufen und das S3-System den Methodenversand verarbeiten lassen.

QReturns <- as.xts(as.data.frame(lapply(dataset,quarterlyReturn)),dateFormat="Date") 
Quarterly_Portfolio <- merge(dataset,QReturns) 
head(Quarterly_Portfolio) 
#   DBK.DE.Adjusted DTE.DE.Adjusted quarterly.returns quarterly.returns.1 
# 2011-06-27   33.5422   7.820    NA     NA 
# 2011-06-28   34.2747   7.786    NA     NA 
# 2011-06-29   34.6194   7.909    NA     NA 
# 2011-06-30   35.1193   8.085  0.04701838   0.03388747 
# 2011-07-01   36.0286   7.992    NA     NA 
# 2011-07-04   35.7787   7.995    NA     NA 

Ich persönlich würde dies vermeiden alle zusammen durch nicht von xts Umwandlung zu xts data.frame zurück, wenn QReturns Berechnung. Sie können lapply direkt an einem xts-Objekt aufrufen und dann die Ergebnisse unter Verwendung von do.call(merge, ...) wieder zusammenführen.

QReturns <- do.call(merge, lapply(dataset, quarterlyReturn)) 
Quarterly_Portfolio <- merge(dataset, QReturns) 

Ihre getSymbols und "verbinden" Schritte können auch kompakter gemacht werden:

PF <- new.env() 
getSymbols(tickers, from=StartDate, to=EndDate, env=PF) 
# combine the adjusted close values in one (xts) object 
dataset <- do.call(merge, eapply(PF, Ad)) 
+0

Wow. Vielen Dank. –

+0

Interessant. Danke für das Teilen – FXQuantTrader

3

Ihr Problem entsteht, weil verschiedene Arten von Zeitobjekte haben:

> class(index(dataset)) 
[1] "Date" 
> class(index(QReturns)) 
[1] "POSIXct" "POSIXt" 

Sie wollen die gleiche Klasse konvertieren, wenn merge.xts verwenden. Man könnte dies versuchen, mit Hilfe der praktischen lubridate Funktion floor_date, die zum nächsten Zeitpunkt eine POSIXct Zeit abrundet, wenn es nicht Null Stunden auf die Objektwerte POSIXct angehängt:

require(lubridate) 
index(dataset) <- floor_date(as.POSIXct(index(dataset)), "day") 
Quarterly_Portfolio<-merge.xts(dataset,QReturns) 

> head(Quarterly_Portfolio) 
      DBK.DE.Adjusted DTE.DE.Adjusted quarterly.returns quarterly.returns.1 
2011-06-27   33.5422   7.820    NA     NA 
2011-06-28   34.2747   7.786    NA     NA 
2011-06-29   34.6194   7.909    NA     NA 
2011-06-30   35.1193   8.085  0.04701838   0.03388747 
2011-07-01   36.0286   7.992    NA     NA 
2011-07-04   35.7787   7.995    NA     NA 

Alternativ kann statt floor_date Sie könnten auch Basis-R round.POSIXt wie folgt verwenden: as.POSIXct(round.POSIXt(as.POSIXct(index(dataset)), "day"))

+0

Thx viel funktioniert perfekt jetzt –

Verwandte Themen