2017-06-15 1 views
-1

Ich habe zwei XTS-Objekte: stock und base. Ich berechne die relative Stärke (das ist einfach das Verhältnis von Schlusskurs der Aktie und des Basisindex) und ich möchte die wöchentliche relative Stärke außerhalb des Candlestick-Musters darstellen. Die Links für die Daten sind here und here.Plot-Funktion außerhalb der Candlestick-Muster in 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() 

jedoch R gibt mir diese Fehlermeldung:

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

Wie kann ich dieses Problem beheben?

+0

Wo sind 'stock' und' Basis "kommt aus? Machen Sie bitte ein vollständig reproduzierbares Beispiel. – Spacedman

+0

Bitte warten Sie, ich lade die Dateien und alle meinen Code – SiXUlm

+0

Ich habe meine Frage aktualisiert. – SiXUlm

Antwort

2

Ein Problem ist, dass "vni.csv" eine "Ticker" -Spalte enthält. Da xts-Objekte im Kern eine Matrix sind, können Sie keine Spalten unterschiedlicher Typen haben. Das erste, was Sie tun müssen, ist sicherzustellen, dass Sie nur die Spalten OHLC und Volume der Datei "vni.csv" behalten. Ich habe Ihre read_stock Funktion Refactoring sein:

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) 
} 

Als nächstes es die wie das erste Argument relative.strength innerhalb der addRS Funktion sieht als Matrix übergeben wird, nicht ein XTS-Objekt. Sie müssen also in xts konvertieren, aber achten Sie darauf, dass die Indexklasse des Objekts stock mit der Indexklasse des Objekts base übereinstimmt.

Dann müssen Sie sicherstellen, dass Ihre wöchentliche rs Objekt hat eine Beobachtung für jeden Tag in stock. Sie können dies tun, indem Sie Ihre wöchentlichen Daten mit einem leeren xts-Objekt zusammenführen, das alle Indexwerte für das Objekt stock enthält.

So Refactoring ich Ihre relative.strength Funktion:

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) 
} 

Nun diesem Code:

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) 

diese Grafik Erzeugt:

enter image description here

+0

Vielen Dank! Ich habe eine kleine Frage. In der ersten Zeile relativ.Stärkefunktion, warum müssen wir noch "stock" in ein xts-Objekt umwandeln, obwohl der "stock" selbst schon ein xts-Objekt ist (als Folge der read_stock-Funktion)? – SiXUlm

+0

@SiXUlm: Weil die 'addRS' -Funktion, die von' newTA' generiert wird, 'as.matrix' auf den xts-Daten aufruft. Also müssen wir es mit einem Date-Index zurück in xts konvertieren, um mit dem "base" -Objekt zu verschmelzen. –

+0

Ich verstehe jetzt. Danke vielmals! – SiXUlm

0

Die folgende Zeile in Ihrer read_stock Funktion das Problem verursacht:

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

vni.csv die tatsächlichen Symbolnamen in der dritten Spalte Ihrer Daten hat, also wenn Sie stock[,-1] setzen Sie tatsächlich eine Zeichenspalte einschließlich und xts zwingt alle anderen Spalten dazu, auch Zeichen zu sein. Dann warnt R Sie davor, eine Zahl durch ein Zeichen unter Cl(stock)/Cl(base) zu teilen. Hier ist ein einfaches Beispiel für diese Fehlermeldung mit Teilung:

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

Ich schlage vor, Sie die Zeichenspalte in vni.csv entfernen, die "VNIndex" in jeder Zeile enthält oder ändern Sie Ihre Funktion read_stock() genannt besser zu schützen gegen diese Art von Problem.

Verwandte Themen