quantmod 中的函数,用于将 Volume 数据列放入四分位数排名

Function in quantmod to get the Volume data column into a Quartile Rank

在社区的帮助下,我创建了从 .csv 文件列表下载多个代码的代码。

我的下一步是为 Volume 数据创建一个具有四分位数排名的列。我的方法有什么问题?

这是我的方法:

从 .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 列数据放入四分位排名的函数?怎么了?

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 

感谢任何意见。

我不确定您为什么会收到此错误。我使用了 103 个纳斯达克股票代码。但我确实调整了你的功能,因为它没有 return 正确的结果。在我的例子中,它只 return 为每个代码的每条记录编辑值 4。

对函数所做的调整:第一,我确保分位数函数也查看股票的交易量。你让它查看整个 xts 对象。现在它 return 将体积分成 4 个分位数。 其次,函数只是 returning x$volqrank 而不是 x。我将最后两行添加到函数中以确保它 return 是完整的 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