【问题标题】:Using R to Analyze Balance Sheets and Income Statements使用 R 分析资产负债表和损益表
【发布时间】:2020-10-16 02:33:54
【问题描述】:

我对使用 R 分析资产负债表和损益表很感兴趣。我看到有 R 包可以从 Yahoo 和 Google Finance 中提取信息,但我看到的所有示例都涉及历史股价信息。有没有办法使用 R 从资产负债表和损益表中提取历史信息?

【问题讨论】:

  • 请考虑在这里为量化金融 stackexchange 网站的想法投票:meta.stackexchange.com/questions/5786/…
  • 资产负债表和损益表无法从 Yahoo 或 Google 获得,但可以从 SEC.GOV Edgar (sec.gov/edgar/search) 免费获得。有一个名为 parse-xbrl 的节点包,它将解析来自 Edgar 的 XBLR 实例文件和另一个可以使用 quantmod R 包的节点包 r-script。

标签: r finance


【解决方案1】:

我在网上只找到了您问题的部分解决方案,因为我设法只检索了一年的资产负债表信息和财务报表。我不知道该怎么做更多年。 R 中有一个名为 quantmod 的包,您可以从 CRAN 安装它

install.packages('quantmod')

然后您可以执行以下操作:假设您想从一家在纽约证券交易所上市的公司获取财务信息:通用电气。股票代码:GE

 library(quantmod)
 getFinancials('GE')
 viewFinancials(GE.f)

要仅获取每年报告的损益表,作为数据框使用:

viewFinancials(GE.f, "IS", "A")

如果您多年来一直知道如何做到这一点,请告诉我。

【讨论】:

【解决方案2】:

您想问并得到答案的问题是,我在哪里可以获得免费的 XBRL 数据来分析公司资产负债表,是否有在 R 中使用此类数据的库?

