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
相关产品推荐
相关产品推荐

