首页 > 解决方案 > 使用 quantmod 使用 R 下载多个股票月度价格

问题描述

我试图在很长一段时间内获取多个股票代码的股票价格,并将它们收集在一个数据框中。

这是我的代码

library('quantmod')

symbol1 = c('SPY', # S$P500
            'IEF', # 10Y treasury bond
            'TLT', # 20Y treasury bond
            'AGG', # Core U.S Aggregate Bond
            'SHY', # Cash
            'GLD', # Gold 
            'IWN') # Russell 2000 value


price = function(symbols){
  loadSymbols(symbols, src = 'yahoo', from= '2000-11-01', periodicity = 'monthly')
  prices = list()
  for (i in 1:length(symbols)) {
    prices[[i]] = Ad(get(symbols[i])[,6])
  }
  prices = do.call(cbind, prices)
  colnames(prices) = gsub('\\.[A-z]*', '',colnames(prices))
  prices = na.omit(prices)
  return(prices)
}
  
a = price(symbol1)

我有两个问题,

  1. 错误信息 在此处输入图像描述

  2. 每月价格之间差异很大

在此处输入图像描述

我该如何解决这个问题?

还是有更好更简洁的代码来获取多个代码的时间序列月度数据(调整后的价格)?

标签: rquantmod

解决方案


关于缺失值的警告:

如果你看一下其中一个代码,

loadSymbols('SPY', src = 'yahoo', from= '2000-11-01', periodicity = 'monthly')

> SPY[is.na(SPY$SPY.Open),]
           SPY.Open SPY.High SPY.Low SPY.Close SPY.Volume SPY.Adjusted
2021-02-01       NA       NA      NA        NA         NA           NA

您会注意到 Yahoo API 已返回 2021-02-01 月份的缺失值。这是有道理的,因为您已请求每月平均值,而您无法计算当前月份的平均值。

您可能希望过滤数据以排除当前月份。例如,这运行没有错误:

loadSymbols(symbols, src = 'yahoo', from= '2000-11-01',to='2021-01-31', periodicity = 'monthly')

关于您的第二个问题,我无法复制:

a = price(symbol1)
a %>% tail(10)

                SPY      IEF      TLT      AGG      SHY    GLD       IWN
2020-04-01 286.8316 120.6718 164.8157 115.0776 86.24834 158.80  90.90018
2020-05-01 300.4978 121.0832 161.9357 115.8682 86.21467 162.91  93.73619
2020-06-01 304.4870 121.1411 162.4827 116.6548 86.23647 167.37  95.97152
2020-07-01 323.8377 122.1878 169.7082 118.2020 86.32609 185.43  98.42319
2020-08-01 346.4406 121.0134 161.1535 117.2467 86.31715 184.83 103.70540
2020-09-01 332.1390 121.4210 162.3971 117.1425 86.31710 177.12  98.25503
2020-10-01 325.1540 119.7535 156.9142 116.4811 86.28612 176.20 102.47127
2020-11-01 360.5232 120.1606 159.5191 117.8953 86.30606 166.67 122.00240
2020-12-01 372.2931 119.7973 157.4051 117.8594 86.31503 178.36 131.08641
2021-01-01 370.0700 118.6400 152.0000 117.3100 86.40000 172.61 138.39999

尽管如此,与此图表的比较清楚地表明,您在 2021-02-01 之前为 TLT 附加的值是错误的。


推荐阅读