2016-11-03 4 views
1

У меня есть список с различными символами, для которых я хочу создать столбец и ранжировать определенный столбец относительно остальной части списка.рейтинг по столбцу списка

Например, у меня есть список 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

Параметр 'RSI' зависит от 14 отставали значения, это означает, что только после того, как 14 наблюдений, вы получите реальную RSI значение. Поэтому у вас будут значения «NA» для первых 14 наблюдений. Это будет возиться со званием. Вы хотите игнорировать первые 14 наблюдений при расчете ранга? –

ответ

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 -Value и просто удалить их, прежде чем рейтинг

    ranks <- lapply(rsi, rank, na.last = NA) 
    
  • R ank 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)] 
} 
+0

Привет, кен. Спасибо за помощь.Вы правы в том, что rsi14 даст na. Я использую более длинные временные ряды, поэтому это не проблема. Я попробую ваше решение. Он выглядит хорошо и пытается обвести вокруг него – np2000

+0

Также кен. Как добавить еще один столбец на каждый символ списка, показывающий ранг символа относительно других символов? Например, если на 1-й день шпион имеет более низкое значение, чем эквивалентный день для iwm, тогда шпион получает rank1, а iwm получает ранг 2 – np2000

+0

Вы искали ряды среди символов все время, не так ли? Это означает, что я могу удалить часть в рядах в точке маркера, не так ли? –

Смежные вопросы