Как применить технические индикаторы к списку акций

Я пытаюсь применить технические индикаторы MACD и RSI к скорректированным ценам списка акций. Конечная цель кода — генерировать сигнал покупки/продажи для каждой акции на основе двух индикаторов. Однако у меня возникли проблемы с применением индикаторов с помощью функции lapply. Я буду признателен за всю вашу помощь. Спасибо!

#Load Packages
    library(quantstrat) 

#Initialise Settings
    start.date <- "2016-01-01"
    end.date <- as.character(Sys.Date())

#Stock Tickers
    tickers <- c("JPM", #JP Morgan
    "FB", #Facebook
    "SPY", #S&P 500
    "AMZN", #Amazon
    "WMT", #Wal-Mart
    "LVMUY", #LVMH
    "MCD", #Mac Donald's
    "BMW", #BMW
    "KO", #Coca-Cola
    "G13.SI", #Genting Sg
    "Z74.SI" #Singtel   
    )

#Retrieving Stock Data
    options("getSymbols.yahoo.warning"=FALSE)
    suppressMessages(getSymbols(Symbols = tickers, from = start.date, to = end.date, src = "yahoo", adjust = TRUE))

#Grouping Adjusted Prices
    AdjPrices <- do.call(merge, lapply(tickers, function(x) Ad(get(x))))

#Apply MACD Indicator
    MACD <- lapply(AdjPrices, MACD, list(AdjPrices, nFast =12, nSlow = 26, nSig = 9))

person Law Wenting    schedule 02.07.2017    source источник


Ответы (1)


Попробуйте это вместо этого:

MACD <- lapply(AdjPrices, FUN = MACD, nFast =12, nSlow = 26, nSig = 9)

Может быть, вы в конечном итоге хотите что-то вроде этого?

    z <- do.call(merge, lapply(AdjPrices, function(x, nFast, nSlow, nSig) {
        y <- MACD(x, nFast, nSlow, nSig) 
        colnames(y) <- paste0(colnames(y),".", gsub(pattern = ".Adjusted", replacement = "", x = colnames(x)))
        y
        }, nFast = 12, nSlow = 26, nSig = 9))

> tail(z)
            macd.JPM signal.JPM   macd.FB signal.FB  macd.SPY signal.SPY
2017-06-23 0.5439033  0.2746984 0.7333757 0.6242897 0.4931503  0.5617852
2017-06-26 0.5628315  0.3323250 0.7378923 0.6470103 0.4735852  0.5441452
2017-06-27 0.6455863  0.3949773 0.5754388 0.6326960 0.3884193  0.5130000
2017-06-28 0.8647098  0.4889238 0.5809413 0.6223450 0.3883060  0.4880612
2017-06-29 1.1460891  0.6203568 0.4633677 0.5905496 0.3134080  0.4531306
2017-06-30 1.3738249  0.7710504 0.3627919 0.5449980 0.2656285  0.4156302

Изменить, дополнительное объяснение того, что происходит:

В приведенном выше вызове функции lapply определена анонимная функция (этот бит: function(x, nFast, nSlow, nSig) { ..... }), которая вычисляет MACD для тикера, а затем переименовывает столбцы. Обратите внимание, что эта функция не имеет «имени» или, другими словами, функция не присваивается переменной (написание этого кода присваивает функцию переменной в R, например, use_macd <- function() {} )

Приведенный выше код эквивалентен следующему (более подробному) коду, где мы явно определяем функцию, которую будет вызывать lapply, а затем результаты объединяются с помощью do.call(merge ....)

use_MACD <- function(x, nFast, nSlow, nSig) {
               y <- MACD(x, nFast, nSlow, nSig) 
               colnames(y) <- paste0(colnames(y),".", gsub(pattern = ".Adjusted", replacement = "", x = colnames(x)))
               y
}


tickerLst <- lapply(AdjPrices, FUN = use_MACD, nFast = 12, nSlow = 26, nSig = 9)
# Now have a list of "macd" values for each ticker.

#Combine into one xts object:
z <- do.call(merge, tickerLst)
person FXQuantTrader    schedule 02.07.2017
comment
Привет, извините за поздний ответ и еще раз спасибо за вашу помощь. Не могли бы вы объяснить мне, как работает ваш код? И, отвечая на ваш вопрос, да, в конечном итоге я хотел бы, чтобы это выглядело так. Кроме того, я хотел бы включить индикатор RSI, а затем генерировать сигналы покупки/продажи, если выполняются оба критерия индикатора. - person Law Wenting; 08.07.2017
comment
Что неясно в этом коде, и я буду расширять? Вы использовали эти функции в своем вопросе в первую очередь (например, do.call и т. д.), поэтому не уверены, что вам непонятно. - person FXQuantTrader; 13.07.2017
comment
Не могли бы вы объяснить мне роль квадратных скобок {} в функции do.call? Спасибо! - person Law Wenting; 15.07.2017