使用quantmod的getSymbols在for循环中无法获取ETF数据并计算收益率
解决quantmod getSymbols遍历ETF获取数据及收益率的问题
问题原因
getSymbols() 默认会把行情数据加载到全局环境,返回值只是ETF的代码字符串,而非实际的行情数据——这就是你打印etf得到"SPY"的原因。因为etf是字符串(原子向量),自然无法用$访问.Adjusted列,所以触发报错。
解决方案:两种可行写法
方法1:用auto.assign=FALSE直接获取数据
设置该参数后,getSymbols()会直接返回行情数据(xts对象),无需依赖全局环境,是更简洁的批量处理方式:
library(quantmod) top25_ETFS <- c("SPY", "IVV", "VOO", "VTI", "QQQ", "VEA", "VUG","VTV", "IEFA","BND","AGG","IWF","IJH","IJR","VIG","IEMG", "VWO","VXUS","VGT","IWM","XLK","VO","GLD","VB","SCHD") # 创建列表存储所有ETF的收益率,方便后续调用 etf_returns_list <- list() for (etf_code in top25_ETFS) { # 直接获取数据到变量中 etf_data <- getSymbols(etf_code, src = "yahoo", auto.assign = FALSE) # 计算离散收益率,Ad()取调整后收盘价,对应原代码的.Adjusted列 etf_returns <- ROC(Ad(etf_data), type = 'discrete') # 将收益率存入列表,用ETF代码作为键名 etf_returns_list[[etf_code]] <- etf_returns } # 示例:查看SPY的前5条收益率数据 head(etf_returns_list[["SPY"]])
方法2:用get()调用全局环境中的数据
如果不想修改auto.assign默认值,可以用get()从全局环境中取出已加载的数据:
library(quantmod) top25_ETFS <- c("SPY", "IVV", "VOO", "VTI", "QQQ", "VEA", "VUG","VTV", "IEFA","BND","AGG","IWF","IJH","IJR","VIG","IEMG", "VWO","VXUS","VGT","IWM","XLK","VO","GLD","VB","SCHD") etf_returns_list <- list() for (etf_code in top25_ETFS) { # 按默认规则加载数据到全局环境 getSymbols(etf_code, src = "yahoo") # 取出对应的数据对象 etf_data <- get(etf_code) # 计算收益率 etf_returns <- ROC(Ad(etf_data), type = 'discrete') etf_returns_list[[etf_code]] <- etf_returns }
注意:这种方法会在全局环境中留下25个独立的ETF数据对象,若不需要保留原始数据,方法1更干净。
内容的提问来源于stack exchange,提问作者goldfishgamerhd
相关产品推荐
相关产品推荐

