有没有更好的方法可以用 R 的 'quantmod' 检索准确的每周和每月股价数据?

Is there a better way to retrieve accurate Weekly and Monthly stock price data with R's 'quantmod'?

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

我发现最接近检索正确 weekly/monthly 数据的方法是将 'getsymbols' 函数与 'quantmod' 结合使用,但目前仅限于搜索一个代码。有谁能帮我修改这个脚本来搜索和检索多个代码的每周 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)
}

如有任何帮助,我们将不胜感激。

一个快速的方法是使用 tidyquant。 getSymbols中有周和月选项,使用tq_get时调用。不要注意小标题被打印到屏幕上的方式,只需检查 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 也计算每日 returns。最后,我重命名了列以正确命名它们。所有 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 版本的更新可以正确显示每周数据(请注意,日期将是一周的第一天(星期一))。您可以安装 github 版本的 wait until the update is available on cran.

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