2

我试图确定自趋势开始以来经过的天数,例如,当价格高于 200 天移动平均线 (SMA) 时。例如:

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

我试图返回一个范围从 0(第一天跨越 200 天 SMA)到 X 或 -X 的变量,具体取决于价格趋势是高于 SMA 还是低于 SMA。

可以在没有 for 循环的情况下完成吗?

4

1 回答 1

4

此函数将返回自调整后的价格穿过其移动平均线以来的天数(穿过的当天为零)。如果当前价格低于 MA,则天数将为负数,如果当前价格高于 MA,则天数将为正数。

x是一个带有Adjusted列的 xts 对象,并且nn用于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
于 2012-11-07T04:06:27.103 回答