2

私は(限られたRの知識で)パフォーマンスの高い(ベクトル化された)方法で次の「問題」に取り組む方法のアイデアを失いました。

SPXが3日以上連続してクローズし、同時に50日安値から来ていない日を特定したいと思います。私はこれを3日間の固定ルックバック用にプログラムしましたが、動的にする方法がわかりません。コードは次のとおりです。

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日以上続けて(3、4、5、...)(変数numDaysPositiveで維持)、この上昇が50日安値から来たかどうかを確認したいと思います。3、4、5、...日を振り返って、その特定の日付(3、4、5、...)日前にSPXが50日安値になったかどうかを確認したいと思います。「論理」または仮定は、50日安値からのラリーが3日以上連続して上昇することは珍しいことではありませんが、3、4、5、...日連続で上昇している場合は50日間の安値から始まったわけではないので、「証拠」市場の1つが停止するか、しばらくの間下落する可能性があるため、これは検討する価値があるかもしれません。

今のところ、最後の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 に答える