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
在社区的帮助下,我创建了从 .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