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

在R中基于面板数据按公司年份构建年化收益率波动率五年均值

解决方案

针对大型面板数据集计算公司层面年化波动率的五年均值并对应到t+5年份,这里提供两种高效实现方法,优先推荐data.table处理大样本数据:

方法一:使用data.table(高效适配大型数据)

步骤1:加载包并转换数据格式

library(data.table)

# 将你的数据框转换为data.table(假设原数据名为df)
setDT(df)

步骤2:计算每年的年化波动率

按公司和年份分组,基于月度收益率计算年化波动率(月度标准差乘以√12):

# 按公司、年份聚合,计算年化波动率
annual_vol <- df[, .(annual_vol = sd(ret, na.rm = TRUE) * sqrt(12)), 
                 by = .(firm_id, year)]

注意:如果ret是小数形式(如0.05代表5%),需乘以100转换为百分比波动率:sd(ret, na.rm=TRUE)*sqrt(12)*100

步骤3:计算滚动5年波动率均值并对应t+5年份

对每个公司按年份排序后,用左对齐滚动窗口取连续5年的波动率均值,将结果映射到t+5年份:

# 按公司、年份排序,确保时间序列连续
setorder(annual_vol, firm_id, year)

# 计算滚动5年均值,对应到t+5年份
vol_5y_mean <- annual_vol[, .(target_year = year + 5, 
                              vol_5y_mean = frollmean(annual_vol, n = 5, align = "left", na.rm = TRUE)), 
                          by = firm_id]

# 过滤掉窗口不完整的结果(即不足5年的均值)
vol_5y_mean <- vol_5y_mean[!is.na(vol_5y_mean)]
  • align="left":表示窗口从当前年份开始,包含当前及后续4年(共5年)
  • target_year = year +5:将2010-2014年的均值对应到2015年(t+5)

方法二:使用dplyr+slider(语法更直观)

步骤1:加载依赖包

library(tidyverse)
library(slider)

步骤2:计算年化波动率并生成五年均值

vol_5y_mean <- df %>%
  # 按公司、年份计算年化波动率
  group_by(firm_id, year) %>%
  summarise(annual_vol = sd(ret, na.rm = TRUE) * sqrt(12), .groups = "drop") %>%
  # 按公司、年份排序
  arrange(firm_id, year) %>%
  group_by(firm_id) %>%
  # 取当前年份及后续4年的滚动均值,仅保留完整窗口
  mutate(vol_5y_mean = slide_dbl(annual_vol, mean, .before = 0, .after = 4, .complete = TRUE),
         target_year = year +5) %>%
  # 过滤缺失值(不完整窗口)
  filter(!is.na(vol_5y_mean)) %>%
  ungroup() %>%
  # 选择需要的列
  select(firm_id, target_year, vol_5y_mean)

关键注意事项

  1. 缺失值处理:na.rm=TRUE确保计算时忽略缺失的月度收益率,若需要严格排除含缺失值的年份,可在第一步聚合时先过滤ret为NA的行。
  2. 数据连续性:确保每个公司的年份序列连续,若存在断档,滚动窗口会自动生成NA,需根据需求决定是否补全或过滤。
  3. 单位转换:根据ret的存储形式(百分比/小数)调整波动率计算的系数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:00:58