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))
Wow. Wielkie dzięki. –
Interesujące. Dziękuję za udostępnienie – FXQuantTrader