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

在R中实现个股月度收益的均值中心化(Demeaning)方法问询

个股层面均值中心化收益的R实现方案

Hey there! 我完全理解你的需求——你需要针对每只NYSE上市公司,计算其月度收益相对于自身全样本期平均收益的中心化值(也就是demeaned收益),而不是用全局所有收益的均值来中心化。之前用scale()函数不对,是因为它默认是对整个向量做标准化/中心化,而不是按个股分组处理。下面给你几个实用的R实现方法,你可以根据自己的工作流选择:

方法1:使用dplyr(tidyverse生态,代码易读)

如果你习惯用tidyverse系列工具,dplyr的分组操作非常直观:

# 先加载dplyr包(如果没安装先运行install.packages("dplyr"))
library(dplyr)

# 假设你的数据框名为crsp_data
crsp_data <- crsp_data %>%
  # 按公司代码分组
  group_by(`Company Code`) %>%
  # 新增demeaned收益列:当前月度收益减去该公司全样本平均收益
  mutate(demeaned_return = Return - mean(Return, na.rm = TRUE)) %>%
  # 取消分组(可选,后续操作如果不需要分组的话)
  ungroup()

这里的na.rm = TRUE很重要,因为CRSP数据可能存在缺失的收益值,加上这个参数可以避免因缺失值导致整组计算结果为NA。

方法2:使用data.table(处理大数据效率极高)

如果你处理的是CRSP这类大样本面板数据,data.table的分组运算速度会比dplyr快很多,适合百万级以上的行数据:

# 加载data.table包(未安装先运行install.packages("data.table"))
library(data.table)

# 把数据框转换为data.table格式(如果原本就是可以跳过)
setDT(crsp_data)

# 按公司代码分组计算demeaned收益
crsp_data[, demeaned_return := Return - mean(Return, na.rm = TRUE), by = `Company Code`]

方法3:基础R实现(无需额外安装包)

如果你不想加载任何第三方包,基础R的ave()函数可以直接实现分组计算:

# 直接新增列,ave函数会按Company Code分组计算
crsp_data$demeaned_return <- ave(crsp_data$Return, 
                                 crsp_data$`Company Code`, 
                                 FUN = function(x) x - mean(x, na.rm = TRUE))

验证示例

拿你提到的AAPL数据举例:假设AAPL在1963-2017全样本期的平均收益是0.02,那它1981年3月的demeaned收益就是:
-0.07512 - 0.02 = -0.09512
你可以在计算后抽查几只股票的结果,确认是否符合预期。

注意事项

  • 确保Company Code是正确的分组标识,不要存在拼写错误或格式不一致(比如有的是字符型有的是因子型);
  • 如果你的数据中有缺失值,一定要保留na.rm = TRUE,否则分组均值会变成NA,导致对应的demeaned收益也为NA;
  • 对于超大规模的CRSP数据,优先选择data.table方法,能显著提升运算速度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:16:26