【问题标题】:Function in quantmod to get the Volume data column into a Quartile Rankquantmod 中的函数以将 Volume 数据列转换为四分位数
【发布时间】:2019-02-27 16:23:33
【问题描述】:

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

感谢您的任何意见。

【问题讨论】:

    标签: r function quantmod quantile


    【解决方案1】:

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

    对函数的调整:一,我确保分位数函数也关注股票的交易量。你让它看着整个 xts 对象。现在它返回分成 4 个分位数的体积。 其次,该函数只返回 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
    

    【讨论】:

    • 您的代码像往常一样完美运行 ;-),请问您到底是在做什么? (quantmod::Vo(x), quantile(quantmod::Vo(x)), 如果我想在其他列中使用相同的Qrank函数(不是由quantmod默认创建的)怎么办?非常感谢您的帮助.
    • 基本查?cut。 cut 需要您要拆分的列,在这种情况下是体积,并且您需要 cut 的中断,在这种情况下,分位数将作为中断点,每个 25% 属于一个类别。在这种情况下,分位数由概率定义(但这与默认值相同)。您可以使用任何您想要的列。 x[["my_column"]] 是最安全的选择方式。并在 quantiles 函数中使用相同的列,或者指定您自己的断点以在 cut 函数中使用。
    • 谢谢。将很快开始测试大量数据。我真的很感谢你的 cmets。
    • 在你启动这个函数之前的列名是什么?你能给我提供一个股票代码的列名的例子吗? names(all_stocks$MSFT)。这应该让我知道哪个列名可能是一个问题。
    • 我稍微改变了你的新功能(并修正了我的一个错误)。你需要这个:x$posqrank &lt;- as.integer(cut(x[, grep(".Positivegap", colnames(x))], quantile(x[, grep(".Positivegap", colnames(x))],probs=0:4/4),include.lowest=TRUE)) 在你的新函数中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2011-01-02
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多