Я получаю одну и ту же ошибку как в Quantmod, так и в tinyquant для финансовых данных. Может ли кто-нибудь увидеть, воспроизводимо ли это? Это проблема с финансовым сервером Google? Ни одна из перечисленных ниже функций у меня не работала. Я не уверен, это я или сервер.
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
Кто-нибудь может помочь?





Да, у меня такая же проблема в течение последних нескольких дней. Я думаю, что это может быть связано с изменением со стороны Google Финансов. Сайт теперь другой, и URL тоже.
Привет, @Joe. Я столкнулся с той же проблемой, потому что Google изменил свою страницу, поэтому я написал функцию для получения данных из Yahoo Finance. Его вывод аналогичен getFin. Надеюсь, это поможет тебе.
scrapy_stocks <- function(stock){
if ("rvest" %in% installed.packages()) {
library(rvest)
}else{
install.packages("rvest")
library(rvest)
}
for (i in 1:length(stock)) {
tryCatch(
{
url <- "https://finance.yahoo.com/quote/"
url <- paste0(url,stock[i],"/financials?p = ",stock[i])
wahis.session <- html_session(url)
p <- wahis.session %>%
html_nodes(xpath = '//*[@id = "Col1-1-Financials-Proxy"]/section/div[3]/table')%>%
html_table(fill = TRUE)
IS <- p[[1]]
colnames(IS) <- paste(IS[1,])
IS <- IS[-c(1,5,12,20,25),]
names_row <- paste(IS[,1])
IS <- IS[,-1]
IS <- apply(IS,2,function(x){gsub(",","",x)})
IS <- as.data.frame(apply(IS,2,as.numeric))
rownames(IS) <- paste(names_row)
temp1 <- IS
url <- "https://finance.yahoo.com/quote/"
url <- paste0(url,stock[i],"/balance-sheet?p = ",stock[i])
wahis.session <- html_session(url)
p <- wahis.session %>%
html_nodes(xpath = '//*[@id = "Col1-1-Financials-Proxy"]/section/div[3]/table')%>%
html_table(fill = TRUE)
BS <- p[[1]]
colnames(BS) <- BS[1,]
BS <- BS[-c(1,2,17,28),]
names_row <- BS[,1]
BS <- BS[,-1]
BS <- apply(BS,2,function(x){gsub(",","",x)})
BS <- as.data.frame(apply(BS,2,as.numeric))
rownames(BS) <- paste(names_row)
temp2 <- BS
url <- "https://finance.yahoo.com/quote/"
url <- paste0(url,stock[i],"/cash-flow?p = ",stock[i])
wahis.session <- html_session(url)
p <- wahis.session %>%
html_nodes(xpath = '//*[@id = "Col1-1-Financials-Proxy"]/section/div[3]/table')%>%
html_table(fill = TRUE)
CF <- p[[1]]
colnames(CF) <- CF[1,]
CF <- CF[-c(1,3,11,16),]
names_row <- CF[,1]
CF <- CF[,-1]
CF <- apply(CF,2,function(x){gsub(",","",x)})
CF <- as.data.frame(apply(CF,2,as.numeric))
rownames(CF) <- paste(names_row)
temp3 <- CF
assign(paste0(stock[i],'.f'),value = list(IS = temp1,BS = temp2,CF = temp3),envir = parent.frame())
},
error = function(cond){
message(stock[i], "Give error ",cond)
}
)
}
}
Вы можете назвать его scrapy_stocks(c("AAPL","GOOGL")) и получить доступ к его данным как AAPL.f$IS, AAPL.f$BS или AAPL.f$CF.
@ user113156 проблема в финансовом сайте Yahoo, если вы отметите GOOGL, вы увидите, что вся информация пуста, то же самое для AAPL. Так что не получится, что-то случилось в yahoo finance.
А, ладно, я подумал, что вы написали новый сценарий, чтобы убрать часть финансовой отчетности из другого источника.
@ user113156 это действительно так. В прошлом getFinancial использовала GOOGLE в качестве источника, поэтому я написал этот скрипт для получения данных от YAHOO, однако вчера у YAHOO были проблемы, поэтому оба источника не работали. Однако сегодня YAHOO работает нормально, поэтому, если вы попробуете скрипт, он будет работать нормально. Надеюсь, тебе понравится.
scrapy_stocks("AAPL") возвращает AAPLGive error Error in p[[1]]: subscript out of bounds@Alexandros Yahoo изменил структуру страницы. Я обновлю функцию, когда у меня будет возможность. Однако можно получить эти данные из Google, используя: getFinancials (Symbol, env = .GlobalEnv, src = "google", auto.assign = TRUE, ...)
Я настроил функцию scrapy_stocks, чтобы она соответствовала обновлению страницы Yahoo. Я не проверил это решение досконально, но, похоже, до сих пор он хорошо работал во всех моих испытаниях. Обратите внимание на две вещи:
Попробуй это:
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)
}
)
}
}
Это все еще работает для вас? Я получаю
AAPL Give error Error in IS[, 1]: incorrect number of dimensions GOOGL Give error Error in IS[, 1]: incorrect number of dimensions