当股票 (IBM) 的每日跌幅超过 10% 时,下面的示例创建了一个买入信号 (1)。
然后它会再创建一个保持信号 4 天。如果保留天数增加,代码将变得更加不守规矩。有没有什么方法可以使用 apply 函数或类似效率的东西(即,不是 for 循环)来重写 holdig 代码?
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)
每当我觉得自己在 apply 上变得更好时,我就会后退两步。
最佳答案
首先,请注意 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
with MARGIN = 1
)值等于 1
:
apply(Lag(buysig, k=1:4) == 1, 1, any)
(如果您需要将 {TRUE,FALSE} 转换为 {1,0},您可以通过 as.numeric
传递输出)
关于r - 基于 xts 对象的购买填充保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11679084/