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