问题描述
我试图在很长一段时间内获取多个股票代码的股票价格,并将它们收集在一个数据框中。
这是我的代码
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)
我有两个问题,
-
错误信息
-
每月价格差异太大
我该如何解决这个问题?
或者有没有更好更简洁的代码来获取多个股票的时间序列月度数据(调整后的价格)?
解决方法
关于缺失值的警告:
如果你看一下其中一个股票代码,
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,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
尽管如此,与此 chart 的比较清楚地表明,您在 2021-02-01 之前为 TLT 附加的值是错误的。