在R中计算股票每日对数收益率:分组与首行保留问题
解决分组计算股票每日对数收益率的问题
问题分析
你当前的代码存在两个核心问题:
diff(log(df$price))是全局计算,没有利用group_by(ticker)的分组信息,导致跨股票计算收益率diff会直接移除首行,无法保留原始行数并标记缺失值
解决方案
利用dplyr的分组计算能力,结合lag()函数实现按股票分组计算对数收益率,同时保留首行并标记为NA或0。
完整代码示例
library(tidyverse) # 测试数据构建 df <- tibble( Date = c( '01.11.2019', '04.11.2019', '05.11.2019', '06.11.2019', '07.11.2019', '08.11.2019' ), ACCR.PK = c(0.0035, 0.003, 0.0035, 0.0057, 0.0032, 0.0032), SWGI.PK = c(0.51, 0.51, 0.51, 0.51, 0.51, 0.51), HURC.OQ = c(35.53, 35.62, 35.76, 35.52, 35.6, 36) ) %>% mutate(Date = as.Date(Date, format = "%d.%m.%Y")) %>% pivot_longer(-Date, names_to = "ticker", values_to = "price") %>% group_by(ticker) %>% # 正确的分组方式,需链式调用 mutate( # 计算对数收益率:log(当日价格/前一日价格) = log(当日) - log(前一日) log_return = log(price) - lag(log(price)), # 可选:将首行的NA替换为0 log_return = replace_na(log_return, 0) ) %>% ungroup() # 可选:取消分组,方便后续全局操作 # 查看结果 print(df)
代码说明
- 正确分组:使用
%>% group_by(ticker)链式调用,确保后续计算按股票分组执行 - 对数收益率计算:
lag(log(price))会获取当前股票前一行的对数价格- 两者相减得到当日对数收益率,首行因无前一日数据会返回
NA
- 首行处理:使用
replace_na(log_return, 0)将首行的NA替换为0,若不需要替换则删除该行即可 - 大数据适配:该方法基于
dplyr的向量化分组计算,处理4000只股票的年度数据效率较高
输出示例
# A tibble: 18 × 4 Date ticker price log_return <date> <chr> <dbl> <dbl> 1 2019-11-01 ACCR.PK 0.0035 0 2 2019-11-04 ACCR.PK 0.003 -0.154 3 2019-11-05 ACCR.PK 0.0035 0.154 4 2019-11-06 ACCR.PK 0.0057 0.494 5 2019-11-07 ACCR.PK 0.0032 -0.584 6 2019-11-08 ACCR.PK 0.0032 0 7 2019-11-01 SWGI.PK 0.51 0 8 2019-11-04 SWGI.PK 0.51 0 9 2019-11-05 SWGI.PK 0.51 0 10 2019-11-06 SWGI.PK 0.51 0 11 2019-11-07 SWGI.PK 0.51 0 12 2019-11-08 SWGI.PK 0.51 0 13 2019-11-01 HURC.OQ 35.5 0 14 2019-11-04 HURC.OQ 35.6 0.00253 15 2019-11-05 HURC.OQ 35.8 0.00392 16 2019-11-06 HURC.OQ 35.5 -0.00674 17 2019-11-07 HURC.OQ 35.6 0.00225 18 2019-11-08 HURC.OQ 36.0 0.0112
内容的提问来源于stack exchange,提问作者Li4991
相关产品推荐
相关产品推荐

