如何将Excel STOCKHISTORY获取的股票数据转为R中的列表?
解决方案建议
方案1:优先选择Excel VBA批量导出CSV方案(稳定性最高)
你提到的VBA方案1是4000+股票场景下可行性最高的选择,不会出现工作表过多导致Excel崩溃的问题,以下是可直接使用的实现逻辑:
- 先将你的股票代码、起始日期、结束日期表放在名为
参数表的工作表,第一列为Ticker、第二列为start_date、第三列为end_date,表头固定在第1行 - 新建一个空文件夹专门存放输出的CSV,比如
D:\stock_csv - 运行以下VBA宏:
Sub 批量导出股票历史数据() Dim ws As Worksheet, lastRow As Long, i As Long Dim outputPath As String, ticker As String, sDate As Date, eDate As Date Dim tempWs As Worksheet, fName As String Set ws = ThisWorkbook.Sheets("参数表") lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row outputPath = "D:\stock_csv\" ' 请替换为你自己的输出路径 Application.ScreenUpdating = False Application.DisplayAlerts = False For i = 2 To lastRow ticker = ws.Cells(i, "A").Value sDate = ws.Cells(i, "B").Value eDate = ws.Cells(i, "C").Value fName = outputPath & ticker & ".csv" ' 新建临时工作表存放单只股票数据 Set tempWs = ThisWorkbook.Sheets.Add ' 调用STOCKHISTORY函数 tempWs.Range("A1").Formula2 = "=STOCKHISTORY(""" & ticker & """," & CLng(sDate) & "," & CLng(eDate) & ",0,1)" ' 公式转为静态值避免后续变动 tempWs.UsedRange.Value = tempWs.UsedRange.Value ' 导出为UTF-8编码的CSV文件 tempWs.SaveAs Filename:=fName, FileFormat:=xlCSVUTF8 tempWs.Delete Next i Application.ScreenUpdating = True Application.DisplayAlerts = True MsgBox "导出完成,共" & lastRow - 1 & "个CSV文件" End Sub
导出完成后,直接用以下R代码批量读取生成目标列表:
library(data.table) csv_path <- "D:/stock_csv/" # 和VBA里设置的输出路径保持一致 csv_files <- list.files(csv_path, pattern = "\\.csv$", full.names = TRUE) # 生成命名列表,每个元素对应单只股票的时间序列 stock_list <- lapply(csv_files, function(x) { dt <- fread(x) # 列名可根据STOCKHISTORY实际输出的字段调整 setnames(dt, c("date", "close", "open", "high", "low", "volume")) dt[, date := as.Date(date)] return(dt) }) names(stock_list) <- gsub("\\.csv$", "", basename(csv_files))
方案2:Windows环境下纯R调用Excel STOCKHISTORY函数
如果不想手动操作VBA,且你使用的是Windows系统、已安装Office Excel,可以用RDCOMClient包直接在R后台调用Excel接口获取数据,无需手动打开Excel文件:
# 先安装依赖包 # install.packages("RDCOMClient", repos = "http://www.omegahat.net/R") library(RDCOMClient) library(data.table) # 提前把你的参数表导出为CSV存到R工作目录,读取参数 param_dt <- fread("你的参数表.csv") # 启动后台Excel进程 excel_app <- COMCreate("Excel.Application") excel_app[["Visible"]] <- FALSE # 后台运行不显示窗口 stock_list <- list() for (i in 1:nrow(param_dt)) { ticker <- param_dt$Ticker[i] sdate <- as.numeric(param_dt$起始日期[i]) edate <- as.numeric(param_dt$结束日期[i]) # 调用STOCKHISTORY函数 res <- excel_app$WorksheetFunction$StockHistory(ticker, sdate, edate, 0, 1) # 转换为data.table格式 dt <- as.data.table(matrix(unlist(res), ncol = length(res[[1]]), byrow = TRUE)) setnames(dt, c("date", "close", "open", "high", "low", "volume")) dt[, date := as.Date(date, origin = "1899-12-30")] stock_list[[ticker]] <- dt } # 退出Excel进程,避免残留后台进程占用资源 excel_app$Quit()
注意:该方案仅支持Windows系统,运行时不要打开其他Excel文件避免接口冲突。可以加
tryCatch逻辑跳过单只股票的获取错误,不影响整体运行。
内容的提问来源于stack exchange,提问作者Eddytheturtle
相关产品推荐
相关产品推荐

