R语言如何按基金按年度计算Fama-French Alpha与Beta值
Fama-French分基金分年度Alpha/Beta计算实现
你原代码存在几个影响结果正确性的问题:
- 回归公式方向错误:Fama-French模型中基金超额收益是因变量,风险因子为自变量,原代码写反了变量顺序,输出结果无经济意义
- 分组逻辑不完整:
group_by需要配合分组计算函数才能按子集执行回归,直接链式调用lm会默认使用全量数据集建模 - 字段不匹配:你提供的数据集无
wficn/caldt/excess_return字段,需要基于现有字段派生对应指标 - 返回值为空:原函数末尾写了无参数的
return(),不会输出任何计算结果
完整实现代码
先加载需要的依赖包:
library(tidyverse) library(broom) library(lubridate)
执行数据预处理和分组回归计算:
# 数据预处理 ff_calc_data <- CRSP_database %>% mutate( # 从日期字段提取年度,若date字段已为Date类型可直接调用year(date) year = year(as.Date(date, format = "%Y-%m-%d")), # 计算基金超额收益:收益减无风险利率 excess_return = mret - rf ) # 分基金分年度回归计算 ff_alpha_beta_result <- ff_calc_data %>% # 按基金编号、年度分组 group_by(fundno, year) %>% # 过滤观测数不足的组,避免回归自由度不足报错,阈值可按需调整 filter(n() >= 12) %>% # 逐组跑回归并整理结果 group_modify(~{ # 这里以Carhart四因子模型为例,若要跑三因子去掉公式里的+umd即可 lm(excess_return ~ mktrf + smb + hml + umd, data = .x) %>% tidy() %>% select(term, estimate) %>% pivot_wider(names_from = term, values_from = estimate) %>% rename( alpha = `(Intercept)`, beta_mkt = mktrf, beta_smb = smb, beta_hml = hml, beta_umd = umd ) }) %>% ungroup()
结果说明
- 输出的
ff_alpha_beta_result每一行对应单只基金单个年度的计算结果,alpha列即为你需要的Fama-French总Alpha值 - 各
beta_*列对应不同风险因子的Beta暴露值,要提取单只基金的年度Beta结果,直接按基金编号过滤即可,示例:
# 提取fundno为001的基金所有年度的Alpha和Beta值 single_fund_result <- ff_alpha_beta_result %>% filter(fundno == "001")
注意:如果你的原始date字段格式不是
%Y-%m-%d,需要调整as.Date的format参数匹配实际格式;回归观测数阈值可根据你使用的日度/月度/周度数据频率调整,保证每组有足够自由度即可。
内容的提问来源于stack exchange,提问作者Thomas Hollemans
相关产品推荐
相关产品推荐

