如何根据上一交易量数据的四分位数对股票列表进行子集化以获得新列表

时间:2018-12-23 16:21:32

标签: r subset quantmod

我正在使用getSymbols从几只股票中下载数据。

我对卷数据感兴趣,因此我将卷数据列拆分为(0-4),以在名为xxx.Volqrank <的新列中将每个卷数据分配给其对应的四分位数(1,2,3,4)。 / p>

现在,我想查看列表最后一行中的xxx.Volqrank列,并告诉我哪些代号的值为3。

我正在寻找的理想结果是,使用该列表的最后一个可用数据中的四分位数为3的股票获得一个新列表。

#Reproducible example

library(quantmod)

library(xts)

Symbols <-     c("XOM","MSFT","JNJ","IBM","MRK","BAC","DIS","ORCL","LW","NYT","YELP")

start_date=as.Date("2018-06-01")


getSymbols(Symbols,from=start_date)


# Put all stocks in big list, by checking which xts objects are in the global environment.

stock_data = sapply(.GlobalEnv, is.xts)

all_stocks <- do.call(list, mget(names(stock_data)[stock_data]))


#function to split volume data quartiles into 0-4 results

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)

我最初的方法是使用

lapply(all_stocks, function(x) which(x[, grep("\\.Volqrank",names(x))]==3

但这没用,有什么主意吗?

我希望稍后将新列表再次用于股票的下载数据,但这一次使用不同的间隔(即5分钟)

任何帮助将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:2)

获得您想要在评论中提及的内容的一种方法是这样的:

sapply返回每只股票具有TRUE或FALSE的命名向量。将nameswhich一起使用将返回您感兴趣的股票的名称。

stock3 <- sapply(all_stocks, function(x) {last(x[, grep("\\.Volqrank",names(x))]) == 3})
stocks_with3 <- names(which(stock3 == TRUE))