R 中烛台图案外的绘图函数
Plot function outside the candlestick pattern in R
我有两个 xts 对象:stock
和 base
。我计算了相对强度(即股票收盘价与基本指数的比率),我想在烛台模式之外绘制每周相对强度。数据的链接是 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)
生成此图表:
我有两个 xts 对象:stock
和 base
。我计算了相对强度(即股票收盘价与基本指数的比率),我想在烛台模式之外绘制每周相对强度。数据的链接是 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)
生成此图表: