【问题标题】:Using function on the whole list of XTS objects在整个 XTS 对象列表上使用函数
【发布时间】:2021-12-14 14:05:46
【问题描述】:

我正在尝试在 R 中分析烛台形态 Marubozu。到目前为止,我能够下载不同的股票数据并在一个股票数据中使用“烛台”库找到形态。我想自动化这个过程,以便我可以同时在许多股票上运行 CSPMarubozu 函数。

我的主要问题是我无法真正理解如何将数据列表传递给这个函数。在尝试使用 for 循环(尝试 1)执行此操作时,我收到以下错误:“CSPMarubozu 中的错误((名称(stocks_list [i])),n = 20,ATRFactor = 0.8,: 价格系列必须包含开盘价、最高价、最低价和收盘价。”我知道,我无法将字符变量传递给此函数,但我找不到没有“”标记的索引名称的方法。(例如。 “AMZN”,我只需要 AMZN”

我的另一个尝试(尝试 2)是用 lapply() 函数来做,但同样的问题发生了

这是我的代码:

#install.packages(candlesticks)
        library(candlesticks)
        library(tidyquant)
        library(quantmod)
        
    #List of stock codes
    stocks <- c("AAPL","MSFT","GOOG","GOOGL","AMZN","TSLA","FB","ADI","ASML","ADBE","NTES","NFLX","JD","CSCO","AVGO","COST","PEP","CMCSA","PYPL","INTC","QCOM","INTU","TXN","TMUS","HON","AMAT","SBUX","CHTR","ISRG","AMGN","MRNA","ADP","LRCX","MU","TEAM","BKNG","GILD","MDLZ","CSX","PDD","MRVL","WDAY","REGN","KLAC","NXPI","ADSK","MELI","LULU","ILMN","ZM")
    
    #Timestamp
    start = '2019-01-01'
    end = '2020-01-01'
    
    #Stocks data download (creates XTS - objects)
    for (i in stocks)
    {
      i <- getSymbols(i, src = "yahoo", from = start, to = end)
    }
    
    #Stocks data download (creates list of XTS - objects
    stocks_list <- list()
    for (i in stocks){
      stocks_list[[i]] <- getSymbols(i, src = "yahoo", from = start, to = end, auto.assign=FALSE, return.class="xts")
    }
    
    #Finding Marubozu Candlestick in one stock
    AMZN_marubozu<- CSPMarubozu(AMZN, n=20, ATRFactor=.8, maxuppershadowCL=.017, maxlowershadowCL=.017)
    
    #Finding Marubozu Candlestick in the whole list of Stocks
      
      #Try 1
    for (i in names(stocks_list)){
      names(stocks_list[i]) <- CSPMarubozu((names(stocks_list[i])), n=20, ATRFactor=.8, maxuppershadowCL=.017, maxlowershadowCL=.017)
    }
    
      #Try 2
    DoMaru <- function(name)
    {
      CSPMarubozu(name, n=20, ATRFactor=.8, maxuppershadowCL=.017, maxlowershadowCL=.017)
    }
    
    apply_Marubozu <- lapply(stocks_list, DoMaru(stocks_list$name))

【问题讨论】:

    标签: r stock candlesticks


    【解决方案1】:

    这会下载股票,然后显示处理每种股票的三种不同等效方式。我们使用 dim(...) 但这将被任何所需的处理所取代。请注意,如果 x 是具有 OHLC 以及调整后收盘价和交易量的股票的 xts 对象,则 Op(x)、Hi(x)、Lo(x)、Cl(x)、Ad(x) 和 Vo(x)是 Open、High、Low、Close、Adjusted Close 和 Volume 的向量。

    虽然下面的代码看起来更可取 getSymbols(stocks); L &lt;- mget(stocks) 也可以将股票松散地放入您的工作区,然后将它们收集到列表 L 中。

    library(quantmod)
    stocks <- c("AAPL", "MSFT", "GOOG")
    getSymbols(stocks, env = e <- new.env())
    
    # 1. iterate over components of e
    out1 <- eapply(e, function(x) { dim(x) })
    
    L <- as.list(e)
    
    # 2. iterate over names
    out2 <- Map(function(nm) { x <- L[[nm]]; dim(x) }, names(L))
    out2a <- Map(function(nm) { x <- e[[nm]]; dim(x) }, ls(e))
    
    # 3. iterate over components of list L
    out3 <- Map(function(x) { dim(x) }, L)
    
    str(out1)
    ## List of 3
    ##  $ AAPL: int [1:2] 3764 6
    ##  $ GOOG: int [1:2] 3764 6
    ##  $ MSFT: int [1:2] 3764 6
    
    identical(out1, out2)
    ## [1] TRUE
    
    identical(out1, out2a)
    ## [1] TRUE
    
    identical(out1, out3)
    ## [1] TRUE
    

    【讨论】:

    • 太酷了!我一直在尝试解决它 3 天,终于有道理了!非常感谢:)
    猜你喜欢
    • 2021-06-06
    • 2020-11-16
    • 2012-12-02
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 2014-09-01
    相关资源
    最近更新 更多