在quantmod中起作用,以将“体积数据”列放入四分位数排名

时间:2018-09-24 07:31:06

标签: r function quantmod quantile

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

我的下一步是创建一个列,该列具有“体积”数据的四分位数等级。我的方法有什么问题?

这是我的方法:

从.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 

感谢您的任何输入。

1 个答案:

答案 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