2016-11-03 73 views
1

我有一個列表,其中包含我想創建列的各種符號,並對列表的其餘部分進行排列。排列在列表的一列

例如,我有一個列表x其中包含時間系列SPYIWM。對於每個列表項我計算rsi。然後,我想在每個列表中創建一個新列,它將和IWM之間的值分配給最低的rsi值。

我總是得到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值。因此,對於前14個觀測值,您將具有「NA」值。這會混亂的級別。計算排名時,你是否想忽略前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 - 值,只是排名

    ranks <- lapply(rsi, rank, na.last = NA) 
    
  • R之前,將其刪除將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

也ken。我如何在列表的每個符號上添加另一列,以顯示符號相對於其他符號的排名?例如,如果在第1天間諜的值比iwm的當天值低,那麼間諜獲得rank1,並且iwm獲得rank2 – np2000

+0

你一直在尋找符號之間的等級,是不是?這意味着我可以刪除子彈點上的部分,對嗎? –