Pergunta

O exemplo abaixo cria um sinal de compra (1) quando uma ação (IBM) tem uma queda diária de valor superior a 10%.

Em seguida, ele cria um sinal de espera por mais 4 dias.Se o número de dias de espera aumentasse, o código se tornaria mais indisciplinado.Existe alguma maneira de reescrever o código holdig usando uma função apply ou algo de eficiência semelhante (ou seja, não um loop for)?

library(quantmod)
getSymbols("IBM")
buysig <- Lag(ifelse(dailyReturn(IBM) < -.10,1,0))
holdsig <- ifelse( Lag(sig) == 1 | Lag(sig, k=2) == 1 | Lag(sig, k=3) == 1 | Lag(sig, k=4) == 1, 1, 0)

Cada vez que sinto que estou melhorando com a aplicação, dou dois passos para trás.

Foi útil?

Solução

Primeiro, observe que Lag pode pegar um vetor de k valores:

head(Lag(buysig, k=1:4)
#            Lag.1 Lag.2 Lag.3 Lag.4
# 2007-01-03    NA    NA    NA    NA
# 2007-01-04    NA    NA    NA    NA
# 2007-01-05     0    NA    NA    NA
# 2007-01-08     0     0    NA    NA
# 2007-01-09     0     0     0    NA
# 2007-01-10     0     0     0     0

Isso torna as coisas muito fáceis:você pode então verificar linha por linha (apply com MARGIN = 1) se any dos valores é igual a 1:

apply(Lag(buysig, k=1:4) == 1, 1, any)

(e você pode passar a saída através as.numeric se você precisar transformar {TRUE,FALSE} em {1,0})

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