【问题标题】:Downloading Yahoo stock prices in R在 R 中下载雅虎股票价格
【发布时间】:2011-03-31 06:45:02
【问题描述】:

这是 R 中的一个新手问题。我正在使用 R 下载雅虎财经月度股票价格数据,其中代码名称是从文本文件中读取的。我正在使用循环读取代码名称以下载数据并将它们放入列表中。我的问题是一些股票名称可能不正确,因此我的代码在遇到这种情况时会停止。我想要以下。

  1. 如果代码名称不正确,请跳过它。
  2. 列表中的每个元素都是一个数据框。我希望将代码名称附加到元素数据框中的变量名称中。
  3. 我需要一种有效的方法来创建以收盘价作为变量的数据框。

这是我的问题的简化版本的示例代码。

library(tseries)  
tckk <- c("MSFT", "C", "VIA/B", "MMM") # ticker names defined  
numtk <- length(tckk);  
ustart <- "2000-12-30";
uend <- "2007-12-30" # start and end date  
all_dat <- list(); # empty list to fill in the data  
for(i in 1:numtk)  
{  
  all_dat[[i]] <- xxx <- get.hist.quote(instrument = tckk[i], start=ustart, end=uend, quote = c("Open", "High", "Low", "Close"), provider = "yahoo", compression = "m")  
}   

代码在第三个条目处停止,但我想跳过此代码并转到“MMM”。我听说过 Trycatch() 函数,但不知道如何使用它。

根据问题 2,我希望列表第一个元素的变量名称为“MSFTopen”、“MSFThigh”、“MSFTlow”和“MSFTclose”。除了使用循环和粘贴()函数的组合之外,还有更好的方法吗?

最后,对于问题 3,我需要一个包含三列对应收盘价的数据框。再次,我试图在这里避免循环。

谢谢。

【问题讨论】:

  • 将代码的初始行缩进 4 个空格以创建可读的代码块。
  • 小语法修正。

标签: r finance


【解决方案1】:

最好的办法是使用 quantmod 并将结果存储为时间序列(在这种情况下,它将是 xts):

library(quantmod)
library(plyr)
symbols <- c("MSFT","C","VIA/B","MMM")

#1
l_ply(symbols, function(sym) try(getSymbols(sym))) 
symbols <- symbols[symbols %in% ls()]

#2
sym.list <- llply(symbols, get) 

#3
data <- xts()
for(i in seq_along(symbols)) {
    symbol <- symbols[i]
    data <- merge(data, get(symbol)[,paste(symbol, "Close", sep=".")])
}

【讨论】:

  • 感谢您的代码。有用。但是,最初我是从一个包含 1000 多个股票代码的文件中读取股票代码名称。使用 merge() 进行硬编码可能对我没有帮助。此外,我确实想将它们放在一个列表中,以便我可以使用 plyr 库对每个列表元素执行其他操作。
  • 好的,这两件事都很容易做到。只需遍历符号以合并它们(而不是对它们进行硬编码)。然后使用 plyr 存储在一个列表中:llply(symbol.names, get).
  • 哇!这很棒。非常感谢Shane。
  • 请注意:我更喜欢getSymbols() 中的auto.assign=FALSE,因为当我想要合并的data.frame 时,它避免了用所有这些符号填充环境的疯狂。
  • 您可以进一步清理合并:merge(data, Cl(get(symbol)))
【解决方案2】:

这也有点晚了...如果您想仅使用 R 的基本函数获取数据而不处理任何附加包,只需使用函数read.csv(URL),其中 URL 是指向正确位置的字符串在雅虎。数据将作为数据框拉入,您需要将“日期”从字符串转换为日期类型,以使任何图看起来不错。简单代码sn-p如下。

URL <- "http://ichart.finance.yahoo.com/table.csv?s=SPY"
dat <- read.csv(URL)
dat$Date <- as.Date(dat$Date, "%Y-%m-%d")

使用 R 的基本函数可以让您更好地控制数据操作。

【讨论】:

  • +1 这是一个很好的提示。可能是我错了,但我想更改开始日期、结束日期和数据频率的灵活性会降低。 URL 会变得更加混乱。
  • 对此有一些想法,您可以将所有这些都放在一个实用函数中,该函数构造 URL、请求数据并返回数据帧(您可以发送更多参数到 yahoo像开始日期这样的 url)......而且由于数据位于 data.frame 中,因此很容易过滤和操作您不想要的数据。此外,“合并”命令在组合多个代码的数据帧时非常有用。
  • @stotastic 已经有几个函数可以满足您的描述(quantmod::getSymbolsTTR::getYahooDatatseries::get.hist.quotefImport::yahooImport 等)。
  • 所有添加简化抽象层的好函数,但我认为了解这些函数如何提取数据的基础知识很重要......仅使用“后备箱”可能很危险
  • 我想这是一个品味问题。
【解决方案3】:

我参加聚会有点晚了,但我认为这对其他迟到的人会很有帮助。

TTR 中的 stockSymbols 函数从 nasdaq.com 获取仪器符号,并调整符号以与 Yahoo! 兼容。金融。它目前为美国运通、纽约证券交易所和纳斯达克返回约 6,500 个符号。您还可以查看 stockSymbols 中的代码,该代码将代码调整为与 Yahoo! 兼容。财务可能会调整您文件中的一些代码。

