Функция в QuantMod, чтобы получить столбец данных объема в Quartile Rank - PullRequest
0 голосов
/ 24 сентября 2018

С помощью сообщества я создал код для загрузки нескольких тикеров из списка файлов .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])) 

Функция, чтобы получить данные столбца объема в Quartile Rank?Что не так?

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 голосов
/ 24 сентября 2018

Я не уверен, почему вы получаете эту ошибку.Я использовал 103 тикера NASDAQ.Но я настроил вашу функцию, так как она не давала правильных результатов.В моем случае он возвращал только значение 4 для каждой записи каждого тикера.

Корректировки, сделанные в функции: Во-первых, я убедился, что функция квантиля также смотрит на объем акций.Вы смотрите на весь объект XTS.Теперь он возвращает объем, разделенный на 4 квантиля.Во-вторых, функция возвращала только x $ volqrank вместо x.Я добавил последние 2 строки в функцию, чтобы убедиться, что она возвращает полный объект 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...