求助:TTR包编写ATR/DonchianChannel指标函数返回NA问题
问题解决:TTR包中DonchianChannel和ATR返回NA的修复
核心问题分析
你遇到的NA问题完全是因为输入参数格式不符合TTR函数要求:
DonchianChannel需要包含High和Low两列的时间序列对象(xts/矩阵),而非用c()拼接的单向量(这会导致时间序列错位、长度翻倍)。ATR需要包含High、Low、Close三列的对象(即HLC格式),而非单变量或错误的列组合。
修复后的DonchianChannel函数
# Create DonchianChannel function n = 10 dc <- function(x, return_format = "tibble", n = n) { # Convert tibble to xts if (!is.xts(x)) { x <- xts(x[,-1], order.by = x$Date) } # 关键修复:传入包含High和Low的两列xts对象 dc_xts <- DonchianChannel(HL = x[, c("High", "Low")], n = n) # DonchianChannel返回3列:high、low、mid,合理重命名 names(dc_xts) <- c("DC_High", "DC_Low", "DC_Mid") # 格式转换逻辑保留 if (return_format == "tibble") { dc <- fortify.zoo(dc_xts, names = "Date") } else { dc <- dc_xts } dc }
修复后的ATR函数示例
按照同样逻辑,适配ATR的HLC参数要求:
# Create ATR function atr_n = 14 atr <- function(x, return_format = "tibble", n = atr_n) { # Convert tibble to xts if (!is.xts(x)) { x <- xts(x[,-1], order.by = x$Date) } # 传入包含High、Low、Close的三列xts对象 atr_xts <- ATR(HLC = x[, c("High", "Low", "Close")], n = n) # ATR返回4列:tr、atr、trueRange,可按需重命名 names(atr_xts) <- c("TR", "ATR", "TrueRange") # 格式转换逻辑保留 if (return_format == "tibble") { atr <- fortify.zoo(atr_xts, names = "Date") } else { atr <- atr_xts } atr }
关键注意事项
- 列名匹配:确保输入的tibble/xts对象中存在
High、Low(DonchianChannel)或High、Low、Close(ATR)列,且列名拼写正确(大小写敏感)。 - 避免向量拼接:不要用
c()合并不同列的时间序列,这会破坏时间索引的对应关系,导致计算失效。 - 返回值结构:DonchianChannel和ATR都返回多列结果,不要直接将所有列重命名为单一名称,否则会丢失关键信息。
内容的提问来源于stack exchange,提问作者Nanthawat
相关产品推荐
相关产品推荐