注意:CRAN 上 TTR 版本中的 stockSymbols 因 nasdaq.com 上的更改而损坏,但在 TTR 的 R-forge 版本中已修复。

【讨论】:

  • +1 为这个伟大的提示。只是想知道是否有一种快速方法可以提取在纽约证券交易所注册的所有公司的股票名称并将其保存在平面文件的列中。我尝试使用它,但不知道如何从 stockSymbols 函数调用的输出对象中提取代码名称。谢谢。
  • write.csv(stockSymbols("NYSE")$Symbol,"NYSE_symbols.txt",row.names=FALSE,col.names=FALSE)
  • 是的,您可能拥有 CRAN 版本。您可以使用install.packages 安装R-forge 版本:install.packages("TTR",repos="http://r-forge.r-project.org")
  • @老子:请看?write.csv。 “CSV 文件”部分说 write.csvwrite.csv2 是“故意不灵活”和“尝试更改 'append'、'col.names'、'sep'、'dec' 或 'qmethod' 被忽略,带有警告。”
  • @Lao Tzu:我可能是从内存中编写的(即没有测试它)并打算使用write.table而不是write.csvwrite.table 将尊重 col.names=FALSE 参数,并且只有一列,因此分隔符无关紧要。
【解决方案4】:

我这样做是因为我需要历史价格表和每日更新文件才能运行其他软件包:

library(fImport)

fecha1<-"03/01/2009"
fecha2<-"02/02/2010"

Sys.time()

y <- format(Sys.time(), "%y")    
m <- format(Sys.time(), "%m")    
d <- format(Sys.time(), "%d")
fecha3 <- paste(c(m,"/",d,"/","20",y), collapse="")

write.table(yahooSeries("GCI", from=fecha1, to=fecha2), file = "GCI.txt", sep="\t", quote = FALSE, eol="\r\n", row.names = TRUE)
write.table(yahooSeries("GCI", from=fecha2, to=fecha3), file = "GCIupdate.txt", sep="\t", quote = FALSE, eol="\r\n", row.names = TRUE)

GCI <- read.table("GCI.txt") 
GCI1 <- read.table("GCIupdate.txt")
GCI <- rbind(GCI1, GCI)
GCI <- unique(GCI)

write.table(GCI, file = "GCI.txt", sep="\t", quote = FALSE, eol="\r\n", row.names = TRUE)

【讨论】:

  • 编辑答案以添加“library(fImport)”,因为这是全新安装 R 所必需的。
  • 这个过程太长了……可以短吗?
【解决方案5】:

如果你的最终目标是获取三列收盘价的data.frame,那么新包tidyquant可能更适合这个。

library(tidyquant)

symbols <- c("MSFT", "C", "VIA/B", "MMM")

# Download data in tidy format. 
# Will remove VIA/B and warn you.
data <- tq_get(symbols)

# Ticker symbols as column names for closing prices
data %>% 
    select(.symbol, date, close) %>% 
    spread(key = .symbol, value = close)

这将扩展到任意数量的股票,因此 1000 个股票代码的文件应该可以正常工作!

【讨论】:

  • 请注意,在 v0.4.0 中,“.symbol”列变为“symbol”。
【解决方案6】:

对上述解决方案稍作修改...(感谢 Shane 和 Stotastic)

 symbols <- c("MSFT", "C", "MMM")

 # 1. retrieve data

 for(i in seq_along(symbols)) {
   URL <- paste0("http://ichart.finance.yahoo.com/table.csv?s=", symbols[i])
   dat <- read.csv(URL)
   dat$Date <- as.Date(dat$Date, "%Y-%m-%d")
   assign(paste0(symbols[i]," _data"), dat)
   dat <- NULL
 }

【讨论】:

    【解决方案7】:

    很遗憾,网址“ichart.finance.yahoo.com”已失效,现在无法使用。据我所知,雅虎关闭了它,它似乎不会打开。

    几天前,我发现了一个不错的替代方案 (https://eodhistoricaldata.com/),其 API 与 Yahoo Finance 非常相似。

    基本上,对于上面描述的 R 脚本,您只需要更改这部分:

    URL <- paste0("ichart.finance.yahoo.com/table.csv?s=", symbols[i])
    

    到这里:

    URL <- paste0("eodhistoricaldata.com/api/table.csv?s=", symbols[i])
    

    然后添加一个 API 密钥,它将以与以前相同的方式工作。我为我的 R 脚本节省了很多时间。

    【讨论】:

      【解决方案8】:

      不妨试试BatchGetSymbols 库。与 quantmod 相比,我喜欢它的地方在于您可以为数据指定时间段。

      library(BatchGetSymbols)
      
      # set dates
      first.date <- Sys.Date() - 60
      last.date <- Sys.Date()
      freq.data <- 'daily'
      # set tickers
      tickers <- c('FB','MMM','PETR4.SA','abcdef')
      
      l.out <- BatchGetSymbols(tickers = tickers, 
                               first.date = first.date,
                               last.date = last.date, 
                               freq.data = freq.data,
                               cache.folder = file.path(tempdir(), 
                                                        'BGS_Cache') ) # cache in tempdir()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 2021-07-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多