【问题标题】:How to merge stock prices?如何合并股票价格?
【发布时间】:2020-08-09 18:17:40
【问题描述】:

我下载了 50 只股票及其价格。我想将所有这 50 只股票合并为一个样本。我怎样才能做到这一点?我目前的代码是(3只股票):

library("PerformanceAnalytics")
library("tseries")
library("zoo")
library("quantmod")
#
getSymbols("AAPL")
getSymbols("ABBV")
getSymbols("ABT")
... etcetera
#
price_AAPL <- AAPL$AAPL.Close
price_ABBV <- ABBV$ABBV.Close
price_ABT <- ABT$ABT.Close
... etcetera
###

因此,我想合并那些“price_xxx”。我怎样才能做到这一点 ? Here is what price_AAPL looks like

非常感谢!

【问题讨论】:

    标签: r matrix merge finance


    【解决方案1】:

    您可以将Reducemerge 一起使用:

    out <- Reduce(merge, mget(ls(pattern = "price_")))
    out
    
    #           AAPL.Close ABBV.Close ABT.Close
    #2007-01-03   11.97143         NA  23.49581
    #2007-01-04   12.23714         NA  23.94202
    #2007-01-05   12.15000         NA  23.94202
    #2007-01-08   12.21000         NA  24.02838
    #2007-01-09   13.22429         NA  24.23950
    #2007-01-10   13.85714         NA  24.17712
    #...
    #...
    

    【讨论】:

      【解决方案2】:

      这是一个 Base R 解决方案,可自动下载一组符号、合并和重命名接近 price_symbol

      library("PerformanceAnalytics")
      library("tseries")
      library("zoo")
      library("quantmod")
      #
      symbolList <- c("AAPL","ABBV","ABT","IBM","MSFT","GOOG")
      prices <- lapply(symbolList,function(x){
           getSymbols(x,auto.assign = FALSE)[,4]
      })
      priceData <- do.call(merge,prices)
      names(priceData) <- paste0("price_",symbolList)
      head(priceData)
      

      ...和输出:

      > head(priceData)
                 price_AAPL price_ABBV price_ABT price_IBM price_MSFT price_GOOG
      2007-01-03   11.97143         NA  23.49581     97.27      29.86   232.9220
      2007-01-04   12.23714         NA  23.94202     98.31      29.81   240.7277
      2007-01-05   12.15000         NA  23.94202     97.42      29.64   242.6853
      2007-01-08   12.21000         NA  24.02838     98.90      29.93   240.8871
      2007-01-09   13.22429         NA  24.23950    100.07      29.96   241.8435
      2007-01-10   13.85714         NA  24.17712     98.89      29.66   243.8161
      >
      

      【讨论】:

        【解决方案3】:

        1) 将引号下载到环境 stockEnv 然后 eapply 使用 Cl 提取关闭并使用 merge 将结果合并在一起给出 xts 对象stockCl 。注意与basemerge不同的是,这里支持多路合并。

        (此外,可以使用例如stockEnv$AAPL 访问特定股票的完整代码数据。如果您想要调整后的收盘价,请使用Ad 代替Cl。)

        library(quantmod)
        
        symbolList <- c("AAPL","ABBV","ABT","IBM","MSFT","GOOG")
        getSymbols(symbolList, env = stockEnv <- new.env())
        stockCl <- do.call("merge", eapply(stockEnv, Cl))
        

        2) 或者将符号直接下载到工作区,将Cl 应用于每个和merge

        library(quantmod)
        
        symbolList <- c("AAPL","ABBV","ABT","IBM","MSFT","GOOG")
        getSymbols(symbolList)
        stockCl <- do.call("merge", lapply(mget(symbolList), Cl))
        

        【讨论】:

          【解决方案4】:

          默认情况下,getSymbols 返回的数据返回默认环境。但是,使用auto.assign = FALSE,结果将显式返回为xts 时间序列。使用这种方法,一个可能的解决方案是:

          library(quantmod)
          tickers <- c("AAPL", "ABBV", "ABT")
          prices <- xts()
          for( ticker in tickers) prices <- merge(prices, getSymbols(ticker, auto.assign = FALSE)[,4])
          

          使用 Reduce 而不是 for 循环的变体:

          library(quantmod)
          tickers <- c("AAPL", "ABBV", "ABT")
          prices <- Reduce(f = function(x,y) { xx = getSymbols(y, auto.assign = FALSE)[,4]; merge(x, xx) },
            x = tickers, init = xts())
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多