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

如何在R中下载CFTC持仓报告HTM文件并转换为表格

解决CFTC持仓报告从
节点转表格的问题 

嘿,我明白你现在卡在把CFTC持仓报告的

文本转成表格这一步了,别担心,咱们一步步来搞定它:

第一步:提取
标签里的纯文本 

你已经拿到了XML节点集tableNodes,首先要把里面的文本内容提取出来,用xmlValue就能轻松搞定:

# 提取节点中的纯文本内容
raw_text <- xmlValue(tableNodes[[1]])

第二步:清理文本行

这个文本是按行排列的,里面可能混有空行或者多余的说明行,咱们先把这些无效内容过滤掉:

# 按换行符拆分文本成单独行
text_lines <- strsplit(raw_text, "\n")[[1]]
# 过滤掉空行和全空白的行
text_lines <- text_lines[text_lines != "" & !grepl("^\\s*$", text_lines)]

你可以先打印前几行看看结构:head(text_lines, 5),这样能帮你确定后面要跳过多少表头行。

第三步:把固定宽度文本转成数据框

CFTC的持仓报告是固定宽度格式的,所以用read.fwf(固定宽度文件读取)最合适。首先你需要确定每一列的宽度——可以通过观察文本的列对齐情况来判断,比如农业持仓报告的列宽度大概是这样(你要根据实际内容调整):

# 先把清理后的文本写入临时文件,方便read.fwf读取
temp_file <- tempfile(fileext = ".txt")
writeLines(text_lines, temp_file)

# 读取固定宽度文件,skip参数是要跳过的表头行数(比如前3行是说明和表头)
cftc_data <- read.fwf(
  temp_file,
  widths = c(10, 15, 12, 12, 12, 12, 12), # 这里的宽度要根据实际调整!
  header = FALSE,
  skip = 3
)

第四步:给列命名并转换数据类型

接下来给数据框加上有意义的列名,再把数值列从字符转成数值型(注意要去掉千分位的逗号):

# 给列命名,对应CFTC报告的实际列
colnames(cftc_data) <- c(
  "Contract_Name", 
  "Noncommercial_Long", 
  "Noncommercial_Short", 
  "Commercial_Long", 
  "Commercial_Short", 
  "Total_Long", 
  "Total_Short"
)

# 把数值列转成数值类型(排除第一列合约名称)
cftc_data[, -1] <- lapply(cftc_data[, -1], function(x) as.numeric(gsub(",", "", x)))

可选:用rvest简化整个流程

如果你觉得XML包用起来有点繁琐,也可以用更简洁的rvest包来获取文本,步骤更直观:

library(rvest)
url <- 'https://www.cftc.gov/dea/options/ag_sof.htm'

# 直接抓取<pre>标签里的文本
raw_text <- read_html(url) %>% 
  html_element("pre") %>% 
  html_text()

# 后面的文本清理、转表格步骤和上面完全一样

小提醒

不同类型的CFTC报告(比如期货单独报告、期货+期权合并报告)的列结构和行数可能不一样,所以一定要根据你下载的页面调整skip的行数和widths的数值哦!

内容的提问来源于stack exchange,提问作者Jack Po

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:27:58