在社区的帮助下,我创建了代码以从.csv文件列表中下载多个代码。
我的下一步是创建一个列,该列具有“体积”数据的四分位数等级。我的方法有什么问题?
这是我的方法:
library(quantmod)
Tickers <- read.csv("nasdaq_tickers_list.csv", stringsAsFactors = FALSE)
getSymbols(Tickers$Tickers,from="2018-08-01", src="yahoo" )
stock_data = sapply(.GlobalEnv, is.xts)
all_stocks <- do.call(list, mget(names(stock_data)[stock_data]))
Volume_q_rank <- function(x) {
stock_name <- stringi::stri_extract(names(x)[1], regex = "^[A-Z]+")
stock_name <- paste0(stock_name, ".Volqrank")
column_names <- c(names(x), stock_name)
x$volqrank <-as.integer(cut(quantmod::Vo(x),
quantile(x,probs=0:4/4),include.lowest=TRUE))
}
all_stocks <- lapply(all_stocks, Volume_q_rank)
我的功能出了什么问题?
Error in quantile.default(coredata(x), ...) :
missing values and NaN's not allowed if 'na.rm' is FALSE
感谢您的任何输入。
答案 0 :(得分:1)
我不确定为什么会出现此错误。我使用了103个纳斯达克股票代码。但是我确实调整了您的功能,因为它没有返回正确的结果。在我的情况下,对于每个股票行情记录,它只返回值4。
对该功能进行的调整:首先,我确保分位数功能还可以查看库存量。您可以查看整个xts对象。现在,它返回分为四个分位数的体积。 其次,该函数仅返回x $ volqrank而不是x。我在函数中添加了最后两行,以确保它返回完整的xts对象。
这是新功能:
Volume_q_rank <- function(x) {
stock_name <- stringi::stri_extract(names(x)[1], regex = "^[A-Z]+")
stock_name <- paste0(stock_name, ".Volqrank")
column_names <- c(names(x), stock_name)
x$volqrank <- as.integer(cut(quantmod::Vo(x),
quantile(quantmod::Vo(x),probs=0:4/4),include.lowest=TRUE))
x <- setNames(x, column_names)
return(x)
}
all_stocks <- lapply(all_stocks, Volume_q_rank)
head(all_stocks$MSFT)
MSFT.Open MSFT.High MSFT.Low MSFT.Close MSFT.Volume MSFT.Adjusted MSFT.Volqrank
2018-08-01 106.03 106.45 105.42 106.28 23628700 105.8726 4
2018-08-02 105.40 108.09 104.84 107.57 26104300 107.1576 4
2018-08-03 107.80 108.05 106.82 108.04 18659600 107.6258 2
2018-08-06 108.12 108.42 107.56 108.13 20265900 107.7155 2
2018-08-07 108.56 109.10 108.17 108.88 16080200 108.4626 1
2018-08-08 109.33 109.75 108.76 109.49 15487500 109.0703 1