2

我失去了想法(以我有限的 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,...)在 SPX 上上涨(保留在变量 numDaysPositive 中),这种上涨是否来自 50 天的低点。我想回顾 3、4、5……天,看看是否在那个特定日期(3、4、5……)天前 SPX 创下了 50 天的低点。“逻辑”或假设是,对于从 50 天低点开始连续 3 天或更多天上涨的反弹并不少见,但是,如果我们连续 3、4、5 天......没有从 50 天低点开始,那么,这可能值得考虑,因为其中一个“证据”市场可能会停止甚至下跌一段时间。

现在我在最后一个 ifelse 中使用 k=3 的 lag.xts 但想使用 k=numDaysPositive (动态)。

编辑结束

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

4

1 回答 1

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)
于 2011-09-16T16:26:01.717 回答