2012-07-26 55 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