簡體   English   中英

getFinancials (quantmod) 和 tq_get (tidy quant) 不工作?

[英]getFinancials (quantmod) and tq_get (tidy quant) not working?

對於財務數據,我在 quantmod 和 tinyquant 中都遇到了同樣的錯誤。 誰能看看這是否可重現? 這是谷歌金融服務器的問題嗎? 以下功能都沒有為我工作。我不確定是我還是服務器。

    tq_get("AAPL", get= "financials")
    [1] NA
    Warning message:
    x = 'AAPL', get = 'financials': Error in thead[x]:thead[x + 1]: NA/NaN 
    argument

和:

    getFin("AAPL")
    Error in thead[x]:thead[x + 1] : NA/NaN argument

有人可以幫忙嗎?

試試這個:

library(jsonlite)
library(httr)

transpose_df <- function(df_list){
  df_list$maxAge <- NULL
  myColnames <- df_list$endDate$fmt
  df_list$endDate <- NULL
  
  mydf <- data.frame(row.names = colnames(df_list))
  
  for (i in 1:length(df_list)) {
    for (j in 1:4) {
      tryCatch(
        {
          mydf[i,j] <- df_list[j,i]$raw
        },
        error = function(cond){
          mydf[i,j] <- NA
        }
      )
      
    }
  }
  colnames(mydf) <- myColnames
  return(mydf)
}

scrapy_stocks <- function(stock){
  for (i in 1:length(stock)) {
    tryCatch(
      {
        url <- paste0('https://query1.finance.yahoo.com/v10/finance/quoteSummary/',stock[i],'?formatted=true&lang=en-US&region=US&modules=incomeStatementHistory%2CcashflowStatementHistory%2CbalanceSheetHistory&corsDomain=finance.yahoo.com')
        a <- GET(url)
        a <- content(a, as="text")
        
        df <- fromJSON(a, simplifyDataFrame = TRUE)
        
        df_is <- df$quoteSummary$result$incomeStatementHistory$incomeStatementHistory[[1]]
        df_is <- transpose_df(df_is)
        
        df_bs <- df$quoteSummary$result$balanceSheetHistory$balanceSheetStatements[[1]]
        df_bs <- transpose_df(df_bs)
        
        df_cs <- df$quoteSummary$result$cashflowStatementHistory$cashflowStatements[[1]]
        df_cs <- transpose_df(df_cs)
        assign(paste0(stock[i],'.f'),value = list(IS = df_is,BS = df_bs,CF = df_cs),envir = parent.frame())
      },
      error = function(cond){
        message(stock[i], "Give error ",cond)
      }
    )
  }
}

scrapy_stocks(c('PETR4.SA','VALE3.SA'))

您可以將其稱為scrapy_stocks(c("AAPL","GOOGL"))並以AAPL.f$ISAAPL.f$BSAAPL.f$CF訪問其數據。

自從我使用 R 以來已經有一段時間了,所以可能有更好的方法來執行此操作,特別是轉置 Dataframe,但我認為它正在工作。 我希望它可以幫助某人。

在 URL 中,如果您使用balanceSheetHistory ,您將獲得 Anual 值,如果您改為使用balanceSheetHistoryQuarterly ,您還可以獲得季度編號。 人們可以很容易地為此調整功能。

我調整了 scrapy_stocks 函數以適應 Yahoo 頁面更新。 我還沒有徹底審查這個解決方案,但它似乎在我迄今為止的所有試驗中都運行良好。 請注意兩件事:

  1. 如果您有 Yahoo Premium,我認為這不會起作用。 我沒有它,所以我無法測試它。 但如果你這樣做,更新應該不會太困難。
  2. 我對 rvest 沒有太多經驗,但由於頁面的性質,它必須設置函數,如果缺少一個值,則整行都將丟失。

試試這個:

