Вызов Lag в ifelse с другим k на основе некоторого другого столбца в другом объекте xts - PullRequest
2 голосов
/ 16 сентября 2011

Я потерял идеи (с моим ограниченным знанием 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)

РЕДАКТИРОВАТЬ НАЧАЛО

Хотелось бы посмотреть, если мы работаем над SPX более трех дней подряд (3, 4, 5, ...) (в переменной numDaysPositive), произошел ли этот рост с 50-дневного минимума. Я хотел бы оглянуться назад на 3, 4, 5, ... дней, чтобы увидеть, достиг ли SPX 50-дневного минимума в эту конкретную дату (3, 4, 5, ...) дней назад. «Логика» или предположение состоит в том, что для митингов с 50-дневных минимумов повышение до 3 или более дней подряд не является редкостью, но, если мы выросли на 3, 4, 5, ... дней подряд, и это не стоит начинать с 50-дневного минимума, поэтому стоит подумать, так как один из «доказательств» рынка может остановиться или даже упасть на некоторое время.

На данный момент я использую lag.xts с k = 3 в последнем ifelse, но хотел бы использовать k = numDaysPositive (dynamic).

РЕДАКТИРОВАТЬ КОНЕЦ

Итак, я хотел бы, чтобы k в лаге было динамическим в зависимости от значения в numDaysPositive. Я уверен, что это легко, если только один может увидеть, как ... Я смотрю на это целый день, и ничего не приходит в голову.

1 Ответ

1 голос
/ 16 сентября 2011

Приведенный ниже код позволит вам увидеть, какая серия дней накопления началась на (или около) 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)
...