Применение функции RSI к списку фреймов данных - PullRequest
0 голосов
/ 26 сентября 2018

Я создал список фреймов данных о ценах закрытия всех компаний S & P 500.Я хотел бы рассчитать RSI для каждой компании.

library(BatchGetSymbols)

first.date <- Sys.Date()-365
last.date <- Sys.Date()

df.SP500 <- GetSP500Stocks()
tickers <- df.SP500$tickers

l.out <- BatchGetSymbols(tickers = tickers,
                         first.date = first.date,
                         last.date = last.date)

l.out$df.tickers$price.open <- NULL
l.out$df.tickers$price.high  <- NULL
l.out$df.tickers$price.low <- NULL
l.out$df.tickers$volume <- NULL
l.out$df.tickers$price.adjusted <- NULL
l.out$df.tickers$ret.adjusted.prices <- NULL
l.out$df.tickers$ret.closing.prices <- NULL


SP <- l.out$df.tickers

mylist <- split(SP, SP$ticker)

Я пытался использовать lapply, но не смог:

rsi <- lapply(names(mylist$price.close), RSI)

Он выдает список 0. Я ценю любую помощь, которую могу получитьэтот!Спасибо.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Рассмотрим by, который компактно заменяет split и lapply для операций группировки по факторам, таким как ticker .С одним фактором, выходные данные являются именованным списком того, что функция возвращает равным уникальному номеру фактора:

RSI_list <- by(SP, SP$ticker, function(sub) TTR::RSI(sub$price.close))

Если один из тикеров не поддерживает действительную цену закрытия, оберните вызов в tryCatchи вернуть NA для этих проблемных случаев:

RSI_list <- by(SP, SP$ticker, function(sub) 
                    tryCatch(TTR::RSI(sub$price.close),
                             error = function(e) return(NA)))
0 голосов
/ 26 сентября 2018

Используйте lapply с анонимной функцией для вызова функции RSI с price.close.По умолчанию первые 14 значений rsi будут равны NA, поскольку он рассчитывает rsi за 14 дней.

library(BatchGetSymbols)
library(TTR)

# your code ...
rsi <- lapply(mylist, function(x) RSI(x$price.close))

head(rsi$ABT, 20)
 [1]       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA 63.69235
[16] 66.10698 69.69120 70.76959 72.24900 69.41154
...