在R中下载雅虎股票价格

时间:2010-08-17 23:23:15

标签: r finance

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

  1. 如果不正确,请跳过自动收录器名称。
  2. 列表中的每个元素都是一个数据框。我希望将自动收录器名称附加到元素数据帧中的变量名称。
  3. 我需要一种有效的方法来创建一个以收盘价为变量的数据框。
  4. 以下是我的问题简化版的示例代码。

    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”。除了使用loop和paste()函数的组合之外,还有更好的方法吗?

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

    谢谢。

8 个答案:

答案 0 :(得分:21)

您最好的选择是使用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=".")])
}

答案 1 :(得分:21)

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

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

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

答案 2 :(得分:8)

我参加派对有点晚了,但我认为这对其他后来者非常有帮助。

stockSymbols中的TTR函数从nasdaq.com获取工具符号,并调整符号以与Yahoo!兼容金融。它目前为AMEX,NYSE和纳斯达克返回约6,500个符号。您还可以查看stockSymbols中调整代码以与Yahoo!兼容的代码。财务可能会调整文件中的一些代码。

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

答案 3 :(得分:3)

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

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)

答案 4 :(得分:1)

从上述解决方案略微修改......(感谢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
 }

答案 5 :(得分:1)

如果你的最终目标是获得三列收盘价格的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个代码的文件应该可以正常工作!

答案 6 :(得分:0)

不幸的是,URL“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脚本。

答案 7 :(得分:0)

也许可以尝试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()