getSymbols获取USHAMART.NS等标的返回数据存在误差问题咨询
getSymbols拉取USHAMART.NS周频数据失真问题排查及解决方案
问题根因定位
getSymbols默认从雅虎财经数据源拉取行情,印度市场中小盘个股的原始日线数据经常存在录入错误,本次异常是对应时间段内某一日的最高价被错误录入为3515,周频数据聚合时默认取区间内最高值,最终导致周线高价失真,并非quantmod包的逻辑错误。- 可通过拉取同标的日频数据验证:
# 拉取日频数据核对2021年2-3月原始行情 d_daily <- as.data.frame( getSymbols( "USHAMART.NS", from ="2021-02-01", to = "2021-03-31", periodicity = "daily", return.class = 'zoo', env = NULL ) )
查看上述数据的最高价列,可直接定位到错误数据所在的具体交易日。
问题修复方案
- 单标的快速修复:对异常值做清洗,可采用相邻3周价格中位数替换,或者设置合理的价格阈值过滤,参考代码如下:
# 计算价格阈值,取前后10周价格的均值±3倍标准差作为合理区间 price_mean <- rollapply(d$USHAMART.NS.High, width = 10, FUN = mean, fill = NA, align = "center") price_sd <- rollapply(d$USHAMART.NS.High, width = 10, FUN = sd, fill = NA, align = "center") upper_limit <- price_mean + 3*price_sd # 超过上限的替换为前一周最高价 d$USHAMART.NS.High <- ifelse(d$USHAMART.NS.High > upper_limit, lag(d$USHAMART.NS.High), d$USHAMART.NS.High)
- 从数据源层面规避:更换
getSymbols的数据源参数src,改用覆盖印度市场更稳定的行情源,避免脏数据问题。 - 多标的批量排查:对标的池所有标的计算相邻两周最高价涨跌幅,设置合理阈值(如周涨幅超过200%)做异常标记,可批量识别同类数据问题。
内容的提问来源于stack exchange,提问作者Stupid_Intern
相关产品推荐
相关产品推荐

