R 中烛台图案外的绘图函数

Plot function outside the candlestick pattern in R

我有两个 xts 对象:stockbase。我计算了相对强度(即股票收盘价与基本指数的比率),我想在烛台模式之外绘制每周相对强度。数据的链接是 here and here.

library(quantmod)
library(xts)

read_stock = function(fichier){ #read and preprocess data
  stock = read.csv(fichier, header = T)
  stock$DATE = as.Date(stock$DATE, format = "%d/%m/%Y") #standardize time format
  stock = stock[! duplicated(index(stock), fromLast = T),] # Remove rows with a duplicated timestamp, 
                                                      # but keep the latest one
  stock$CLOSE = as.numeric(stock$CLOSE) #current numeric columns are of type character
  stock$OPEN = as.numeric(stock$OPEN)   #so need to convert into double
  stock$HIGH = as.numeric(stock$HIGH)   #otherwise quantmod functions won't work
  stock$LOW = as.numeric(stock$LOW)
  stock$VOLUME = as.numeric(stock$VOLUME)
  stock = xts(x = stock[,-1], order.by = stock[,1]) # convert to xts class
  return(stock)
}

relative.strength = function(stock, base = read_stock("vni.csv")){
  rs = Cl(stock) / Cl(base)
  rs = apply.weekly(rs, FUN = mean)
}
stock = read_stock("aaa.csv")

candleChart(stock, theme='white')
addRS = newTA(FUN=relative.strength,col='red', legend='RS')
addRS()

然而 R returns 我这个错误:

 Error in `/.default`(Cl(stock), Cl(base)) : non-numeric argument to binary operator

我该如何解决这个问题?

您的 read_stock 函数中的以下行导致了问题:

stock = xts(x = stock[,-1], order.by = stock[,1]) # convert to xts class

vni.csv 在数据的第三列中有实际的交易品种名称,所以当你输入 stock[,-1] 时,你实际上包含了一个字符列,而 xts 强制所有其他列列也是字符。然后 R 会提醒您将数字除以 Cl(stock) / Cl(base) 处的字符。这是带有除法的此错误消息的简单示例:

> x <- c(1,2)
> y <- c("A", "B")
> x/y
Error in x/y : non-numeric argument to binary operator

我建议您删除 vni.csv 中每行包含 "VNIndex" 的字符列,或者修改名为 read_stock() 的函数以更好地防止此类问题。

一个问题是 "vni.csv" 包含一个 "Ticker" 列。由于 xts 对象的核心是矩阵,因此您不能拥有不同类型的列。因此,您需要做的第一件事是确保只保留 "vni.csv" 文件的 OHLC 和体积列。我已将您的 read_stock 函数重构为:

read_stock = function(fichier) {
  # read and preprocess data
  stock <- read.csv(fichier, header = TRUE, as.is = TRUE)
  stock$DATE = as.Date(stock$DATE, format = "%d/%m/%Y")
  stock = stock[!duplicated(index(stock), fromLast = TRUE),]
  # convert to xts class
  stock = xts(OHLCV(stock), order.by = stock$DATE)
  return(stock)
}

接下来,addRS 函数中 relative.strength 的第一个参数似乎作为矩阵传递,而不是 xts 对象。所以需要转换成xts,但是注意stock对象的索引class和base对象的索引class相同[=23] =]

然后您需要确保您的每周 rs 对象在 stock 中的每一天都有一个观察值。您可以通过将每周数据与一个空的 xts 对象合并来做到这一点,该对象具有 stock 对象的所有索引值。

所以我将您的 relative.strength 函数重构为:

relative.strength = function(stock, base) {
  # convert to xts
  sxts <- as.xts(stock)
  # ensure 'stock' index class is the same as 'base' index class
  indexClass(sxts) <- indexClass(base)
  index(sxts) <- index(sxts)
  # calculate relative strength
  rs = Cl(sxts) / Cl(base)
  # weekly mean relative strength
  rs = apply.weekly(rs, FUN = mean)
  # merge 'rs' with empty xts object contain the same index values as 'stock'
  merge(rs, xts(,index(sxts)), fill = na.locf)
}

现在,这段代码:

stock = read_stock("aaa.csv")
base = read_stock("vni.csv")
addRS = newTA(FUN=relative.strength, col='red', legend='RS')
candleChart(stock, theme='white')
addRS(base)

生成此图表: