这是R中的一个新手问题.我正在使用R下载雅虎财务月度股票价格数据,其中从文本文件中读取股票代码名称.我正在使用循环来读取股票代码名称以下载数据并将它们放入列表中.我的问题是一些股票代码名称可能不正确,因此我的代码在遇到这种情况时会停止.我想要以下内容.
以下是我的问题的简化版本的示例代码.
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")
}
Run Code Online (Sandbox Code Playgroud)
代码在第三个条目处停止,但我想跳过此代码并转到"MMM".我听说过Trycatch()函数,但不知道如何使用它.
根据问题2,我希望列表的第一个元素的变量名称是"MSFTopen","MSFThigh","MSFTlow"和"MSFTclose".除了使用loop和paste()函数的组合之外,还有更好的方法吗?
最后,对于问题3,我需要一个包含三个与收盘价相对应的列的数据框.再次,我试图避免在这里循环.
谢谢.
Sha*_*ane 22
您最好的选择是使用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=".")])
}
Run Code Online (Sandbox Code Playgroud)
sto*_*tic 22
这也有点晚......如果你想只使用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")
Run Code Online (Sandbox Code Playgroud)
使用R的基本函数可以让您更好地控制数据操作.
我参加派对有点晚了,但我认为这对其他后来者非常有帮助.
该stockSymbols
函数TTR
从nasdaq.com获取工具符号,并调整符号以与Yahoo!兼容.金融.它目前为AMEX,NYSE和纳斯达克返回约6,500个符号.您还可以查看stockSymbols
调整代码中的代码以与Yahoo!兼容.财务可能会调整文件中的一些代码.
注意:由于nasdaq.com上的更改而导致CRAN stockSymbols
版本TTR
中断,但它在R-forge版本中已修复TTR
.