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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:12:59