【问题标题】:Collecting stock info using a loop and Quantmod in R在 R 中使用循环和 Quantmod 收集股票信息
【发布时间】:2021-09-06 03:43:19
【问题描述】:

我想使用循环收集有关几只股票的信息,并将所需的所有信息保存到单个数据框中。我需要使用循环,因为我使用的方法(见下文)效率不高。它只检索选定股票的信息并跳过一些。以下是我尝试过的:


library(quantmod)
library(TTR) 

stocks <-c("MRO", "TSLA", "HAL", "XOM", "DIN", "DRI", "DENN","WEN", "SPCE", "DE", "DRI", "KSS", "AAL","DFS", "LYV","SPXL")


    dataEnv <- new.env()
    getSymbols(stocks, from = "2014-02-01",to= "2016-01-01", env=dataEnv)
    plist <- eapply(dataEnv,Ad)
    pframe <- do.call(merge, plist)
    pframe1 <- as.data.frame(apply(pframe[,1:ncol(pframe)],2,function(x) diff(x)*100/head(x,-1)))
    

【问题讨论】:

    标签: r loops stock quantmod


    【解决方案1】:

    您可以使用 tidyquant 或 BatchGetSymbols 包。在处理来自 yahoo 的数据时,我个人的偏好是后者。

    使用 tidyquant:

    library(tidyquant)
    
    stocks <-c("MRO", "TSLA", "HAL", "XOM", "DIN", "DRI", "DENN","WEN", "SPCE", "DE", "DRI", "KSS", "AAL","DFS", "LYV","SPXL")
    
    tq_stocks <- tq_get(stocks, from = "2014-02-01",to= "2016-01-01")
    tq_stocks
    # A tibble: 7,245 x 8
       symbol date        open  high   low close   volume adjusted
       <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
     1 MRO    2014-02-03  32.8  32.8  32.0  32.1  8983000     28.1
     2 MRO    2014-02-04  32.2  32.4  31.9  32.3 10932900     28.4
     3 MRO    2014-02-05  32.3  32.4  31.6  32.1  6534500     28.1
     4 MRO    2014-02-06  31.7  33.0  31.6  31.8  9408400     27.9
     5 MRO    2014-02-07  31.9  32.8  31.7  32.6  8184400     28.6
     6 MRO    2014-02-10  32.5  32.5  32.0  32.3  5862600     28.3
     7 MRO    2014-02-11  32.3  32.9  32.3  32.7  6140400     28.7
     8 MRO    2014-02-12  33.0  33.3  32.8  33.3  5202500     29.2
     9 MRO    2014-02-13  33.0  33.4  32.7  33.3  6755900     29.2
    10 MRO    2014-02-14  33.0  33.4  32.9  33.2  6096300     29.3
    

    tidyquant 会给出一些警告。这些你可以忽略,已经打开了一张票来解决这些问题。

    使用 BatchGetSymbols:

    library(BatchGetSymbols)
    batch_stocks <- BatchGetSymbols(stocks, first.date = "2014-02-01", last.date = "2016-01-01")
    
    str(batch_stocks)
    List of 2
     $ df.control: tibble [15 x 6] (S3: tbl_df/tbl/data.frame)
      ..$ ticker              : chr [1:15] "MRO" "TSLA" "HAL" "XOM" ...
      ..$ src                 : chr [1:15] "yahoo" "yahoo" "yahoo" "yahoo" ...
      ..$ download.status     : chr [1:15] "OK" "OK" "OK" "OK" ...
      ..$ total.obs           : int [1:15] 483 483 483 483 483 483 483 483 483 483 ...
      ..$ perc.benchmark.dates: num [1:15] 1 1 1 1 1 1 1 1 1 1 ...
      ..$ threshold.decision  : chr [1:15] "KEEP" "KEEP" "KEEP" "KEEP" ...
     $ df.tickers:'data.frame': 6762 obs. of  10 variables:
      ..$ price.open         : num [1:6762] 32.8 32.2 32.3 31.7 31.9 ...
      ..$ price.high         : num [1:6762] 32.8 32.4 32.4 33 32.8 ...
      ..$ price.low          : num [1:6762] 32 31.9 31.6 31.6 31.7 ...
      ..$ price.close        : num [1:6762] 32.1 32.3 32.1 31.8 32.6 ...
      ..$ volume             : num [1:6762] 8983000 10932900 6534500 9408400 8184400 ...
      ..$ price.adjusted     : num [1:6762] 28.1 28.4 28.1 27.9 28.6 ...
      ..$ ref.date           : Date[1:6762], format: "2014-02-03" "2014-02-04" "2014-02-05" "2014-02-06" ...
      ..$ ticker             : chr [1:6762] "MRO" "MRO" "MRO" "MRO" ...
      ..$ ret.adjusted.prices: num [1:6762] NA 0.00873 -0.00742 -0.00903 0.02483 ...
      ..$ ret.closing.prices : num [1:6762] NA 0.00873 -0.00742 -0.00903 0.02483 ...
    

    batch_stocks 将是 2 个 data.frames 的列表。第一个是控制数据框,显示是否所有代码都已正确下载。第二个 data.frame 包含所有代码数据。 BatchGetSymbols 的一个优点是,如果您将它与未来的包结合使用,它可以并行运行。此外,如果您已经在本地拥有数据,则不会再次下载数据。所以连续运行3次,它只会下载一次数据,其余的从临时存储的数据中获取。

    【讨论】:

    • "tydyquant" 完美运行。您知道如何将“BatchGetSymbols”的结果放入简单的数据框中吗?我不确定如何正确处理列表。谢谢
    • @user3670179,要么像这样访问 data.frame:batch_stocks$df.tickers,要么像这样重新分配 data.frame:new_data &lt;- batch_stocks$df.tickers。但请注意,这可能会对记忆产生影响。
    猜你喜欢
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多