R语言TTR包计算技术指标时如何按公司分组批量计算?
代码失效原因
TTR::ATR() 不属于dplyr原生支持的分组感知函数,你原有写法在group_by(company)后直接传入全量数据集data_price的列,完全跳过了分组切分逻辑,本质是对所有公司混在一起的全量数据计算ATR,分组设置没有生效。
可用方案
方案1:dplyr 分组实现(适配你原有代码逻辑)
计算前必须先按公司、交易日期排序,时间序列顺序错误会导致所有滚动技术指标结果完全失效,代码如下(请把date替换为你数据中实际的交易日期字段名):
library(dplyr) library(TTR) data_ATR <- data_price %>% arrange(company, date) %>% group_by(company) %>% group_modify(~{ atr_res <- ATR( HLC = .x[, c("PRICE HIGH", "PRICE LOW", "CLOSING PRICE")], n = 14 ) bind_cols(.x, atr_res) }) %>% ungroup()
计算完成后,数据集会在原有行情字段基础上新增4列:tr(单期真实波幅)、atr(14期平均真实波幅)、trueHigh(真实高点)、trueLow(真实低点)。
方案2:data.table 实现(适合大体量数据)
如果你的行情数据周期细、总数据量大,用data.table分组计算速度会明显快于dplyr方案:
library(data.table) library(TTR) setDT(data_price) setorder(data_price, company, date) data_price[, c("tr", "atr", "trueHigh", "trueLow") := ATR(.SD[, c("PRICE HIGH", "PRICE LOW", "CLOSING PRICE")], n = 14), by = company ]
通用注意事项
- 该分组逻辑可以直接复用到TTR包的其他技术指标计算(RSI、MACD、布林带等),只需替换块内的指标函数即可,无需为100只股票单独写循环
- 如果数据存在停牌缺失、价格空值,计算前先补全交易日期、处理缺失值,避免滚动窗口计算出现异常NA
- 不要在分组计算时传入全局全量数据框的索引,所有计算引用的字段必须来自当前分组的子集
内容的提问来源于stack exchange,提问作者hellberg30
相关产品推荐
相关产品推荐

