基于分组条件计算加权平均收益率(面板数据场景)
解决方案
核心处理逻辑
- 先过滤掉
RET、MV、RANK_LAG任意字段含NA的行 - 按
DATE和RANK_LAG分组,计算每组内以MV为权重的加权平均收益率 - 调整列名并格式化结果保留三位小数
R 实现代码(基于dplyr)
library(dplyr) # 处理数据并计算加权平均 result <- df %>% # 移除含NA的行 filter(!is.na(RET), !is.na(MV), !is.na(RANK_LAG)) %>% # 按日期和排名分组 group_by(DATE, RANK_LAG) %>% # 计算市值加权平均收益率 summarise(WEIGHTED_RET = weighted.mean(RET, w = MV), .groups = "drop") %>% # 重命名列匹配期望输出 rename(RANK = RANK_LAG) %>% # 保留三位小数 mutate(WEIGHTED_RET = round(WEIGHTED_RET, 3)) # 输出结果 print(result)
Python 实现代码(基于Pandas)
import pandas as pd # 过滤含NA的行 filtered_df = df.dropna(subset=['RET', 'MV', 'RANK_LAG']) # 定义加权平均计算函数 def calculate_weighted_ret(group): total_mv = group['MV'].sum() weighted_sum = (group['RET'] * group['MV']).sum() return weighted_sum / total_mv # 分组计算并整理结果 result = filtered_df.groupby(['DATE', 'RANK_LAG']).apply(calculate_weighted_ret).reset_index(name='WEIGHTED_RET') result = result.rename(columns={'RANK_LAG': 'RANK'}) result['WEIGHTED_RET'] = result['WEIGHTED_RET'].round(3) # 输出结果 print(result)
示例数据验证结果
运行上述代码后,会得到与你期望完全一致的输出:
| DATE | RANK | WEIGHTED_RET |
|---|---|---|
| 2000-01-01 | 1 | 0.013 |
| 2000-01-01 | 2 | 0.026 |
| 2000-02-01 | 1 | -0.100 |
| 2000-02-01 | 2 | 0.083 |
内容的提问来源于stack exchange,提问作者datgoaltho
相关产品推荐
相关产品推荐

