【问题标题】:Joining stock data together in a loop via quantmod通过 quantmod 将股票数据循环连接在一起
【发布时间】:2020-04-23 18:29:06
【问题描述】:

我一直在尝试将我从 R 中的 quantmod 包中收集的股票数据绑定在一起,但该包以 XTS 格式返回数据,这有点难以转换为数据框架并将它们全部绑定到一个大数据框架中。

到目前为止,我已经做到了。我了解逻辑,我了解我必须做什么,我需要创建一个包含所有所需列的空数据框,然后将个别股票放入数据框中,但使用 XTS 格式很难。

我还计划将所有 S&P 500 股票绑定在一起,这就是为什么我需要循环而不是手动执行其他方式的原因。

library(quantmod)

start <- as.Date("2000-01-01")
end <- as.Date("2020-04-15")
symbolBasket <- c('MMM', 'AXP', 'AAPL', 'BA', 'CAT', 'MSFT', 'IBM') 

empty_df <- data.frame(Open= numeric(), 
                       High = numeric(), 
                       Low = numeric(), 
                       Close = numeric(), 
                       Volume = numeric(), 
                       Adjusted = numeric(),
                       Ticker = character())

for (i in symbolBasket) {
  xts <- as.data.frame(getSymbols(i, src = "yahoo", from = start, to = end))

  df <- as.data.frame(xts)
  ticker <- i
  df_with_ticker <- cbind(df,ticker)
  df_final <- rbind(empty_df,df)
}

【问题讨论】:

    标签: r loops quantmod


    【解决方案1】:

    一种方法是使用带有env = 参数的内置函数getSymbols

    我们可以使用简单的for 循环从环境中将数据提取为data.frame,并从行名中获取日期。来自data.tablerbindlist 可以轻松地将最终结果绑定在一起。

    library(quantmod)
    library(data.table)
    stockEnv <- new.env()
    getSymbols(symbolBasket, src='yahoo', env=stockEnv, from = start, to = end)
    datalist <- list()
    for(stock in ls(stockEnv)){
      table <- as.data.frame(stockEnv[[stock]])
      date = rownames(table)
      rownames(table) <- NULL
      colnames(table) <- c("Open","High","Low","Close","Volume","Adjusted")
      bound.table <- data.frame(Ticker = stock, date ,table)
      datalist[[stock]] <-  bound.table
    }
    Result <- rbindlist(datalist,fill=TRUE) 
    Result
    #       Ticker       date       Open       High        Low      Close    Volume   Adjusted
    #    1:   AAPL 2000-01-03   3.745536   4.017857   3.631696   3.997768 133949200   3.470226
    #    2:   AAPL 2000-01-04   3.866071   3.950893   3.613839   3.660714 128094400   3.177650
    #    3:   AAPL 2000-01-05   3.705357   3.948661   3.678571   3.714286 194580400   3.224152
    #    4:   AAPL 2000-01-06   3.790179   3.821429   3.392857   3.392857 191993200   2.945139
    #    5:   AAPL 2000-01-07   3.446429   3.607143   3.410714   3.553571 115183600   3.084645
    #   ---                                                                                   
    #35710:   MSFT 2020-04-07 169.589996 170.000000 163.259995 163.490005  62769000 163.490005
    #35711:   MSFT 2020-04-08 165.669998 166.669998 163.500000 165.130005  48318200 165.130005
    #35712:   MSFT 2020-04-09 166.360001 167.369995 163.330002 165.139999  51431800 165.139999
    #35713:   MSFT 2020-04-13 164.350006 165.570007 162.300003 165.509995  41905300 165.509995
    #35714:   MSFT 2020-04-14 169.000000 173.750000 168.000000 173.699997  52874300 173.699997
    

    【讨论】:

      【解决方案2】:

      不需要循环,你可以使用 tidyquant 来获取所有的股票。这将返回一个包含所有数据的 data.frame。

      library(tidyquant)
      
      start <- as.Date("2000-01-01")
      end <- as.Date("2020-04-15")
      symbolBasket <- c('MMM', 'AXP', 'AAPL', 'BA', 'CAT', 'MSFT', 'IBM') 
      
      result <- tq_get(symbolBasket, from = start, end = end)
      result
      # A tibble: 35,763 x 8
         symbol date        open  high   low close  volume adjusted
         <chr>  <date>     <dbl> <dbl> <dbl> <dbl>   <dbl>    <dbl>
       1 MMM    2000-01-03  48.0  48.2  47.0  47.2 2173400     26.3
       2 MMM    2000-01-04  46.4  47.4  45.3  45.3 2713800     25.3
       3 MMM    2000-01-05  45.6  48.1  45.6  46.6 3699400     26.0
       4 MMM    2000-01-06  47.2  51.2  47.2  50.4 5975800     28.1
       5 MMM    2000-01-07  50.6  51.9  50.0  51.4 4101200     28.7
       6 MMM    2000-01-10  50.2  51.8  50    51.1 3863800     28.5
       7 MMM    2000-01-11  50.4  51.2  50.2  50.2 2357600     28.1
       8 MMM    2000-01-12  51.0  51.8  50.4  50.4 2868400     28.1
       9 MMM    2000-01-13  50.7  50.9  50.2  50.4 2244400     28.1
      10 MMM    2000-01-14  50.4  50.5  49.5  49.7 2541800     27.7
      # ... with 35,753 more rows
      

      如果您想对整个 SP500 执行此操作,您可能需要查看 BatchGetSymbols。如果您将do.parallel 选项设置为TRUE,这可以并行运行。 vignette 向您展示了如何获得 SP500 的所有股票。

      【讨论】:

      • 哇,我到处寻找更有趣的股市数据包,但没有找到 tidyquant 或 BatchGetSymbols。这实际上解决了我的问题,就像 Ian Campbell 的解决方案一样。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      相关资源
      最近更新 更多