Как рассчитать количество дней с момента пересечения скользящей средней?

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

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

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

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


person Lauren    schedule 02.10.2011    source источник
comment
возможный дубликат Как рассчитать периоды с 200- период максимума акции   -  person Andrie    schedule 03.10.2011
comment
Привет, Андри, это похоже на ваш пост о 200-дневном максимуме, но отличается, потому что я пытаюсь рассчитать количество дней, прошедших с момента пересечения ценой 200-дневной скользящей средней.   -  person Lauren    schedule 03.10.2011


Ответы (1)


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

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
person GSee    schedule 07.11.2012