Как рассчитать дни с пересечения скользящей средней? - PullRequest
2 голосов
/ 03 октября 2011

Я пытаюсь определить количество дней, прошедших с начала тренда, например, когда цена поднялась выше 200-дневной скользящей средней (SMA). Например:

require(quantmod)
ticker <- "QQQ"
x <-getSymbols(ticker, auto.assign = FALSE)
sma <- SMA(Ad(x), 200)

Я пытаюсь вернуть переменную в диапазоне от 0 (первый день пересечения 200-дневной SMA) до X или -X, в зависимости от того, находится ли цена выше SMA или ниже.

Можно ли это сделать без цикла for?

1 Ответ

4 голосов
/ 07 ноября 2012

Эта функция будет возвращать количество дней с момента, когда скорректированная цена пересекла свое скользящее среднее (ноль в день, когда она пересекает).Количество дней будет отрицательным числом, если текущая цена ниже МА, и будет положительным, если текущая цена выше МА.

x - это объект xts со столбцом Adjustedи n - это n, используемый для SMA

DaysSinceMACross <- function(x, n) {
  prem <- Ad(x) - SMA(Ad(x), n) 
  prem[seq_len(n)] <- 0        
  x$grp <- cumsum(c(0, diff(prem > 0, na.pad=FALSE)) != 0)
  x$sign <- sign(prem)
  x$days <- ave(prem, x$grp, FUN=function(xx) 0:(NROW(xx) - 1))
  x$days * x$sign 
}

x <-getSymbols(ticker, src='yahoo', to='2012-10-22', auto.assign = FALSE)

R> tail(DaysSinceMACross(x, 10))
#           days
#2012-10-15   -5
#2012-10-16    0
#2012-10-17    1
#2012-10-18    0
#2012-10-19   -1
#2012-10-22   -2
...