首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R (quantmod),绘图自身指示器,seq.default错误

R (quantmod),绘图自身指示器,seq.default错误
EN

Stack Overflow用户
提问于 2017-01-28 06:50:40
回答 2查看 119关注 0票数 1

我想在quantmod中绘制我自己的简单指示器,如下所示:

代码语言:javascript
复制
own.ind <- as.matrix(c(1,2,3), ncol=1, nrow=3)
rownames(own.ind) <- c("2017-01-23", "2017-01-24", "2017-01-25")
own.ind <- as.xts(own.ind)
getSymbols("AAPL", from = as.Date("2017-01-23"), to = as.Date("2017-01-25"))
chartSeries(AAPL)
addTA(own.ind)

但这让我犯了一个错误

代码语言:javascript
复制
Error in seq.default(min(tav * 0.975, na.rm = TRUE), max(tav * 1.05, na.rm = TRUE),  : 
'from' cannot be NA, NaN or infinite

以及另外两个警告:

代码语言:javascript
复制
1: In min(tav * 0.975, na.rm = TRUE) :  no non-missing arguments to min; returning Inf
2: In max(tav * 1.05, na.rm = TRUE) :  no non-missing arguments to max; returning -Inf

怎么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-28 16:53:01

Joe,你必须创建一个函数来添加序列作为指示器。要创建一个每个交易日增加1的指标,如您的示例所示,执行以下操作:

代码语言:javascript
复制
myInd <- function(x) {
  x <- 1:NROW(x)
  return(x)
}

创建新指标:

代码语言:javascript
复制
addMyInd <- newTA(FUN = myInd, legend = "MyInd")

检查class的步骤

代码语言:javascript
复制
> class(addMyInd)
[1] “function”

现在让我们在价格图表下面绘制新的指标:

代码语言:javascript
复制
getSymbols("AAPL", from = "2017-01-23", to = "2017-01-25")
chartSeries(AAPL,TA=NULL)
addMyInd()

票数 0
EN

Stack Overflow用户

发布于 2017-01-28 22:15:03

问题是own.ind对象的索引与AAPL对象中的任何索引值都不对齐。这是因为默认情况下,as.xts会将矩阵的行名转换为POSIXctPOSIXct对象有一个时区,而Date对象没有时区。

代码语言:javascript
复制
R> merge(Cl(AAPL), own.ind)
           AAPL.Close own.ind
2017-01-23     120.08      NA
2017-01-23         NA       1
2017-01-24     119.97      NA
2017-01-24         NA       2
2017-01-25     121.88      NA
2017-01-25         NA       3

因此,您需要将dateFormat参数指定给as.xts,或者直接使用xts构造函数和as.Date

代码语言:javascript
复制
# use dateFormat
own.ind <- as.matrix(c(1,2,3), ncol=1, nrow=3)
rownames(own.ind) <- c("2017-01-23", "2017-01-24", "2017-01-25")
own.ind <- as.xts(own.ind, dateFormat = "Date")
merge(Cl(AAPL), own.ind)
#            AAPL.Close own.ind
# 2017-01-23     120.08       1
# 2017-01-24     119.97       2
# 2017-01-25     121.88       3

# use xts constructor and as.Date
own.ind <- xts(1:3, as.Date(c("2017-01-23", "2017-01-24", "2017-01-25")))
merge(Cl(AAPL), own.ind)
#            AAPL.Close own.ind
# 2017-01-23     120.08       1
# 2017-01-24     119.97       2
# 2017-01-25     121.88       3

现在,您可以使用addTA,而不必像另一个答案所说的那样创建函数。

代码语言:javascript
复制
chartSeries(AAPL, TA="addTA(own.ind)")

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41904302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档