在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
相关产品推荐
相关产品推荐

