使用R从彭博(Bloomberg)导入历史价格时重复date列问题求解
问题原因
你调用bdh()接口传入多只标的时,返回结果是嵌套列表结构,每个标的对应一个子列表,自带date和价格列,直接转换为数据框会把所有子列表的列依次拼接,就会出现多列重复date的问题。
调整后实现代码
提供两种实现方案,按需选择即可:
方案1:tidyverse生态简洁实现(代码可读性高)
# 安装依赖包(仅首次运行需要) install.packages(c("Rblpapi", "tidyverse", "writexl")) # 加载包 library(Rblpapi) library(tidyverse) library(writexl) # 连接彭博终端 blpConnect() # 配置标的和取数字段 tickers <- c("SPX INDEX","BXIIE3MC Index") myField <- "PX_LAST" # 拉取原始数据 raw_data <- bdh( tickers, myField, start.date = as.Date("2019-12-31"), include.non.trading.days = TRUE ) # 数据清洗:仅保留1个日期列,其余列对应标的价格 Benchmark <- raw_data %>% # 重命名价格列为对应标的代码 imap(~rename(.x, !! .y := all_of(myField))) %>% # 按日期列合并所有标的数据 reduce(left_join, by = "date") # 导出到Excel write_xlsx(Benchmark, "彭博历史价格数据.xlsx")
方案2:纯base R实现(无需额外加载tidyverse包)
# 安装依赖包(仅首次运行需要) install.packages(c("Rblpapi", "writexl")) # 加载包 library(Rblpapi) library(writexl) # 连接彭博终端 blpConnect() # 配置标的和取数字段 tickers <- c("SPX INDEX","BXIIE3MC Index") myField <- "PX_LAST" # 拉取原始数据 raw_data <- bdh( tickers, myField, start.date = as.Date("2019-12-31"), include.non.trading.days = TRUE ) # 数据清洗:仅保留1个日期列,其余列对应标的价格 Benchmark <- raw_data[[1]] colnames(Benchmark) <- c("date", names(raw_data)[1]) for (i in 2:length(raw_data)) { temp <- raw_data[[i]] colnames(temp) <- c("date", names(raw_data)[i]) Benchmark <- merge(Benchmark, temp, by = "date", all.x = TRUE) } # 导出到Excel write_xlsx(Benchmark, "彭博历史价格数据.xlsx")
效果说明
处理后得到的Benchmark第一列为统一的日期字段,后续每一列对应一个标的的PX_LAST历史价格,没有重复日期列,可直接写入Excel使用。
内容的提问来源于stack exchange,提问作者TaibaCo
相关产品推荐
相关产品推荐

