我有一个包含各种符号的列表,我想为其创建一个列,并相对于列表的其余部分对某个列进行排名。
例如,我有一个列表x
,其中包含SPY
和IWM
的时间序列。对于每个列表项,我计算rsi
。然后,我想在每个列表中创建一个新列,为rsi
和SPY
之间的最低IWM
值分配一个等级。
我总是得到1的等级,这是不正确的,所以在我的代码中必须出错。正如我所说,我需要等级rsi
。
library(quantmod)
stockData <- new.env()
symbols = c("IWM","SPY")
getSymbols(symbols, src='yahoo',from = "2016-10-01",to = Sys.Date())
x <- list()
for (i in 1:length(symbols)) {
x[[i]] <- get(symbols[i], pos=stockData) # get data from stockData environment
x[[i]]$rsi <-RSI(Cl(x[[i]]),14)
x[[i]]$rank <- NA
x[[i]]$rank<-apply(-x[[i]]$rsi,1,rank)
}
答案 0 :(得分:0)
library(quantmod)
stockData <- new.env()
symbols = c("IWM","SPY")
getSymbols(symbols, src='yahoo',from = "2016-10-01",to = Sys.Date())
fulldata <- lapply(symbols, get, pos = stockData)
closedata <- lapply(fulldata, Cl)
rsi <- lapply(closedata, RSI, n = 14) # or e.g. n = 2, if RSI based on two periods
为了稍后使用排名,我们需要将数据转换为data.frame,因为rank()
不喜欢RSI()
给出的输出类。
rsi <- lapply(rsi, as.data.frame)
RSI()
取决于14个时段的移动平均线,导致前14个时段的结果为NA
,因为无法为它们计算移动平均线。
在进行排名时,有两个选项可以处理NA
- 值。您认为最合适的选项取决于您将在以后使用数据的内容:
您可以选择将NA
中的所有rsi
- 值替换为零以进行排名:
for(i in 1:length(rsi)){
rsi[[i]][is.na(rsi[[i]])] <- 0
}
ranks <- lapply(rsi, rank)
您可以忽略所有NA
- 值,只需在排名
ranks <- lapply(rsi, rank, na.last = NA)
将NA
- 值排名为最低或最高等级。
# If NA be put last, use "na.last = TRUE".
# If NA be put first, use "na.last = FALSE"
ranks <- lapply(rsi, rank, na.last = TRUE)
我会将列表合并到一个数据框中,然后计算逐行排名:
rsiDF <- data.frame(rsi)
rsiDF <- cbind(rsiDF, t(apply(rsiDF, 1, rank)))
请注意,您可以在此处再次决定如何处理排名值和NA
- 排名计算中的值(如上所述和?rank
中所述)
如果您希望再次将其重新打入列表:
k <- length(symbols)
interranks <- list()
for(i in 1:k){
interranks[[i]] <- rsiDF[,c(i, i+k)]
}