使用TTR包中ATR()函数时遇下标越界错误的排查求助
问题分析与解决
核心问题
调用ATR()函数的方式错误:该函数需要传入包含High、Low、Close列的数据集对象,而非列名字符串向量c("High", "Low", "Close")。错误的输入导致函数无法识别行情数据结构,触发下标越界错误。
正确实现方式
方法1:直接传入数据框(推荐)
ATR()可直接接收包含目标列的数据框,无需单独指定列名,注意提取返回结果中的atr列:
delta <- raw.Delta %>% mutate(dATR = ATR(., n=50, maType="SMA")$atr)
方法2:显式构造HLC对象
用quantmod包的HLC()函数构造标准行情对象,再传入ATR():
delta <- raw.Delta %>% mutate(dATR = ATR(HLC(.), n=50, maType="SMA")$atr)
报错原因解析
当传入c("High", "Low", "Close")字符向量时,函数会将其当作行情数据处理,但该向量长度远小于计算窗口n=50,且不具备ATR计算所需的高低收数据结构,最终触发HLC[-NROW(HLC), 3]下标越界——因字符向量行数不足,取反后下标超出有效范围。
补充提示
- 当前数据仅6行,设置
n=50会导致所有结果为NA(无足够历史数据计算50期ATR),可先改用n=2等小窗口验证代码正确性。 SMA()能运行是因为它支持直接接收数据框并对全列计算,但ATR()对输入结构有严格要求,必须是包含高低收字段的行情数据对象。
内容的提问来源于stack exchange,提问作者lunardiplomacy
相关产品推荐
相关产品推荐

