for loop non funziona in R
Domanda
Ecco il codice:
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
Vorrei verificare se la chiusura odierna è maggiore della chiusura di 10 giorni fa e se è per incrementare la variabile win.Ho anche provato quanto segue:
for(i in 11:NROW(ticker))
if(ticker[i] > ticker[i-10])
win <- win + 1
Sembra che entrambi dovrebbero funzionare, quindi in realtà ho due problemi.Prima di farlo funzionare, ma soprattutto capire perché non funzionano.Entrambi i flag "l'argomento è di lunghezza zero".La mia impressione è che il colpevole sia il ticker [j] o il ticker [i-10].Principalmente perché quando li sostituisco con un valore hardcoded funzionano.
Soluzione
Il problema è che il ticker [i] non restituisce un oggetto numerico, quindi non puoi confrontare o sottrarre da essi.Prova questo per divertimento:
str(ticker[15])
ticker[15]-ticker[10]
Quindi, racchiudili in as.numeric e otterrai ciò di cui hai bisogno.
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
}
}
Altri suggerimenti
Questo non ha nulla a che fare con i cicli for.È perché xts / zoo sono allineati in base al loro indice prima che venga eseguita qualsiasi operazione.ticker[i] > ticker[j]
è vuoto perché gli indici sono diversi.
Non hai nemmeno bisogno di un ciclo for.Puoi farlo facilmente ritardando la serie:
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)
Le parentesi graffe sono tuo amico, amico mio.