r - 如何根据最后一天的成交量数据的四分位值对股票列表进行子集化以获取新列表
问题描述
我正在使用 getSymbols 从几只股票中下载数据。
我对体积数据感兴趣,因此我将体积数据列拆分为 (0-4),以便在名为 xxx.Volqrank 的新列中将每个体积数据分配给其对应的四分位数 (1,2,3,4)
现在我想查看列表中可用的最后一行中的 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 分钟)
任何帮助将不胜感激。
谢谢。
解决方案
获得您在评论中提到的所需内容的一种方法是这样的:
sapply 返回一个命名向量,每只股票为 TRUE 或 FALSE。使用names
withwhich
将返回您感兴趣的股票名称。
stock3 <- sapply(all_stocks, function(x) {last(x[, grep("\\.Volqrank",names(x))]) == 3})
stocks_with3 <- names(which(stock3 == TRUE))
推荐阅读
- sql - Postgres WHERE NOT IN 需要很长时间才能执行
- python - Confluent Kafka Python 生产者不使用 ACKS= 所有配置进行生产
- php - CakePHP 3 中的 301 重定向
- python - request.POST.get('encResp') 在 PROD 环境(linux、Apache、MySQL、Python、Django)上返回 None,而在本地也一样
- regex - 在大文件上使用 perl 正则表达式时出现分段错误
- quasar-framework - 如何完全禁用 Quasar 的 LoadingBar?
- python - python numpy创建数据集列:仅根据条件添加值,否则为null
- excel - 如何根据具有可变位置的另一个单元格设置单元格值
- reactjs - 如何使用 React 测试库测试 Material UI 选择组件
- python - 在 Python (Selenium) 中从 CSV 文件读取和写入变量