我试图确定自趋势开始以来经过的天数,例如,当价格高于 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 循环的情况下完成吗?
此函数将返回自调整后的价格穿过其移动平均线以来的天数(穿过的当天为零)。如果当前价格低于 MA,则天数将为负数,如果当前价格高于 MA,则天数将为正数。
x
是一个带有Adjusted
列的 xts 对象,并且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