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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top