基于另一个xts对象中的其他列,使用不同的k调用ifelse中的Lag

时间:2011-09-16 01:04:17

标签: r xts quantmod

我失去了想法(以我有限的R知识)如何以高性能(矢量化)的方式解决“问题”。

我想确定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)

编辑开始

我想看看,如果我们连续三天(3个,4个,5个......)(保持在变量numDaysPositive中)上SPX,这个上升是否来自50天的低点。我想回顾3,4,5,......天,看看是否在那个特定的日期(3,4,5,......)前几天,SPX创造了50天的低点。 “逻辑”或假设是,连续3天或更长时间从50天低点反弹的情况并不少见,但是,如果我们连续上涨3天,4天,5天......没有从50天的低点开始,那么,这可能值得考虑因为其中一个“证据”市场可能会停止甚至下跌一段时间。

现在我在最后的ifelse中使用k = 3的lag.xts,但是想使用k = numDaysPositive(dynamic)。

编辑结束

所以,我想基于numDaysPositive中的值,滞后k是动态的。我相信这很容易,如果只有一个人可以看到......我现在整整一天都在看这个,没有任何想法。

1 个答案:

答案 0 :(得分:1)

以下代码可让您查看在50天低点(或接近)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)