R语言股票收益率正态性检验Shapiro.test报错求助
报错原因
- 核心触发点:
shapiro.test()仅支持输入纯数值向量,你传入的DNBreturn是dailyReturn()生成的xts时间序列对象,自带时间索引等特殊属性,函数无法解析该类对象就会抛出对应报错。 - 隐性问题:你调用
dailyReturn()时给leading参数传入了字符串"FALSE",实际该参数要求接收逻辑值FALSE,参数类型不匹配也可能导致返回值生成异常空值,进一步加重函数解析问题。 - 额外不规范写法:
getSymbols()默认开启auto.assign = TRUE,会直接将获取到的行情数据写入全局环境变量,你赋值给DNB的实际是字符串"DNB.OL"而非行情数据集,只是因为全局环境已经自动生成了DNB.OL变量才没有提前报错。
解决方法
你可以任选以下一种方式修改代码即可正常运行检验:
- 调用检验函数时直接转换格式,手动剔除空值:
# 把xts对象转为纯数值向量,去掉空值后传入检验函数 shapiro.test(as.numeric(na.omit(DNBreturn)))
- 生成收益率时就转成纯数值向量,后续所有调用都不用额外处理:
# 修正leading参数的类型,同时转成数值向量 DNBreturn <- as.numeric(dailyReturn(DNBclose, type = "log", leading = FALSE)) # 后续直接调用即可 shapiro.test(DNBreturn)
- (推荐)同时修正
getSymbols的不规范写法,避免依赖全局环境自动赋值:
library(quantmod) # 加auto.assign = FALSE,直接把数据集赋值给DNB变量 DNB = getSymbols("DNB.OL", src = 'yahoo', from = "2020-01-01", to = "2020-12-31", auto.assign = FALSE) DNBclose <- DNB$DNB.OL.Close # 修正参数类型+转数值向量 DNBreturn <- as.numeric(dailyReturn(DNBclose, type = "log", leading = FALSE)) std <- sqrt(var(DNBreturn, na.rm = TRUE)) DNBmean <- mean(DNBreturn, na.rm = TRUE) DNBhist <- hist(DNBreturn, density=20, breaks=20, prob=TRUE, xlab="x-variable", ylim=c(0, 35), main="normal curve over histogram") curve(dnorm(x, mean=DNBmean, sd=std), col="darkblue", lwd=2, add=TRUE, yaxt="n") # 直接运行检验 shapiro.test(DNBreturn)
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

