2012-07-26 56 views
3

下面的示例创建一个买入信号(1),当股票(IBM)的每日跌幅超过10%时。根据购买xts对象填充持有量

然后它再创建一个保持信号4天。如果持有天数增加,代码将变得更加不稳定。有什么方法可以使用apply函数或类似效率的东西(即,不是for循环)重写holds代码?

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) 

每当我觉得自己在应用方面越来越好,我会向后退两步。

回答

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 

这使事情变得很简单:那你可以检查行由行(applyMARGIN = 1)如果值的any是等于1

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

(你可以通过as.numeric通过输出如果您需要打开{TRUE,FALSE}到{1,0})

+0

感谢mucho ...这些日子之一,思考阵列处理框外的想法会点击。 – JimmyT 2012-07-26 23:27:18