2016-07-07 48 views
5

Pobieram cytaty z yahoo z quantmod, obliczam kwartalne powroty i chcę scalić zwroty i cytaty w jeden obiekt xts. W tym nowym obiekcie chciałbym zobaczyć tylko datę, w której mam zarówno zwrot, jak i kwartalny zwrot (zwykle ostatni dzień kwartału). Co widzę jednak jest to:Scalaj obiekty xts z różnymi interwałami czasowymi

2011-06-29 appears two time

Oto kod:

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) 

Każdy pomysł?

Odpowiedz

5

Podczas gdy FXQuantTrader's answer rozwiązuje problem, nie diagnozuje on prawidłowo ani nie rozwiązuje głównej przyczyny.

Nie ma nic złego w łączeniu dwóch obiektów XTS, które mają różne klasy indeksu, ponieważ wszystkie obiekty Xts przechowują indeks jako POSIXct wewnętrznie. Na przykład:

d <- Sys.Date() 
merge(date=xts(1,d), posixct=xts(2,as.POSIXct(d,tz="UTC"))) 
      date posixct 
# 2016-07-09 1  2 

Problem polega na tym, że dwa obiekty Xts mają różne strefy czasowe. Zauważ, że dataset ma strefę czasową UTC, ponieważ indeks daty nie może mieć strefy czasowej.

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" 

Ale QReturns ma „pusty” TZ atrybut (co oznacza, że ​​lokalna strefa czasowa jest używana).

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 wygląda tak dlatego, że nazywa as.xts na data.frame i as.xts.data.frame określa dateFormat = "POSIXct" domyślnie. Jeśli ustawisz dateFormat = "Date", nie będziesz miał problemu z połączeniem tych dwóch obiektów.

Należy również pamiętać, że niewłaściwe jest wywoływanie metod bezpośrednio (merge.xts). Powinieneś po prostu zadzwonić do generic merge i pozwolić, aby wywołanie metody obsługi systemu S3 zostało wykonane.

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 

Osobiście uniknąć to wszystko razem przez nie konwersji z XTS do data.frame powrotem do XTS przy obliczaniu QReturns. Możesz zadzwonić pod numer lapply bezpośrednio na obiekt Xts, a następnie połączyć wyniki ponownie za pomocą do.call(merge, ...).

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

Twój getSymbols i "połączyć" kroki mogą być również wykonane bardziej zwięźle:

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. Wielkie dzięki. –

+0

Interesujące. Dziękuję za udostępnienie – FXQuantTrader

3

Twój problem pojawia się, ponieważ mają różne rodzaje obiektów czas:

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

chcesz przekonwertować do tej samej klasy przy użyciu merge.xts. Można spróbować, za pomocą poręcznego lubridate funkcji floor_date, który zaokrągla w dół czas POSIXct z dokładnością do dnia, w którym istnieje niezerowe godziny dołączone do wartości obiektu POSIXct:

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 

Alternatywnie, zamiast floor_date można również użyć bazy R round.POSIXt, tak jak: as.POSIXct(round.POSIXt(as.POSIXct(index(dataset)), "day"))

+0

Thx dużo roboty doskonale teraz –