Заполнение удержания на основе покупки объекта xts

В приведенном ниже примере создается сигнал покупки (1), когда стоимость акций (IBM) падает более чем на 10% в день.

Затем он создает сигнал удержания еще на 4 дня. Если бы количество дней ожидания увеличилось, код стал бы более неуправляемым. Есть ли способ переписать код удержания, используя либо функцию применения, либо что-то подобное по эффективности (т. е. не цикл 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)

Каждый раз, когда я чувствую, что работаю с приложением лучше, я делаю два шага назад.


person JimmyT    schedule 26.07.2012    source источник


Ответы (1)


Во-первых, обратите внимание, что Lag может принимать вектор из k значений:

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

Это упрощает задачу: затем вы можете проверять построчно (apply с MARGIN = 1), если any значений равно 1:

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

(и вы можете передать вывод через as.numeric, если вам нужно превратить {TRUE,FALSE} в {1,0})

person flodel    schedule 26.07.2012
comment
Большое спасибо... в один из этих дней щелкнет мышление, выходящее за рамки обработки массива. - person JimmyT; 27.07.2012