如何用R从Yahoo Finance抓取多只股票的历史财报数据?
当然可以!用R抓取Yahoo Finance的历史财务报表(利润表、资产负债表、现金流量表)完全没问题,我给你整理了两种实用的方法,上手都不难:
方法1:用
tidyquant包(推荐,简单高效) tidyquant是基于tidyverse的量化分析工具包,封装了Yahoo Finance的接口,能直接拉取标准化的财务数据,不用自己处理网页结构。
- 先安装并加载包:
install.packages("tidyquant") library(tidyquant)
- 抓取单只股票的财务数据:
- 利润表(默认年度数据,要季度的话加
period = "quarterly"):
aapl_income <- tq_get("AAPL", get = "financials", period = "yearly")
- 资产负债表:
aapl_balance <- tq_get("AAPL", get = "balance_sheet", period = "yearly")
- 现金流量表:
aapl_cashflow <- tq_get("AAPL", get = "cash_flow", period = "yearly")
返回的结果是tidy格式的数据框,直接就能用dplyr、ggplot2这些工具分析。
方法2:用
rvest直接网页抓取(灵活自定义) 如果tidyquant的接口有变动,或者你需要更定制化的数据提取,可以直接用rvest爬取网页内容。以AAPL的利润表为例:
- 安装并加载所需包:
install.packages(c("rvest", "dplyr", "purrr")) library(rvest) library(dplyr) library(purrr)
- 抓取并处理利润表数据:
# 利润表网页URL url_income <- "https://finance.yahoo.com/quote/AAPL/financials?p=AAPL" page_income <- read_html(url_income) # 提取表格数据并整理 income_table <- page_income %>% html_table(fill = TRUE) %>% pluck(1) %>% # 取第一个表格(Yahoo的财务报表是第一个表格) rename(Metric = 1) %>% # 把第一列重命名为Metric filter(Metric != "") # 过滤空行
要抓取资产负债表或现金流量表,只需要把URL里的financials换成balance-sheet或cash-flow就行。不过要注意:Yahoo的网页结构可能会更新,所以如果代码失效,需要检查网页的表格结构,调整提取逻辑。
批量处理多只股票
如果要同时分析多只股票,用purrr的map函数就能批量抓取:
# 定义要分析的股票代码列表 tickers <- c("AAPL", "MSFT", "GOOGL") # 批量抓取利润表数据 all_income_statements <- map(tickers, ~tq_get(.x, get = "financials")) %>% set_names(tickers) # 给列表元素命名为股票代码 # 查看其中一只的结果 all_income_statements$AAPL
注意事项
- Yahoo Finance的API或网页结构可能会不定期变更,所以如果某段代码突然失效,记得检查包的最新版本或网页结构
- 有些财务数据可能存在缺失值,抓取后记得用
na.omit()或其他方法清理数据 - 不要频繁请求Yahoo的服务器,避免被限制访问
内容的提问来源于stack exchange,提问作者FrankUnderwood268
相关产品推荐
相关产品推荐

