r - 合并不同时间间隔的xts对象

标签 r merge time-series xts quantmod

我使用 quantmod 从 yahoo 下载报价,计算季度返回并希望将返回和报价合并到一个 xts 对象中。在这个新对象中,我只想查看同时获得返回和季度返回的日期(通常是季度的最后一天)。然而,我看到的是:

2011-06-29 appears two time

这是代码:

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)

任何的想法?

最佳答案

FXQuantTrader's answer解决了问题,但它没有正确诊断或解决根本原因。

合并两个具有不同索引类的 xts 对象并没有错,因为所有 xts 对象在内部都将索引存储为 POSIXct。例如:

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

问题是因为您的两个 xts 对象具有不同的时区。请注意 dataset有 UTC 时区,因为日期索引不能有时区。
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"

但是QReturns有一个“空”TZ 属性(这意味着使用您的本地时区)。
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看起来像这样,因为您调用了 as.xts在 data.frame 上,和 as.xts.data.frame指定 dateFormat = "POSIXct"默认情况下。如果设置 dateFormat = "Date" ,合并这两个对象不会有问题。

另请注意,直接调用方法( merge.xts )是不好的做法。您应该调用 merge通用并让 S3 系统处理方法分派(dispatch)。
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

我个人会通过在计算 QReturns 时不将 xts 转换回 data.frame 来避免这一切。 .您可以调用lapply直接在 xts 对象上,然后使用 do.call(merge, ...) 将结果重新合并在一起.
QReturns <- do.call(merge, lapply(dataset, quarterlyReturn))
Quarterly_Portfolio <- merge(dataset, QReturns)

您的 getSymbols和“组合”步骤也可以更紧凑地完成:
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))

关于r - 合并不同时间间隔的xts对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38240389/

相关文章:

c++ - 将两个 Gdiplus::Bitmap 合并为一个 C++

SAS 中的 Merge 与 Set 语句

python - 将 groupby 函数应用于 df 的 Matplotlib 时间序列图

python-3.x - Python fbprophet - 每年从 plot_components() 导出值

r - PCA实现后如何提取行名称?

r - 通过 texreg 输出广义线性模型

R:根据不同列的顺序对列重新排序

r - 如何让 R 的 lapply(和 mclapply)恢复随机数生成器的状态?

c# - 基于键 c# 合并两个列表

python - 在 +/- 2 个工作日的日期切片 pandas 时间序列