You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:36:16