2011-09-16 4 views
2

성능이 좋은 (벡터화 된) 방식으로 "문제"를 해결하는 방법을 제한된 R 지식으로 잃었습니다.다른 xts 객체의 다른 열을 기반으로 다른 k를 가진 ifelse에서 지연을 호출

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) 

편집 START는

우리가 SPX 위로 있다면 내가보고 싶은

3 일, 4 일, 5 일 ... (변수 numDaysPositive로 유지)이 상승이 50 일 최저 였는지 여부. 3, 4, 5, ... 며칠 전에 특정 날짜 (3, 4, 5, ...) 일 전에 SPX가 50 일을 낮게 유지했는지 확인하고 싶습니다. "논리"또는 가정은 50 일 최저에서 3 일 이상 연속 상승하는 집회가 드문 일이 아니지만 우리가 3, 4, 5, ... 일 연속으로 진행한다면 50 일의 최저치에서 시작하지 않았다면, "증거"시장 중 하나가 잠시 멈추거나 잠잠해질 수 있으므로 고려해 볼 가치가 있습니다.

지금은 마지막 ifelse에서 k = 3 인 lag.xts를 사용하고 있지만 k = numDaysPositive (동적)를 사용하고 싶습니다.

편집 END 그래서

, I는 numDaysPositive의 값에 기반 동적 지연에 해당 K 싶습니다. 나는 이것이 어떻게 쉬운지를 볼 수 있다면 이것이 쉽다는 것을 확신합니다 ... 나는 지금 하루 종일 이것을보고 있습니다. 그리고 아무것도 생각에 오지 않습니다.

+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