XBRL (Extensible Business Reporting Language - http://en.wikipedia.org/wiki/XBRL) 是一种以 XML 格式标记会计报表(损益表、资产负债表、损益表)的标准,以便它们可以很容易地被计算机解析并放入电子表格。

据我所知,很多公司监管机构(例如美国的 SEC、澳大利亚的 ASIC)都在鼓励其管辖范围内的公司使用这种格式进行报告,或者进行试点,但我不相信在这一点上,它已被授权。如果您将您的投资范围(我假设您希望这些电子格式的数据用于投资目的)限制在以 XBRL 形式免费提供其季度报告的公司,我希望您将有一个很短的公司名单可供投资!

Bloomberg、Reuters 等都拥有获取企业基本数据的昂贵数据源。也可能有人在经营着以 XBRL 格式发布资产负债表的整洁业务。 XIgnite 的 xFundamentalsxGlobalFundamentals 网络服务更便宜,但仍然需要付费,但您无法从它们那里获得完整的资产负债表数据。

【讨论】:

  • 谢谢吉姆。我对研究报告而不是投资报告感兴趣。我可以访问 Compustat,因此数据访问不是问题。但据我所知,Compustat 没有可用于将数据直接拉入 R 的 Web API,因此我对公共资源很感兴趣。
【解决方案3】:

要读入财务信息试试这个功能(几个月前我拿起它并做了一些小调整)

require(XML)
require(plyr)

getKeyStats_xpath <- function(symbol) {
  yahoo.URL <- "http://finance.yahoo.com/q/ks?s="
  html_text <- htmlParse(paste(yahoo.URL, symbol, sep = ""), encoding="UTF-8")

  #search for <td> nodes anywhere that have class 'yfnc_tablehead1'
  nodes <- getNodeSet(html_text, "/*//td[@class='yfnc_tablehead1']")

  if(length(nodes) > 0 ) {
    measures <- sapply(nodes, xmlValue)

    #Clean up the column name
    measures <- gsub(" *[0-9]*:", "", gsub(" \\(.*?\\)[0-9]*:","", measures))   

    #Remove dups
    dups <- which(duplicated(measures))
    #print(dups) 
    for(i in 1:length(dups)) 
      measures[dups[i]] = paste(measures[dups[i]], i, sep=" ")

    #use siblings function to get value
    values <- sapply(nodes, function(x)  xmlValue(getSibling(x)))

    df <- data.frame(t(values))
    colnames(df) <- measures
    return(df)
  } else {
    break
  }
}

要使用它,例如比较 3 家公司并将数据写入 csv 文件,请执行以下操作:

tickers <- c("AAPL","GOOG","F")
stats <- ldply(tickers, getKeyStats_xpath)
rownames(stats) <- tickers
write.csv(t(stats), "FinancialStats_updated.csv",row.names=TRUE) 

刚刚试了一下。还在工作。

随着雅虎更改其网站布局而更新:

由于雅虎再次更改其网站布局,上述功能不再起作用。幸运的是,获取财务信息仍然很容易,因为获取基本数据的标签没有更改。 下载 MSFT、AAPL 和福特的 eps 和市盈率文件的示例,将以下内容插入浏览器:

http://finance.yahoo.com/d/quotes.csv?s=MSFT+AAPL+F&f=ser

在浏览器的地址栏中输入上述 URL 并按回车键后。 CSV 将自动下载到您的计算机,您应该得到如下所示的 cvs 文件(数据为 2016 年 7 月 22 日):

一些基本数据的雅虎标签:

【讨论】:

  • 对我不起作用..我在想雅虎改变了一些东西
  • 我如何从雅虎获得整个资产负债表?某处是否有完整的标签列表?
  • @Canadian_Republican,您可以在http://www.marketindex.com.au/yahoo-finance-api# 找到最近可用标签的列表,但据我所知,您只能获得选定的项目。要获取完整的资产负债表或损益表,SEC 的 Edgar 服务可让您免费下载 excel 格式的资产负债表/损益表。转到https://www.sec.gov/edgar/searchedgar/companysearch.html。有许多可用的 R 包可让您导入 Excel 数据。
  • 优秀的列表为我提供了我需要的大部分信息,而 Quantmod 为我提供了其余的信息
  • 如何获得推荐评级,或者至少获得 css?
【解决方案4】:

您犯了一个常见错误,将“访问 Yahoo 或 Google 数据”与“我在 Yahoo 或 Google Finance 上看到的所有内容都可以下载”相混淆。

当 R 函数下载历史股票价格数据时,它们几乎总是访问为此目的明确设计的接口,例如一个 cgi 处理程序,提供给定股票代码和开始和结束日期的 csv 文件。所以这个简单我们需要做的就是形成适当的查询,点击网络服务器,获取csv文件并解析它。

现在资产负债表信息(据我所知)在这样的界面中不可用。因此,您需要“屏幕抓取”并直接解析 html。

目前尚不清楚 R 是否是最好的工具。我知道一些 Perl 模块用于从 Yahoo Finance 获取非时间序列数据,但没有使用它们。

【讨论】:

  • 感谢 Dirk 的快速回答。进一步检查后,我发现包“quantmod”有一个名为“getFinancials”的功能,并且 quantmod 的手册将其功能指定为:“从 Google Finance 下载损益表、资产负债表和现金流量表”。现在我试了一下,但它返回了一个神秘的错误(下标越界)。现在这是否意味着 quantmod 可以从谷歌财务中抓取财务信息,但我只是犯了一个错误,或者这样的功能不存在?欢迎任何澄清。再次感谢!
  • 好的,那么看起来 quantmod 包试图筛选抓取并且可能失败了。您可以向 r-sig-finance 发送关于您尝试过的操作和遇到的错误的可重现报告,包维护者会在该处看到它。
  • 把它放在那里:getFinancials/viewFinancials 不再从 Google Finance 检索财务数据:github.com/joshuaulrich/quantmod/issues/221
  • 当然。您评论了 2010 年 4 月的答案。有时情况会发生变化,免费资源会消失。这就是生活。
【解决方案5】:

考虑到最后两个 cmet,您可以使用 EdgardOnline 经济地获取公司财务报表。它不是免费的,但比彭博社和路透社便宜。要考虑的另一件事是财务报告规范化/标准化。仅仅因为两家公司处于同一行业并销售相似的产品并不一定意味着如果您将两家公司的损益表或资产负债表并排放置,则报告项目一定会对齐。 Compustat 具有标准化/标准化的财务报告。

【讨论】:

    【解决方案6】:

    我对 R 一无所知,但假设它可以调用 REST API 并使用 XML 格式的数据,您可以在http://www.mergent.com/servius/ 尝试 Mergent Company Fundamentals API - 有很多非常详细的财务报表数据(资产负债表/损益表/现金流量表/比率),跨公司标准化,可追溯到 20 多年前

    【讨论】:

      【解决方案7】:

      我编写了一个 C# 程序,我认为它可以满足您的需求。它解析来自 nasdaq.com 页面的 html。它解析 html 并为每只股票创建 1 个 csv 文件,其中包括 5 到 10 年的损益表、现金流和资产负债表值,具体取决于股票的年龄。我现在正在努力添加一些分析计算(此时主要是历史比率)。我有兴趣了解 R 及其在基本分析中的应用。也许我们可以互相帮助。

      【讨论】:

        【解决方案8】:

        我最近在 CRAN 上发现了这个 R 包。我相信这正是你所要求的。

        XBRL: Extraction of business financial information from XBRL documents

        【讨论】:

          【解决方案9】:

          您可以从 R 中的Intrinio 免费获取所有三种类型的财务报表。此外,您可以获得报告报表和标准化报表。从 SEC 提取 XBRL 文件的问题在于没有标准化选项,这意味着如果您想进行交叉股权比较,您必须手动映射财务报表项目。这是一个例子:

          #Install httr, which you need to request data via API
          install.packages("httr")
          require("httr")
          
          #Install jsonlite which parses JSON
          install.packages("jsonlite")
          require("jsonlite")
          
          #Create variables for your usename and password, get those at intrinio.com/login
          username <- "Your_API_Username"
          password <- "Your_API_Password"
          
          #Making an api call for roic. This puts together the different parts of the API call
          
          base <- "https://api.intrinio.com/"
          endpoint <- "financials/"
          type <- "standardized"
          stock <- "YUM"
          statement <- "income_statement"
          fiscal_period <- "Q2"
          fiscal_year <- "2015"
          
          #Pasting them together to make the API call
          call1 <- paste(base,endpoint,type,"?","identifier","=", stock, "&","statement","=",statement,"&","fiscal_period",
                         "=", fiscal_period, "&", "fiscal_year", "=", fiscal_year, sep="")
          
          # call1 Looks like this "https://api.intrinio.com/financials/standardized?identifier=YUM&statement=income_statement&fiscal_period=Q2&fiscal_year=2015"
          
          #Now we use the API call to request the data from Intrinio's database
          
          YUM_Income <- GET(call1, authenticate(username,password, type = "basic"))
          
          #That gives us the ROIC value, but it isn't in a good format so we parse it
          
          test1 <- unlist(content(YUM_Income, "text"))
          
          #Convert from JSON to flattened list
          
          parsed_statement <- fromJSON(test1)
          
          #Then make your data frame:
          
          df1 <- data.frame(parsed_statement)
          

          我编写此脚本是为了方便更改代码、日期和报表类型,以便您可以获取任何美国公司在任何时期的财务报表。

          【讨论】:

          • 这看起来很有希望,但他们似乎不再免费提供数据。它是 40 美元/月或 400 美元/年。 intrinio.com/data/…
          【解决方案10】:

          我实际上是在 Google 表格中执行此操作的。我认为这也是最简单的方法,因为它可以提取真实的实时数据是另一个奖励点。最后,它不会占用我的任何空间来保存这些语句。

          =importhtml("http://investing.money.msn.com/investments/stock-income-statement/?symbol=US%3A"&B1&"&stmtView=Ann", "table",0)

          其中 B1 单元格包含股票代码。

          您可以对资产负债表和现金流做同样的事情。

          【讨论】:

            【解决方案11】:

            1- 从 Rapid Api here订阅 yahoo Finance api

            2- 拿到你的钥匙

            3- 在代码中插入您的密钥:

            name="AAPL"
            {raw=httr::GET(paste("https://yahoo-finance15.p.rapidapi.com//api/yahoo/qu/quote/",name,"/financial-data", sep = ""),
                    httr::add_headers("x-rapidapi-host"= "yahoo-finance15.p.rapidapi.com",
                                "x-rapidapi-key"="insert your Key here")
            )
            raw=jsonlite::fromJSON(rawToChar(raw$content))
            values=sapply(1:length(raw$financialData),function(x){sapply(raw, "[", x)[[1]][1]})
            names(values)=names(raw$financialData)
            values=as.data.frame(t(values))
            row.names(values)=name
            }
            values
            

            优点:获取数据的简单方法

            缺点:免费版本限制为每月 500 个请求

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-11-30
              • 2022-11-13
              • 1970-01-01
              相关资源
              最近更新 更多