You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 17:47:37