【问题标题】:Is there a better way to retrieve accurate Weekly and Monthly stock price data with R's 'quantmod'?有没有更好的方法来使用 R 的“quantmod”检索准确的每周和每月股票价格数据?
【发布时间】:2021-02-27 13:34:19
【问题描述】:

我曾尝试使用 BatchGetSymbols 检索多个股票代码的价格数据,以获取每周和每月价格数据 (ohlc),但每周和每月函数无法返回正确数据。当使用 'batchgetsymbols' 'freq.data = "weekly' 参数时,每周价格从周三开始,这对于每周价格数据是不正确的。每周 ohlc 数据应该在每周结束时(周一至周五)。

我发现检索正确的每周/每月数据最接近的方法是使用带有“quantmod”的“getsymbols”功能,但目前仅限于搜索一个单独的代码。有谁能帮我改变这个脚本来搜索和检索多个股票的每周 ohlc 数据?例如:

> library(quantmod)
stock_list <- c("FB", "AAPL", "GOOG","BA","DAL","TSLA")
start_date <- Sys.Date()-14
end_date <- Sys.Date()
master_df <- NULL
for (idx in seq(length(stock_list))){
  idx = 1
  stock_index = stock_list[idx]
  getSymbols(stock_index, verbose = TRUE, src = "yahoo", 
             from=start_date,to=end_date)
  temp_df = as.data.frame(to.weekly(get(stock_index))) # weekly data
  temp_df$Date = row.names(temp_df)
  temp_df$Index = stock_index
  row.names(temp_df) = NULL
  colnames(temp_df) = c("Open", "High", "Low", "Close", 
                        "Volume", "Adjusted", "Date", "Index")
  temp_df = temp_df[c("Date", "Index", "Open", "High", 
                      "Low", "Close", "Volume", "Adjusted")]
  master_df = rbind(master_df, temp_df)
}

任何帮助将不胜感激。

【问题讨论】:

    标签: r quantmod yahoo-finance


    【解决方案1】:

    一种快速的方法是使用 tidyquant。 getSymbols 中有每周和每月选项,在使用tq_get 时会调用。不要关注 tibble 打印到屏幕上的方式,只需在 RStudio 查看器中查看数据即可。

    library(tidyquant)
    library(dplyr)
    
    stock_list <- c("FB", "AAPL", "GOOG","BA","DAL","TSLA")
    start_date <- Sys.Date()-14
    end_date <- Sys.Date()
    
    stocks_weekly <- tq_get(stock_list, from = start_date, to = end_date, periodicity = "weekly")
    
    stocks_weekly 
    
    # A tibble: 12 x 8
       symbol date         open   high    low  close    volume adjusted
       <chr>  <date>      <dbl>  <dbl>  <dbl>  <dbl>     <dbl>    <dbl>
     1 FB     2020-11-02  265.   297.   257.   293.  118206600    293. 
     2 FB     2020-11-09  290.   293.   264    277.   92433100    277. 
     3 AAPL   2020-11-02  109.   120.   107.   119.  609571800    118. 
     4 AAPL   2020-11-09  120.   122.   114.   119.  589577900    119. 
     5 GOOG   2020-11-02 1628.  1794.  1616.  1762.   11494700   1762. 
     6 GOOG   2020-11-09 1791.  1818.  1717.  1777.    8915800   1777. 
     7 BA     2020-11-02  146.   158.   143.   158.   58773000    158. 
     8 BA     2020-11-09  179    194.   172.   187.  165339400    187. 
     9 DAL    2020-11-02   30.6   32.3   29.7   31.4  65773500     31.4
    10 DAL    2020-11-09   37.4   38.7   34.0   36.5 150014900     36.5
    11 TSLA   2020-11-02  394    440    392.   430.  145636400    430. 
    12 TSLA   2020-11-09  440.   452.   396.   408.  122101100    408. 
    

    如果您想更好地查看数据,请使用print(as.data.frame(stocks_weekly))

    更新:

    获取正确的每周/每月数据的所有功能都存在一些问题。我正在创建(或添加信息)github问题。

    下面是可以处理大量代码而不遇到下载错误的代码。

    mutate 函数使用 time_tk 和 xts 中的函数来正确获取所有内容。我只使用需要的列,因为BatchGetSymbols 也计算每日回报。最后,我重命名列以正确命名它们。所有 time_tk 函数都可以只替换为 base 和 xts 函数,但这为我节省了一些时间。

    library(BatchGetSymbols)
    library(timetk)
    library(xts)
    library(dplyr)
    library(tidyr)
    library(purrr)
    
    stocks <- BatchGetSymbols(stock_list, 
                              first.date = start_date, 
                              last.date = end_date, 
                              freq.data = "daily")
    
    stocks_weekly <- stocks$df.tickers %>% 
      group_by(ticker) %>% 
      nest() %>% 
      mutate(data = map(data, function(x) {x = tk_xts(x, 
                                                      select = c(price.open, price.high, price.low, price.close, volume, price.adjusted), 
                                                      date_var =  ref.date)
                                            tk_tbl(to.period(x, period = "weeks"))
                                              })
             ) %>% 
      unnest(cols = c(data)) %>% 
      rename_with( ~ tolower(gsub("x.", "", .x)),  starts_with("x."))
    

    更新 2

    BatchGetSymbols 的 github 版本的更新可以正确显示每周数据(请注意,日期将是一周的第一天(星期一))。可以在cran上安装等待更新可用的github版本。

    stocks_week <- BatchGetSymbols(stock_list, 
                               first.date = start_date, 
                               last.date = end_date, 
                               freq.data = "weekly", 
                               how.to.aggregate = 'last')
    

    【讨论】:

    • 感谢您的帮助。这确实回答了我上面的问题,尽管我在输入超过 10 只股票时无法执行此脚本。有没有办法用 1000 个代码运行此脚本而不会收到错误?
    • @Ronhamilton,请参阅答案中的更新。您可能会遇到雅虎下载问题。 BatchGetSymbols 有一些内部选项可以避免这种情况。
    • 非常感谢@phiver,这很棒。看到我正在与非常了解 batchgetsymbols 的人交谈,是否可以检索季度月度价格数据? 3 个月或季度 OHLC 数据将是另一个很棒的功能。如果您希望我提出一个新问题,我会这样做。
    猜你喜欢
    • 2014-12-27
    • 2013-04-18
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多