scrapy_stocks2 <- function(stock){
  if ("rvest" %in% installed.packages()) {
    library(rvest)
  }else{
    install.packages("rvest")
    library(rvest)
  }
  if ("xml2" %in% installed.packages()) {
    library(xml2)
  }else{
    install.packages("xml2")
    library(xml2)
  }
  for (stocknum in 1:length(stock)) {
    tryCatch(
      {
        # Income Statement
        url <- "https://finance.yahoo.com/quote/"
        url <- paste0(url,stock[stocknum],"/financials?p=",stock[stocknum])
        wahis.session <- html_session(url)  

        nodes <- wahis.session %>%
          html_nodes(xpath = '//*[@id="Col1-1-Financials-Proxy"]/section/div[4]//span')

        yh_data <- nodes %>% 
          xml_text() %>% 
          gsub(pattern = ',', replacement = '')
        colnums <- 1:6
        col_nms <- yh_data[colnums]
        yh_data <- yh_data[-colnums]

        lab_inds <- nodes %>% 
          html_attr(name = 'class') == "Va(m)"
        lab_inds[is.na(lab_inds)] <- FALSE

        lab_inds <- lab_inds[-colnums]
        data <- matrix(NA, nrow = sum(lab_inds), ncol = 5, dimnames = list(yh_data[lab_inds], col_nms[-1]))
        row_num <- 1
        for (i in 2:(length(lab_inds)-4)) {
          t_ind <- !lab_inds[i:(i+4)]
          if (sum(t_ind) == 5) {
            data[row_num, 1:5] <- as.numeric(yh_data[i:(i+4)])
          }
          if (lab_inds[i]) {
            row_num <- row_num+1
          }
        }

        temp1 <- as.data.frame(data)
        print(paste(stock[stocknum],'   Income Statement Success'))

        # Balance Sheet
        url <- "https://finance.yahoo.com/quote/"
        url <- paste0(url,stock[stocknum],"/balance-sheet?p=",stock[stocknum])
        wahis.session <- html_session(url)  

        nodes <- wahis.session %>%
          html_nodes(xpath = '//*[@id="Col1-1-Financials-Proxy"]/section/div[4]/div[1]/div[1]//span')

        yh_data <- nodes %>% 
          xml_text() %>% 
          gsub(pattern = ',', replacement = '')

        colnums <- 1:5
        col_nms <- yh_data[colnums]
        yh_data <- yh_data[-colnums]

        lab_inds <- nodes %>% 
          html_attr(name = 'class') == "Va(m)"

        lab_inds[is.na(lab_inds)] <- FALSE

        lab_inds <- lab_inds[-colnums]
        data <- matrix(NA, nrow = sum(lab_inds), ncol = 4, dimnames = list(yh_data[lab_inds], col_nms[-1]))
        row_num <- 1
        for (i in 2:(length(lab_inds)-3)) {
          t_ind <- !lab_inds[i:(i+3)]
          if (sum(t_ind) == 4) {
            data[row_num, 1:4] <- as.numeric(yh_data[i:(i+3)])
          }
          if (lab_inds[i]) {
            row_num <- row_num+1
          }
        }

        temp2 <- as.data.frame(data)

        print(paste(stock[stocknum],'   Balance Sheet Success'))

        # Cash Flow
        url <- "https://finance.yahoo.com/quote/"
        url <- paste0(url,stock[stocknum],"/cash-flow?p=",stock[stocknum])
        wahis.session <- html_session(url)
        nodes <- wahis.session %>%
          html_nodes(xpath = '//*[@id="Col1-1-Financials-Proxy"]/section/div[4]/div[1]/div[1]//span')

        yh_data <- nodes %>% 
          xml_text() %>% 
          gsub(pattern = ',', replacement = '')
        colnums <- 1:6
        col_nms <- yh_data[colnums]
        yh_data <- yh_data[-colnums]

        lab_inds <- nodes %>% 
          html_attr(name = 'class') == "Va(m)"
        lab_inds[is.na(lab_inds)] <- FALSE

        lab_inds <- lab_inds[-colnums]
        data <- matrix(NA, nrow = sum(lab_inds), ncol = 5, dimnames = list(yh_data[lab_inds], col_nms[-1]))
        row_num <- 1
        for (i in 2:(length(lab_inds)-4)) {
          t_ind <- !lab_inds[i:(i+4)]
          if (sum(t_ind) == 5) {
            data[row_num, 1:5] <- as.numeric(yh_data[i:(i+4)])
          }
          if (lab_inds[i]) {
            row_num <- row_num+1
          }
        }

        temp3 <- as.data.frame(data)

        print(paste(stock[stocknum],'   Cash Flow Statement Success'))

        assign(paste0(stock[stocknum],'.f'),value = list(IS = temp1,BS = temp2,CF = temp3),envir = parent.frame())

      },
      error = function(cond){
        message(stock[stocknum], "Give error ",cond)
      }
    )
  }
}


是的,我在過去幾天也遇到了同樣的問題。 我認為這可能與 Google 財經方面的變化有關。 該網站現在不同了,網址也不同了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM