2011-09-16 10 views
2

我失去了想法(使用我有限的R知識)如何解決以高性能(矢量化)方式跟隨「問題」。基於另一個xts對象中的某個其他列,調用具有不同k的ifelse中的延遲

我想確定SPX連續收盤3天或更多天的日子,同時並非來自50日低點。我編程這個固定的回顧三天,但不知道如何使它動態。下面是代碼:

require(quantmod) 
getSymbols(c("^GSPC"), adjust=TRUE, from="1990-01-01") 
assign("SPX", GSPC, envir=.GlobalEnv) 
names(SPX) <- c("SPX.Open", "SPX.High", "SPX.Low", "SPX.Close", "SPX.Volume",  "SPX.Adjusted") 

SPX.ClCl.positive <- ifelse(ClCl(SPX) > 0, 1, 0) 
SPX.ClCl.positive[is.na(SPX.ClCl.positive)] <- 0 
numDaysPositive <- cumsum(SPX.ClCl.positive) - cummax(cumsum(SPX.ClCl.positive)* (!SPX.ClCl.positive)) 
numDaysPositiveGreaterThan3 <- ifelse(numDaysPositive >= 3, 1, 0) 

SPX.Lo.gt.50day.low <- ifelse(lag.xts(Lo(SPX), k=3) <= runMin(Lo(SPX), n=50), 1, 0) 

我希望能夠做的是這樣的:

SPX.Lo.gt.50day.low <- ifelse(lag.xts(Lo(SPX), k=numDaysPositive) <= runMin(Lo(SPX), n=50), 1, 0) 

編輯開始

我想看看,如果我們達上SPX連續三天以上(3,4,5,...)(保持在變量numDaysPositive),無論這種上漲是從50日低點。我想回顧3,4,5,...天,看看在特定日期(3,4,5,...)前一天SPX是否創下50天的低點。 「邏輯」或假設是,對於連續三天或更多天連續上漲的50天低點的集會並不少見,但如果我們連續上漲3,4,5,...天,並沒有從50天的低點開始,那麼這可能是值得考慮的,因爲市場可能停止甚至下跌一段時間。

現在我在最後一個ifelse中使用k = 3的lag.xts,但想使用k = numDaysPositive(dynamic)。

編輯結束

所以,我想在滯後K是基於在numDaysPositive值動態。我相信,如果只有一個人可以看到如何......這一切都很簡單,我現在只是看着這一整天,並沒有想到任何事情。

+0

從你的代碼中,你不知道你想要做什麼。 'SPX.Lo.gt.50day.low'總是'1',除非'k = n'。 –

+0

我編輯了這個問題。我希望我能更好地解釋我想達到的目標。根據之前計算的天數,在lag.xt中有一個動態k值。 – user947967

回答

1

下面的代碼將允許您查看哪一系列的累計上漲天數開始於(或接近)50天的最低點。

# load quantmod and pull dada 
library(quantmod) 
SPX <- getSymbols("^GSPC", from="1990-01-01", auto.assign=FALSE) 
names(SPX) <- gsub("GSPC","SPX",names(SPX)) 

# up (TRUE) and down (FALSE) days 
b <- c(FALSE, ClCl(SPX)[-1] > 0) 
# run length of each stretch of up/down days 
x <- rle(as.vector(b)) 
# use rle results to create a vector of zeros (down days) and n 
# where n is the number of consecutive up days 
y <- unlist(lapply(seq_along(x$value), function(i) 
    rep(if(x$value[i]) x$lengths[i] else 0,x$lengths[i]))) 
# 50-day low 
z <- runMin(Lo(SPX), 50) == Lo(SPX) 
# convert results to xts 
y <- xts(y, index(SPX)) 
z <- xts(z, index(SPX)) 
# look at results 
tail(merge(SPX,cumUpDays=y,z),50) 
+0

謝謝Joshua。將看看,並嘗試將其納入我的代碼。 – user947967

相關問題