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