2017-01-28 2 views
0

Ich arbeite an einer relativen Rückkehrfunktion, um Preise einen Ticker mit einem Benchmark zu vergleichen. Die Funktion ist ziemlich einfach: Cl(x)/Cl(Benchmark).Rekonstruieren original xts in einem templated quantmod newTA Aufruf

Ich habe Probleme, den Index (Daten) der Eingabe an den Benchmark auszurichten. Ich glaube, ich habe das auf ein Zeitzonenproblem reduziert, wenn ich versuche, die an meine TA-Funktion übergebenen Daten in ein xts-Objekt zu interpretieren. Dafür verwende ich x <- try.xts(x, error = as.matrix). Dies scheint jedoch die Zeitzone aus den ursprünglichen Daten zu verpassen.

Irgendwelche Ideen, wie man die Zeitzone von den ursprünglichen Daten von innerhalb eines quantmodnewTA() templated Anrufs erhält?

Die TA-Funktion:

TestTA <- function(x) { 
     x <- try.xts(x, error = as.matrix) 
     print(paste("Input to TA", indexClass(x), indexTZ(x), sep = ": ")) 
     SPY <- getSymbols("SPY", auto.assign = FALSE, src = "yahoo") 
     print(paste("call wihitn TA", indexClass(SPY), indexTZ(SPY), sep = ": ")) 
     m <- merge(Cl(x), Cl(SPY), all = TRUE) 
     print(tail(m)) 
     return(Cl(x)/Cl(SPY)) # This is what i really want to do, but cant until i get the dates to line up 
} 

addTestTA <- newTA(TestTA) 

Der Test:

IBM <- getSymbols("IBM", auto.assign = FALSE, src = "yahoo") 
paste("Raw IBM DATA", indexClass(IBM), indexTZ(IBM), sep = ": ") 
chartSeries(IBM, TA = "addTestTA()") 

Das gibt das folgende Zwischenergebnis (während des Tests)

    IBM.Close SPY.Close 
2017-01-24 17:00:00  NA 229.57 
2017-01-25 00:00:00 178.29  NA 
2017-01-25 17:00:00  NA 229.33 
2017-01-26 00:00:00 178.66  NA 
2017-01-26 17:00:00  NA 228.97 
2017-01-27 00:00:00 177.30  NA 

Wie Sie sehen können, gibt es Zeit Elemente, die aufgrund von Zeitzonen im Index erscheinen, die Ursache für Fehlausrichtung sind.

Antwort

0

Ethan, ich schlage vor, die Benchmark-Serie außerhalb des Funktionsaufrufs zu erstellen, da jedes Mal, wenn Sie die Funktion aufrufen, Sie es erneut herunterladen müssen. Meine Lösung wäre folgende:

zum Download von Benchmark:

benchmark <- "SPY" # keep the benchmark flexible 
bm <- getSymbols(benchmark,from = '2012-01-01', auto.assign = FALSE) 

die Funktion: last und NROW sicherzustellen, dass die Benchmark und Instrument hat gleichen Starttag. Wenn Benchmark und Instrument an verschiedenen Börsen gehandelt werden und unterschiedliche Handelstage (Exchange Holidays) haben, müssen Sie den Code entsprechend anpassen und eine Fehlerbehandlung (zB Überprüfung von Dimensionen etc.) implementieren. In Ihrem Beispiel gehe ich davon aus, dass Benchmark und Instrument an der Börse gehandelt werden gleiche Tage. das Diagramm

chartSeries(AMZN, TA = "addTestTA()") 

enter image description here

Hinweis

getSymbols("AMZN",from = '2014-01-01') 

und erstellen:

TestTA <- function(x) { 
    return(Cl(x)/last(Cl(bm),NROW(x))) 
} 
addTestTA <- newTA(TestTA) 

der AMZN mit einem anderen Starttag herunterladen Lassen Überrenditen statt Preisverhältnis in Betracht. Es ist sinnvoller als die Stärke des „Indikatorwertes“ kann zwischen verschiedenen Instrumenten verglichen werden

UPDATE. using merge und addTA

Diese flexible Lösung macht es einfach, mit verschiedenen Tickern zu spielen, um und/oder Benchmarks:

relStrength <- function(x,bm){ #x: instrument OHLC object, bm: benchmark OHLC object 
    m <- merge(Ad(x),Ad(bm), join ='inner') 
    RS <- m[,1]/m[,2] 
} 
ticker <- 'IBM' 
Instr <- cbind(Instr <- getSymbols(ticker,from='2014-01-01',auto.assign = FALSE),RS=relStrength(Instr,bm = SPY)) 
chartSeries(Instr,TA='addTA(Instr[,7])') 
+0

thx @hvollmeier.Das ist ungefähr die Workaround ive gewesen.was ich tatsächlich tue, ist, den Benchmark als eine Spalte auf den Preis xts zusammenzufassen und dann die Namen/Ordinalzahlen der Spalten, die den Preis und den Benchmark enthalten, an meine RelPerf-Funktion zu übergeben. Wie Sie darauf hinweisen, erlaubt mir das, die Ausrichtung im Voraus auszuarbeiten. stört mich immer noch, dass ich nicht zu meinen ursprünglichen Daten zurückkehren kann. fühlt sich an, als würde ich etwas falsch machen – Ethan

+0

@Ethan, siehe mein Update – hvollmeier