使用R计算Yahoo标普500简单收益率全为0的问题求助
问题分析
你遇到的问题根源在于quantmod获取的GSPC是xts/zoo时间序列对象,直接通过行号子集后做算术运算时,会基于时间索引自动对齐。adj[2:n,1]和adj[1:(n-1),1]的时间索引完全不重叠,导致运算逻辑失效,最终得到全0的错误结果。
解决方案
有两种简单可靠的修复方式:
方式1:提取核心数值计算
用coredata()提取xts对象的底层数值矩阵,脱离时间索引进行行号运算:
library(quantmod) getSymbols("^gspc", src='yahoo') adj <- GSPC[, "GSPC.Adjusted", drop = FALSE] n <- nrow(adj) # 提取底层数值矩阵 adj_values <- coredata(adj) # 手动计算简单收益率 simpleReturn <- (adj_values[2:n, 1] - adj_values[1:(n-1), 1]) / adj_values[1:(n-1), 1] # 可选:将结果转回带时间索引的xts对象 simpleReturn_xts <- xts(simpleReturn, index(adj)[2:n])
方式2:使用quantmod自带的收益率函数
quantmod内置了dailyReturn()函数,可直接计算简单收益率,无需手动处理索引:
library(quantmod) getSymbols("^gspc", src='yahoo') # 计算调整收盘价的简单日收益率(arithmetic对应简单收益率) simpleReturn <- dailyReturn(GSPC$GSPC.Adjusted, type = "arithmetic")
若需要对数收益率,只需将type参数改为"log"即可。
内容的提问来源于stack exchange,提问作者Bintvelt
相关产品推荐
相关产品推荐

