Preenchendo uma retenção com base na compra de um objeto xts
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.
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})