para loop não funciona em R
Pergunta
Aqui está o código:
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
Gostaria de verificar se o fechamento de hoje é maior do que o fechamento de 10 dias atrás e se é para incrementar a variável win.Também tentei o seguinte:
for(i in 11:NROW(ticker))
if(ticker[i] > ticker[i-10])
win <- win + 1
Ambos parecem que deveriam funcionar, então, na verdade, tenho dois problemas.Primeiro fazer com que funcione, mas também entender por que eles não funcionam.Ambos sinalizam "argumento tem comprimento zero".Meu palpite é que é o ticker [j] ou ticker [i-10] que é o culpado.Principalmente porque quando eu os substituo por um valor embutido no código, eles funcionam.
Solução
O problema é que o ticker [i] não retorna um objeto numérico, então você não pode comparar ou subtrair deles.Experimente isso por diversão:
str(ticker[15])
ticker[15]-ticker[10]
Então, basta envolvê-los em as.numeric e você terá o que precisa.
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
}
}
Outras dicas
Isso não tem nada a ver com loops for.É porque xts / zoo são alinhados por seu índice antes de qualquer operação ser executada.ticker[i] > ticker[j]
está vazio porque os índices são diferentes.
Você também não precisa de um loop for.Você pode fazer isso facilmente atrasando a série:
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)
O aparelho ortodôntico é seu amigo, meu amigo.