R语言tidyquant抓取个股数据失败 求解决方法

我用R的tidyquant抓取S&P500里面的某几个个股数据。

install.packages(c("tidyquant","dplyr","tidyverse"))
library(tidyquant)
library(dplyr)
library(tidyverse)

tq_index("SP500")
stock_symbols <-c("NVDA","TSLA","META")
start_date <- "2018-03-24"
end_date <- "2023-03-24"
stock_prices <- stock_symbols %>%
  tq_get(get = "stock.prices",
         from = start_date,
         to = end_date,
         collapse = "daily")
print(stock_prices)
```r

跑动后,系统报错,显示如下


```r

Warning message:
There were 3 warnings in `dplyr::mutate()`.
The first warning was:
ℹ In argument: `data.. = purrr::map(...)`.
Caused by warning:
**! x = 'NVDA', get = 'stock.prices': Error in getSymbols.yahoo(Symbols = "NVDA", env = , verbose = FALSE, : Unable to import “NVDA”.
$ operator is invalid for atomic vectors
 Removing NVDA.
ℹ Run dplyr::last_dplyr_warnings() to see the 2 remaining warnings. 

这个该怎么解决呢

设置auto.assign=FALSE 设置数据源为: src="yahoo" 还有可能就是NVDA设置的不对,找不到这个,更换其他的试试

该回答引用于ChatGPT:
根据错误信息,是因为 NVDA 这个股票代码无法从 Yahoo Finance 获取到数据导致的。出现这种情况一般有以下几种可能性:

  1. 股票代码输错:请确认输入的股票代码是否正确,可以尝试在 Yahoo Finance 等数据源手动查询该股票的数据是否存在。

  2. 数据源不可用:Yahoo Finance 可能存在一些临时性的数据访问问题,您可以等待一段时间后再次尝试获取数据,或者尝试使用其他数据源进行获取。

  3. 数据获取异常:可能由于网络连接、数据格式等问题导致数据获取失败,请检查您的网络连接和代码逻辑,并尝试调整代码或更换数据源。

针对上述情况,您可以分别采取以下措施:

  1. 确认股票代码是否正确,例如使用 quantmod 包中的 getSymbols 函数通过 YAHOO 金融或谷歌等数据源获取该股票的历史数据,以确定是否存在数据源的问题。

  2. 尝试更换数据源。您可以使用 quantmod 包中的 getSymbols 函数从其他数据源获取数据,例如从 Alpha Vantage 或 Intrinio APIs 中获取数据。在 tidyquant 中,可以使用 tq_get() 函数的 source 参数来指定数据源,例如:

    stock_prices <- stock_symbols %>%
      tq_get(source = "av",
             get = "stock.prices",
             from = start_date,
             to = end_date,
             collapse = "daily")
    

    source 参数可以是 avfmpiex 等数据源代码,具体可参考 tidyquant 的文档。

  3. 确认数据获取的过程是否正确。请检查您的网络连接和代码逻辑,例如是否需要添加代理、是否正确设置 API key 等等。也可以尝试使用其他的 R 包或 Python 包获取数据并进行比对。

引用chatGPT作答,根据系统报错信息,你的代码中tq_get()函数在获取"NVDA"这只股票的价格数据时遇到了问题,可能是由于Yahoo Finance API无法获取该股票的数据,或者是由于数据格式不正确导致的。在此情况下,可以尝试以下几种解决方法:

1.检查股票代码是否正确。确保使用的股票代码是有效的,并且在指定日期范围内有数据。

2.检查数据源是否可用。Yahoo Finance API是获取股票数据的常用数据源之一,但由于API的限制或服务故障等原因,可能无法获取所有股票的数据。可以尝试使用其他数据源或等待一段时间再尝试。

3.检查R版本和包版本是否正确。在使用R语言的过程中,版本不一致可能会导致某些函数无法正常工作。可以通过检查R和相关包的版本来解决此问题。

4.更改数据获取方式。除了使用tq_get()函数获取数据之外,还可以尝试使用其他函数或API来获取数据,例如使用quantmod包中的getSymbols()函数获取数据。

你可以先尝试以上几种解决方法,如果问题仍然存在,请提供更详细的错误信息以便更好地解决问题。

以下内容部分参考ChatGPT模型:
首先,这个问题的报错信息显示无法导入“NVDA”,可能是因为数据源出现问题,或者是输入的股票代码有误。我们可以尝试更换数据源或者检查输入的股票代码是否正确。

另外,报错信息中也提到了剩下的两个警告,我们可以使用dplyr包中的last_dplyr_warnings()函数来查看这些警告,看是否有其他问题需要解决。

下面是一个可能的解决方案:

# 更换数据源为Yahoo Finance
tq_set_provider("yahoo")

# 检查输入的股票代码是否正确
stock_symbols <- c("NVDA","TSLA","META")
available_symbols <- tq_get(get = "stock.prices", symbols = "all") %>% 
  rownames_to_column(var = "symbol") %>% 
  pull(symbol)
invalid_symbols <- setdiff(stock_symbols, available_symbols)
if (length(invalid_symbols) > 0) {
  stop("Invalid stock symbol(s): ", paste(invalid_symbols, collapse = ", "))
}

# 抓取数据
start_date <- "2018-03-24"
end_date <- "2023-03-24"
stock_prices <- stock_symbols %>% 
  tq_get(get = "stock.prices",
         from = start_date,
         to = end_date,
         collapse = "daily")
print(stock_prices)

# 查看剩下的警告
dplyr::last_dplyr_warnings()

这个方案中,我们首先更换了数据源为Yahoo Finance,因为有些数据源可能不支持某些股票代码。然后使用tq_get()函数中的symbols参数来获取所有可用的股票代码,检查输入的股票代码是否正确。最后抓取数据并查看剩下的警告。
如果我的建议对您有帮助、请点击采纳、祝您生活愉快

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
根据你的代码和错误提示,可能出现了以下情况:

1.无法获取股票信息:可能是因为 getSymbols.yahoo() 函数在获取数据时出现了问题。你可以尝试安装 quantmod 包并使用 getSymbols() 函数获取数据,如下所示:

library(quantmod)

stock_prices <- stock_symbols %>%
  map(~getSymbols(Symbols = ., src = "yahoo", from = start_date, to = end_date, auto.assign = FALSE)) %>%
  map(~Ad(get(.))) %>%
  set_names(stock_symbols) %>%
  map(~data.frame(date = index(.), price = as.numeric(.)))

2.股票名字错误:可能是因为输入的股票名称有误。检查股票名称是否正确拼写,或者更换要获取的股票。例如,更换股票 NVDAMSFT 可能会成功获取数据。同时,由于 meta 不是股票名称,所以需要将 meta 更换为正确的股票名称。

下面是完整的修改后的代码,希望能解决你的问题:

library(tidyquant)
library(dplyr)
library(tidyverse)
library(quantmod)

tq_index("SP500")
stock_symbols <- c("AAPL","MSFT","TSLA")
start_date <- "2018-03-24"已黑化的小白 end_date <- "2023-03-24"已黑化的小白 stock_prices <- stock_symbols %>%
  map(~getSymbols(Symbols = ., src = "yahoo", from = start_date, to = end_date, auto.assign = FALSE)) %>%
  map(~Ad(get(.))) %>%
  set_names(stock_symbols) %>%
  map(~data.frame(date = index(.), price = as.numeric(.)))
print(stock_prices)

希望对你有所帮助。
如果我的回答解决了您的问题,请采纳!

该回答引用ChatGPT
根据你提供的报错信息和代码,很可能是因为`tidyquant`在使用`getSymbols.yahoo`函数抓取个股数据时出现了问题。尤其是 NVDA 这支股票,可能会因为 Yahoo Finance 数据源的问题导致无法获取数据。建议尝试将 `get` 参数传递为 `"Alphavantage"` 或 `"FRED"`,并查看是否能正常获取数据。

以下是修改`tidyquant`代码的例子

r
stock_prices <- stock_symbols %>%
tq_get(
get = "stock.prices",
from = start_date,
to = end_date,
collapse = "daily",
source = "yahooj", # 换为使用Yahooj的接口
warnings = FALSE # 不显示警告信息
)


另外,如果还是无法获取个股数据,建议检查网络连接是否正常以及股票代码是否正确。还可以查看服务提供商的网站,了解有无其他限制,例如每日可以使用查询量限制等。

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

这个错误提示显示无法导入 "NVDA",因此建议您检查以下几个方面:

1. 确保您的网络连接正常,因为tidyquant会从Yahoo Finance获取股票数据。

2. 确保股票代码正确。可能是您输入的股票代码有误或者不是有效的股票代码。您可以尝试在Yahoo Finance上搜索这些代码,以确保它们是有效的股票代码。

3. 确保您的tidyquant和quantmod库的版本是最新的。您可以通过运行以下命令来更新这些库:

   install.packages(c("tidyquant", "quantmod"))

4. 尝试在tq_get()函数中添加一个参数retry_on_error = TRUE,以便在出现错误时自动重试。
 
   stock_prices <- stock_symbols %>%
     tq_get(get = "stock.prices",
            from = start_date,
            to = end_date,
            collapse = "daily",
            retry_on_error = TRUE)

如果仍然无法解决问题,请尝试运行dplyr::last_dplyr_warnings(),以查看是否有其他警告。

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