0

我正在尝试使用 blpapi 在 R 中下载一些有关欧元掉期(例如 EUSA10 货币)的时间序列数据,但我遇到了以下问题:

  1. 如果我尝试使用该选项下载例如 2y、5y、10y 和 30y 掉期利率include.non.trading.days=FALSE,则生成的时间序列由于某种原因长度不同,并且我收到有关它的消息错误。另一方面,如果我将非交易日选项设置为 true,我有类似的长度时间序列,然后可以使用 na.omit() 函数进行清理
  1. 下载数据的格式很混乱...我想要一个数据框,其中第一列为日期,第二列为第一证券,第三列为第二证券,依此类推。相反,我得到的是[date][security][date][security2]......[date][securityN]。关于如何解决这个问题的任何建议?

下面是我作为示例编写的几行代码

# Load package
library(Rblpapi)
# Connect to Bloomberg
blpConnect()
# Declaring securities
sec<-c("eusa2 curncy", "eusa5 curncy", "eusa10 curncy")
# Declaring field to be dowloaded
flds<-"PX_LAST" 

data<-as.data.frame(bdh(sec,flds,start.date=as.Date("2019-08-18"),end.date=as.Date("2020-08-18"), include.non.trading.days=TRUE"))

输出

4

1 回答 1

1

在 Rblapi手册中声明Rblapi::bdh返回

包含与证券条目一样多的条目的列表;每个列表都包含一个 data.frame,每个观察值一行,列数与字段中的条目一样多。如果列表长度为 1,则将其折叠为单个数据框。请注意,返回证券的顺序由后端决定,可能与证券领域的证券顺序不同。

所以我建议你rbind数据然后重塑它以获得你想要的结果。一种快速的方法是使用data.table::rbindlist函数,它将一个列表作为输入并返回一个data.table包含所有条目的函数,如果idcol=TRUE这样,它将附加一个.id列,显示 data.frame 的来源。即使调用data.frame产生的 s中的行数不同,此方法也将起作用Rblapi::bdh

# Declaring field to be dowloaded
flds<-"PX_LAST" 

# LOADING THE DATA FROM THE API
l <- bdh(sec,flds,start.date=as.Date("2019-08-18"),end.date=as.Date("2020-08-18"), include.non.trading.days=TRUE)

# the names of the securities columns as returned by the api
securities <- paste0("eusa", c(2,5,10,15,30), ".curncy.",flds)

# row binding the resulting list
dt <- data.table::rbindlist(l, idcol=T, use.names=FALSE) 
# idcol=T appends an id column (.id) to the resulting data.table
# use.names=F because the columns of the data.frames are different

# remaking the .id column so it reflects the name of the column that it already had
dt[, .id:= securities[.id] ]


# making a wider data.table
data.table::dcast(dt, eusa2.curncy.date ~ .id, value.var=securities[1]) 
# eusa2.curncy.date is the column that defines a group of observation
# .id the name of the columns
# securities[1] or eusa2.curncy.PX_LAST is the column that contains the values

使用的数据

由于我无法访问bloomberg api端点,因此我创建了这个类似于输出的模拟数据dbh

col.names <- paste0("eusa", rep(c(2,5,10,15,30),each=2), ".curncy.", rep(c(flds,"date"), 5))
l<-rep(list(data.frame(rnorm(200), 1:200)), 5)

for (i in 1:length(l)) colnames(l[[i]]) <- col.names[(2*i-1):(2*i)]
于 2020-08-18T16:51:57.023 回答