如何计算移动平均线交叉后的天数?

发布于 2024-12-08 09:12:23 字数 293 浏览 0 评论 0原文

我试图确定自趋势开始以来已经过去的天数,例如,当价格高于 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循环可以完成吗?

I'm trying to determine the number of days that have passed since the beginning of a trend, e.g. when price has moved above the 200 day moving average (SMA). For example:

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

I'm trying to return a variable that ranges from 0 (first day crossing over the 200 day SMA) to X or -X, depending on whether price is trending above the SMA or below.

Can it be done without a for loop?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寄居者 2024-12-15 09:12:23

此函数将返回自调整后价格穿过其移动平均线以来的天数(穿过当天为零)。如果当前价格低于 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

This function will return the number of days since the Adjusted price crossed its moving average (zero on the day it crosses). The number of days will be a negative number if the current price is below the MA, and will be positive if the current price is above the MA.

x is an xts object with an Adjusted column, and n is the n to use for the 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文