2011-09-16 2 views
2

パフォーマンス(ベクトル化)の方法で「問題」に取り組む方法を(限られたR知識で)忘れました。別のxtsオブジェクトの別の列に基づいて、異なるkを持つifelseの遅れを呼び出す

SPXが3日以上連続して終了し、同時に50日間の最低期間から来ていない日を決定したいと思います。私はこれを3日間固定して見直すようにプログラムしましたが、動的にする方法はわかりません。ここでは、コードです:

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

編集開始

我々はSPX上にある場合、私は、見たい:

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) 

私が望む何を行うことができることは、このようなものですこの上昇が50日間の低水準から生じたかどうかにかかわらず、3日以上(3、4、5、...)(変数numDaysPositiveに保持されています)。 3日、4日、5日、...特定の日(3、4、5、...)日前にSPXが50日間低かったかどうかを調べるために戻ってみたい。 「論理」または仮定は、3日以上連続して50日ぶりの高値からのラリーは珍しいことではないが、3日、4日、5日、 50日の低水準から始まっていない場合、「証拠」市場の1つが中断したり、しばらく落ち込んだりする可能性があるため、これは検討する価値があるかもしれません。

今のところ私は最後のifelseでk = 3のlag.xtsを使用していますが、k = numDaysPositive(動的)を使用したいと考えています。

編集終了

だから、私は遅れでそのkはnumDaysPositiveの値に基づいて動的であるたいと思います。私は一人だけ見ることができればこれは簡単だと確信しています...私は今一日これを見ていますが、何も気にしません。

+0

あなたのコードから、あなたがしようとしていることは明確ではありません。 'SPX.Lo.gt.50day.low'は' k = n'を除いて常に '1'です。 –

+0

質問を編集しました。私は達成しようとしていることをよりよく説明してくれることを願っています。前に計算された日数に基づいてlag.xtsで動的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

ジョシュアありがとうございます。見て、これを私のコードに組み込もうとします。 – user947967

関連する問題