【问题标题】:How to apply technical indicators to a list of stocks如何将技术指标应用于股票列表
【发布时间】:2017-12-05 15:44:23
【问题描述】:

我正在尝试将 MACD 和 RSI 技术指标应用于股票列表的调整价格。代码的最终目标是根据 2 个指标为每只股票生成买入/卖出信号。但是,我无法使用 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))

【问题讨论】:

    标签: r lapply quantstrat technical-indicator


    【解决方案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 &lt;- 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)
    

    【讨论】:

    • 您好,很抱歉回复晚了,再次感谢您的帮助。您能否向我解释一下您的代码是如何工作的?为了回答你的问题,是的,我最终希望它看起来像这样。此外,我想包含 RSI 指标,然后如果两个指标的标准都满足,则生成买入/卖出信号。
    • 这段代码有什么不清楚的地方,我会扩展?您首先在问题中使用了这些功能(例如 do.call 等),因此不确定您不清楚什么。
    • 你能解释一下方括号 {} 在 do.call 函数中的作用吗?谢谢!
    猜你喜欢
    • 2021-04-08
    • 1970-01-01
    • 2021-04-01
    • 2020-09-02
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    相关资源
    最近更新 更多