2017-06-15 70 views
-1

我有兩個xts對象:stockbase。我計算相對強弱(這只是股票收盤價和基礎指數的比率),我想繪製蠟燭圖模式外的每週相對強度。數據的鏈接是herehere在R中蠟燭圖模式外的繪圖功能

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返回我這個錯誤:

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

我該如何解決這個問題?

+0

哪裏'stock'和'基地'來自?請做一個完全可重複的例子。 – Spacedman

+0

請稍候,我上傳的文件和我所有的代碼 – SiXUlm

+0

我已更新我的問題。 – SiXUlm

回答

2

一個問題是「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) 
} 

下,它看起來像第一個參數relative.strengthaddRS函數內的矩陣,而不是一個XTS對象傳遞。因此,您需要轉換爲xts,但請注意stock對象的索引類與base對象的索引類相同。

然後您需要確保您的每週rs對象每天在stock有一個觀察。您可以通過將您的每週數據與具有stock對象的所有索引值的空xts對象合併來完成此操作。

所以我重構你的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) 

產生以下圖表:

enter image description here

+0

非常感謝!我有一個小問題。在相對的第一行。強度函數,爲什麼我們仍然需要將「stock」轉換爲xts對象,即使「stock」本身已經是一個xts對象(由於read_stock函數)? – SiXUlm

+0

@SiXUlm:由於'newTA'生成的'addRS'函數在xts數據上調用'as.matrix'。所以我們需要使用Date索引將它轉換回xts以便與'base'對象合併。 –

+0

我現在明白了。非常感謝! – SiXUlm

0

在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(),以便更好地打擊此類問題的保護。

相關問題