当股票(IBM)的每日跌幅超过10%时,下面的示例会创建买入信号(1)。
然后再创建一个保持信号4天。如果持有天数增加,代码将变得更加不守规矩。有没有办法使用apply函数或类似效率的东西重写holdig代码(即,不是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)
每当我觉得申请变得越来越好时,我会向后退两步。
答案 0 :(得分:3)
首先,请注意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
}:< / p>
apply(Lag(buysig, k=1:4) == 1, 1, any)
(如果您需要将{TRUE,FALSE}变为{1,0},则可以通过as.numeric
传递输出。