Quantmod Heikin-Ashi 绘图不可用

Quantmod Heikin-Ashi plotting unavailable

最近我一直在使用 R 的 quantmod 包。我的想法是使用 shiny 包来设计网络应用程序的用户界面,同时使用 quantmod 函数为用户绘制股票数据图表。

尽管如此,从源代码文档来看,似乎没有用于绘制 Heikin-Ashi 图的预写函数(例如 chartSeries)。

是否有替代解决方案来绘制 Heikin-Ashi 图而无需从头开始构建绘图函数。

感谢任何帮助。

在 quantmod 的一些遗留/无效代码中,隐藏了一些 Heikin-Ashi 功能。但是使用的公式不正确,会产生错误。但 Heikin-Ashi 图表只是一个烛台图表,但具有不同的开盘价和收盘价。但这些只是基于标准的 ohlc 数据。了解公式后,您可以自己计算数字并将其传递给烛台图表。

我在 github 上在我自己的包中创建了这个函数。但是如果你使用这个功能,你就可以开始了。我在 quantmod 的 chartSeries 和 chart_Series、rtsplot 的 rtsplot 和 tidyquant 的 geom_candlestick 上测试了它,看看它们是否都能正确处理数据。与显示 Heikin-Ashi 图表的经纪商数据和平台相比,结果是相同的。

基本上:

library(quantmod)
ADM <- getSymbols("ADM", from = "2018-10-01", auto.assign = FALSE)
ha_ADM <- heikin_ashi(AMD)
chartSeries(ha_ADM) # or chart_Series or rtsplot or geom_candlestick

heikin_ashi 函数:

heikin_ashi <- function(data) {

  if(!quantmod::is.OHLC(data)) stop("data must contain OHLC columns")

  heikin_close <- xts::xts(Matrix::rowMeans(quantmod::OHLC(data)), order.by = index(data))
  heikin_open  <- quantmod::Op(data)

  # need a loop: heiki ashi open is dependent on the previous value
  for(i in 2:nrow(data)) {
    heikin_open[i] <- (heikin_open[i-1] + heikin_close[i-1]) / 2
  }

  heikin_high <- xts::xts(apply(cbind(quantmod::Hi(data), heikin_open, heikin_close), 1, max), order.by = index(data))
  heikin_low <- xts::xts(apply(cbind(quantmod::Lo(data), heikin_open, heikin_close), 1, min), order.by = index(data))

  out <- merge(heikin_open, heikin_high, heikin_low, heikin_close)
  out <- setNames(out, c("Open", "High", "Low", "Close"))
}

如果您需要速度,请使用 Rcpp 版本。这是 Rcpp 真正发挥作用的场景类型:

Rcpp::cppFunction('NumericMatrix RawHeikinAshi(NumericMatrix x, CharacterVector n) {
// assumes OHLC matrix input
int nrow = x.nrow(), ncol = 4, Op=0, Hi=1, Lo=2, Cl=3;
NumericMatrix ha(nrow,ncol);
for (int i = 0; i < nrow; i++) {
    ha(i, Cl) = (x(i,Op) + x(i,Hi) + x(i,Lo) + x(i,Cl)) / 4.0;
    ha(i, Op) = (i > 0) ? ((ha(i - 1, Op) + ha(i - 1, Cl)) / 2.0) : x(i, Op);
    ha(i, Hi) = std::max(x(i, Hi), std::max(ha(i, Op), ha(i, Cl)));
    ha(i, Lo) = std::min(x(i, Lo), std::min(ha(i, Op), ha(i, Cl)));
}
colnames(ha) = n;
return ha;
}')

HAOHLC <- function(x) {
    x <- OHLC(try.xts(x))
    r <- RawHeikinAshi(x, paste0("ha.", colnames(x)))
    return(reclass(r, x))
}

基准。

> p <- getSymbols("SPY")
> microbenchmark(HAOHLC(p), heikin_ashi(p), times = 100L, unit = "ms")

Unit: milliseconds
          expr       min          lq        mean     median         uq        max neval
     HAOHLC(p)   0.36409   0.4275205   0.5198086   0.502614   0.552392   1.378134   100
heikin_ashi(p) 563.33925 582.6144955 609.0082902 591.338550 620.179235 802.885348   100