2017-06-15 5 views
-1

私は2つの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

ベース 'から来る?完全に再現可能な例を作成してください。 – Spacedman

+0

お待ちください、ファイルとすべてのコードをアップロードしています – SiXUlm

+0

私の質問が更新されました。 – SiXUlm

答えて

2

「vni.csv」には「ティッカー」列が含まれているという問題が1つあります。 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) 
} 

次に、それは行列ではなく、XTSオブジェクトとして渡されaddRS関数内relative.strengthの最初の引数のように見えます。したがって、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) 

は、このチャートを生成します:

`stock`と`あるenter image description here

+0

ありがとう!私は小さな質問が1つあります。相対的な第1行目。"ストック"自体が(read_stock関数の結果として)xtsオブジェクトであっても、なぜ "ストック"をxtsオブジェクトに変換する必要があるのでしょうか? – SiXUlm

+0

@SiXUlm: 'newTA 'によって生成された' addRS'関数は、xtsデータで 'as.matrix'を呼び出します。だから、 'base'オブジェクトとマージするためにDateインデックスを使ってxtsに変換する必要があります。 –

+0

私は今理解しています。どうもありがとう! – SiXUlm

0

あなたread_stock機能に次の行が問題を引き起こしている:

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

vni.csvあなたがstock[,-1]を置くときに、あなたが実際に文字列を含めている、あなたのデータの第3列に実際のシンボル名を持ちますxtsは、他のすべての列も同様に文字にします。その後、Rは数字を文字で分けることについて、Cl(stock)/Cl(base)に警告します。よりよいこの種の問題から保護するためにread_stock()と呼ば

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

私はあなたがすべての行で"VNIndex"が含まれていvni.csv内の文字列を削除したり、機能を変更する提案:ここでは部門と、このエラーメッセージの簡単な例です。

関連する問題