2017-01-28 3 views
0

Я работаю над относительной функцией возврата, чтобы сравнить цены с тикером. Функция довольно проста: Cl(x)/Cl(Benchmark).Восстановить оригинальные xts в шаблоне Quantmod newTA call

У меня возникли проблемы с выравниванием индекса (дат) ввода к эталону. Я думаю, что я сузил это до проблемы с часовым поясом, когда я пытаюсь интерпретировать данные, переданные моей TA-функции, в объект xts. Для этого я использую x <- try.xts(x, error = as.matrix). Однако это, по-видимому, не учитывает часовой пояс от исходных данных.

Любые идеи о том, как получить часовой пояс от исходных данных из quantmodnewTA() шаблонный вызов? Функция

ТА:

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) 

Тест:

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

Это выводит следующий промежуточный результат (в процессе тестирования)

    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 

Как вы можете видеть, есть время элементы, возникающие в индексе из-за часового пояса, которые вызывают несоосность.

ответ

0

Этане, я предлагаю создать эталонную серию вне вызова функции, как каждый раз, когда вы вызываете функцию, которую вы должны ее загрузить снова. Мое решение было бы следующее:

скачать тест:

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

функция: last и NROW обеспечить ориентир и инструмент имеют одинаковый стартовый день. Если эталонная и инструментальная торговля на разных биржах и имеют разные торговые дни (обменные каникулы), вам необходимо соответствующим образом адаптировать код и реализовать некоторую обработку ошибок (iechecking of dimensions и т. Д.). В вашем примере я предполагаю, что эталон и инструмент торгуются на в те же дни.

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

Давайте скачать AMZN с другой отправной день:

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

и создать диаграмму

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

enter image description here

Примечание: Рассмотрим избыточные прибыли вместо соотношения цен. Это более полезно, как сила «значение индикатора» можно сравнить между различными инструментами

UPDATE:. using merge и addTA

Это гибкое решение позволяет легко играть с различными тикерами и/или контрольные ориентиры:

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. thats примерно обходной способ использования ive.то, что я на самом деле делаю, заключается в объединении эталона в качестве столбца на цену xts, а затем передать имена/ординалы столбцов, содержащих цену и контрольную сумму, для моей функции RelPerf. Как вы указываете, это позволяет мне разработать выравнивание вверх. по-прежнему беспокоит меня, что я не могу вернуться к моим исходным данным. чувствует, что я что-то делаю неправильно – Ethan

+0

@Ethan, см. мое обновление – hvollmeier

Смежные вопросы