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

R语言计算股票反弹收益求助:需筛选2000年最低价

解决股票反弹收益计算的问题

首先,咱们先拆解你遇到的问题:你触发的错误Error in min[Adj.Price] : object of type 'builtin' is not subsettable,是因为误把函数min当成了列表用方括号[]调用,正确写法应该是min(Adj.Price)。除此之外,你还需要先筛选2000年的数据锁定最低价,并且要确保数据按日期排序,才能准确找到最低价之后的120个观测值。

下面是一步步的解决方案:

步骤1:先确保数据按股票和日期排序

计算时间序列收益的前提是每个股票的价格数据按日期升序排列,否则后续的位置索引会完全错误:

stock.prices <- stock.prices %>%
  arrange(PERMNO, date)

步骤2:计算反弹收益

我们会先筛选2000年的日期,找到每个股票在该年的最低价及其对应位置,再取该位置之后第120个观测值的价格计算收益,同时处理后续观测值不足120个的边界情况:

Rebound_Return <- stock.prices %>%
  group_by(PERMNO) %>%
  # 标记2000年的数据,并找到该年最低价的组内位置
  mutate(
    is_2000 = year(date) == 2000,
    # 仅在2000年数据中找最低价的位置,非2000年用Inf填充避免干扰
    min_2000_pos = if(any(is_2000)) which.min(ifelse(is_2000, Adj.Price, Inf)) else NA
  ) %>%
  # 计算反弹收益,同时处理后续数据不足的情况
  summarise(
    Rebound_Return2 = if(!is.na(min_2000_pos) && (min_2000_pos + 120) <= n()) {
      Adj.Price[min_2000_pos + 120] / Adj.Price[min_2000_pos] - 1
    } else {
      NA  # 若后续不足120个观测值,返回NA可根据需求调整
    }
  )

补充:优化你的危机收益计算

你原有的危机收益代码存在日期类型比较的隐患(字符串和日期直接比较),建议调整为明确的日期类型判断,同时确保day==1是2000年的首个交易日:

Crisis_Return <- stock.prices %>%
  group_by(PERMNO) %>%
  filter(date <= as.Date("2000-12-29")) %>%
  filter(year(date) == 2000, day == 1) %>%
  summarise(Crisis_Return2 = min(Adj.Price[year(date) == 2000]) / first(Adj.Price) - 1)

关键代码解释

  • which.min(ifelse(is_2000, Adj.Price, Inf)):限定仅在2000年的价格数据中找最低价位置,非2000年数据用Inf填充,确保which.min不会选中其他年份的价格。
  • (min_2000_pos + 120) <= n():检查当前股票的观测值总数是否足够,避免出现索引越界的错误。
  • 若某股票2000年无数据或后续观测值不足120个,代码会返回NA,你可以根据实际需求修改这种情况的处理逻辑。

内容的提问来源于stack exchange,提问作者Kardeshma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:14:37