使用R获取多条Quandl期货曲线:技术问题求助
解决Quandl获取期货数据生成多列xts对象的问题
我来帮你搞定这个问题~首先拆解下你遇到的两个核心问题:
1. 关于“Error: object of type 'closure' is not subsettable”错误
这个报错大概率是因为你把变量名和内置函数重名了!比如xts本身是创建时间序列对象的函数,如果你把自己要存储数据的变量也命名为xts,后续当你尝试用xts[,1]这种方式子集化时,R会把xts当成函数来处理,自然就会报错“闭包类型(函数)的对象不能被子集化”。
解决办法很简单:给你的数据变量换个名字,比如futures_xts、crude_futures这类不会和内置函数冲突的名称。
2. 生成CL1到CL12多列的正确姿势
你现在只生成一列,应该是没有正确批量获取并合并多个合约的数据。下面给你一套完整的可运行代码方案:
第一步:加载必要的包
library(Quandl) library(xts)
第二步:配置Quandl密钥(如果需要)
如果你的Quandl调用次数超过免费额度,需要先设置密钥:
Quandl.api_key("你的Quandl密钥") # 替换成你自己的密钥
第三步:批量获取并合并数据
# 生成CL1到CL12的合约名称列表 contract_codes <- paste0("CL", 1:12) # 用lapply批量获取每个合约的结算价,并转为xts对象 futures_list <- lapply(contract_codes, function(code) { # 构造Quandl的完整代码(以CME原油期货为例,若你是其他交易所需调整前缀) quandl_full_code <- paste0("CHRIS/CME_", code) # 只获取日期和结算价两列 raw_data <- Quandl(quandl_full_code, columns = c("Date", "Settle")) # 转换为xts对象,用日期作为索引 xts(raw_data$Settle, order.by = raw_data$Date) }) # 给列表中的每个xts对象命名,对应CL1到CL12 names(futures_list) <- contract_codes # 合并列表中的所有xts对象为一个多列的xts对象 final_futures_xts <- do.call(merge, futures_list)
第四步:验证结果
运行下面的代码查看生成的对象,应该能看到12列分别对应CL1到CL12的结算价:
# 查看前5行数据 head(final_futures_xts, 5) # 查看列名 colnames(final_futures_xts)
额外注意点
- 如果你获取的是其他交易所的期货,需要调整Quandl代码的前缀(比如上面用的是
CHRIS/CME_,对应CME交易所的合约),你可以根据实际合约的Quandl代码修改这部分。 - 如果某个合约没有数据,
lapply会返回空值,合并时可能会出现NA,你可以在循环里加个判断跳过空数据。
内容的提问来源于stack exchange,提问作者RulesOfTheGame
相关产品推荐
相关产品推荐

