我使用的脚本与找到的here类似。简而言之,代理问题(或其他原因)会使API超时。我必须解析Yahoo Finance数据的网址,而不是使用quantmod获取历史股票数据。因为yahoo finance仅加载100行,所以即使您将日期范围设置为超过at,也要向下滚动,否则我需要获得此“ for循环”以一次遍历我创建的100天列表。开始日期是Yahoo Finance使用的整数格式。
以下是100天增量的df示例,列表将更改/增长。证券列表也正在从文件中导入,并且也会动态更改,但是我在下面提供了“符号”作为示例。
在下面,我希望dateGroup [1,1]和dateGroup [1,2]自动从dateGroup中获取第一行的值,然后自动获取第二行,依此类推-然后构建一个包含所有内容的单个数据框值。
dateGroup <- data.frame(
start = c(1509519600, 1518159600,1526799600,1535439600,1544079600),
end = c(1518073200, 1526713200,1535353200,1543993200,1550732400)
)
for (s in symbols){
url <- paste('https://finance.yahoo.com/quote/',s, '/history?period1=',dateGroup[1,1],'&period2=',dateGroup[1,2],'&interval=1d&filter=history&frequency=1d',sep="")
webpage <- readLines(url,warn=FALSE)
html <- htmlTreeParse(webpage, useInternalNodes = TRUE, asText = TRUE)
tableNodes <- getNodeSet(html, "//table")
assign(s, readHTMLTable(tableNodes[[1]], header=c("Date","Open","High","Low","Close","Adj. Close","Volume")))
df <- get(s)
df['symbol'] <- s
assign(s, df)
}
symboldatalist <- cbind(mget(symbols))
symboldata <- do.call(rbind, symboldatalist)
symboldata <- symboldata[, c(ncol(symboldata), 1:ncol(symboldata)-1)]
write.table(symboldata, "[Location], sep=",", row.names=FALSE, col.names=TRUE)
任何帮助都会很棒。谢谢!
我尝试过的几件事。我试图创建一个URL矩阵,并在URL的顶部和第1列和第2列中的日期刮掉那些URL。我还尝试在Yahoo Finance页面上编写自动滚动程序,但是由于超时而遇到了相同的错误。
答案 0 :(得分:0)
请考虑使用ctx
或其未简化的包装器mapply
,以逐个开始和结束日期以及相应的符号对元素进行迭代。另外,请避免使用Map
和assign
,并在最后建立最终get
的数据帧列表:
rbind
要演示如何使用美国1级铁路:
library(XML)
...
dateGroup <- data.frame(
start = c(1509519600, 1518159600, 1526799600, 1535439600, 1544079600),
end = c(1518073200, 1526713200, 1535353200, 1543993200, 1550732400)
)
# CROSS JOIN ALL SYMBOLS WITH EACH DATE PAIRING
dt_grp_sym <- merge(dateGroup, data.frame(symbols))
# DEFINED METHOD FOR HTML PROCESSING
proc_html <- function(sym, sd, ed) {
url <- paste0('https://finance.yahoo.com/quote/', sym, '/history?period1=',
sd, '&period2=', ed, '&interval=1d&filter=history&frequency=1d')
print(url)
webpage <- readLines(url, warn=FALSE)
html <- htmlTreeParse(webpage, useInternalNodes = TRUE, asText = TRUE)
tableNodes <- getNodeSet(html, "//table")
html_df <- transform(readHTMLTable(tableNodes[[1]],
header=c("Date", "Open", "High", "Low",
"Close", "Adj. Close", "Volume")),
symbol = sym)
return(html_df)
}
# ITERATE ELEMENTWISE THROUGH EVERY ROW of dt_grp_sym
df_list <- Map(proc_html, dt_grp_sym$symbols, dt_grp_sym$start, dt_grp_sym$end)
final_df <- do.call(rbind, df_list)
输出
symbols <- c("UNP", "CSX", "NSC", "CNI", "KSU")
dateGroup <- data.frame(
start = c(1509519600, 1518159600, 1526799600, 1535439600, 1544079600),
end = c(1518073200, 1526713200, 1535353200, 1543993200, 1550732400)
)
dt_grp_sym <- merge(dateGroup, data.frame(symbols))
# CALLING SAME ABOVE FUNCTION
df_list <- with(dt_grp_sym, Map(proc_html, symbols, start, end))
final_df <- do.call(rbind, df_list)