2011-03-24 159 views
2

這裏不工作是代碼:for循環中的R

require("quantmod") 

getSymbols("SPY") 

ticker <- SPY[,4] 

win <- 0 

for(i in 11:NROW(ticker)) 

j <- i-10 

if(ticker[i] > ticker[j])    

win <- win + 1 

我想檢查,如果今日的收盤價低於收盤10天前更大,如果是遞增的勝利變量。我也試過如下:

for(i in 11:NROW(ticker)) 

if(ticker[i] > ticker[i-10])    

win <- win + 1    

兩個看起來像他們應該工作,所以我其實有兩個問題。首先得到它的工作,但也很重要的是理解他們爲什麼不工作。標誌「參數長度爲零」。我的直覺是它是罪魁禍首的股票代碼[j]或股票代碼[i-10]。主要是因爲當我用一個硬編碼值替換它們時,它們工作。

回答

2

問題是ticker [i]沒有返回一個數字對象,因此您無法對它們進行比較或減法。試試這個好玩:

str(ticker[15]) 
ticker[15]-ticker[10] 

所以,只是包裝他們as.numeric,你會得到你所需要的。

require("quantmod") 
getSymbols("SPY") 
ticker <- SPY[,4] 
win <- 0 
for(i in 11:NROW(ticker)){ 
    j <- i-10 
    if(as.numeric(ticker[i]) > as.numeric(ticker[j])){    
     win <- win + 1 
    } 
} 
+0

感謝您的解決方案,但更多的是指出您需要一個數字對象進行這種比較。 – Milktrader 2011-03-24 02:47:56

-1

大括號是你的朋友,我的朋友。

+0

我包圍的語句後的(我在...)並沒有幫助。 – Milktrader 2011-03-24 02:37:03

1

這與循環無關。這是因爲xts/zoo在執行任何操作之前都會按其索引進行對齊。 ticker[i] > ticker[j]是空的,因爲索引是不同的。

你也不需要for循環。您可以通過滯後的一系列容易做到這一點:

merged.ticker <- merge(ticker, lag(ticker,10)) 
win <- sum(merged.ticker[,1] > merged.ticker[,2], na.rm=TRUE) 
lose <- sum(merged.ticker[,1] < merged.ticker[,2], na.rm=TRUE) 
+0

感謝約書亞,我在後面頭腦中有滯後功能 – Milktrader 2011-03-24 20:05:50