2

価格が 200 日移動平均 (SMA) を超えたときなど、トレンドの開始から経過した日数を判断しようとしています。例えば:

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

価格が SMA を上回っているか下回っているかに応じて、0 (200 日 SMA を超える最初の日) から X または -X までの範囲の変数を返そうとしています。

for ループなしで実行できますか?

4

1 に答える 1

4

この関数は、調整済み価格が移動平均線を超えてからの日数を返します (交差した日のゼロ)。現在の価格が MA を下回っている場合、日数は負の数になり、現在の価格が MA を上回っている場合は正の数になります。

xAdjusted列を持つ xts オブジェクトでnありnSMA

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 に答える