R语言Form_CharSizePorts2函数输出获取与可视化方法咨询
Form_CharSizePorts2函数输出获取与可视化方法
获取函数输出
这个函数的作用是基于NYSE股票的分位数断点,按50%规模分位、30%/70%目标特征分位构建2×3共6个投资组合,输出各期组合收益以及SMB、HML类因子收益,直接按要求传入参数调用即可拿到输出。
入参要求:
main:股票面板原始数据集,必须包含Date(期数/交易日期)、PERMNO(股票唯一ID)、exchcd(交易所代码,值为1代表NYSE),以及后续指定的规模、特征、权重、收益字段size:代表公司规模的字段(如流通市值)var:用于分组的目标特征字段(如账市比、动量等)wght:计算组合加权收益的权重字段(通常用流通市值做市值加权)ret:个股收益率字段
调用前先加载依赖包,再传入对应参数即可:
# 加载依赖 library(dplyr) library(tidyr) # 示例调用:假设原始数据集名为stock_data,规模字段为mktcap,特征字段为bm,权重为mktcap,收益字段为ret port_result <- Form_CharSizePorts2( main = stock_data, size = mktcap, var = bm, wght = mktcap, ret = ret )
调用完成后,port_result就是函数的输出结果,是按日期存储的数据框,包含:
- 6个基础组合的每期收益:Small.Low、Small.Neutral、Small.High、Big.Low、Big.Neutral、Big.High
- 规模分组合成收益:Small(小市值组合平均)、Big(大市值组合平均)、SMB(小市值减大市值的规模因子)
- 特征分组合成收益:High(高特征组合平均)、Low(低特征组合平均)、HML(高特征减低特征的特征因子)
排错提示:如果调用报错,优先检查原始数据是否缺失必填字段、NYSE样本(exchcd==1)是否存在、分组字段是否存在大量缺失值导致分位数计算失败。如果函数本身的
returnValue报错,把函数最后一行替换为return(Ret)即可。
常用可视化实现
拿到输出结果后,可以根据分析需求做不同类型的可视化,以下是最常用的两种方案,需要先加载ggplot2包:
library(ggplot2)
1. 因子累计收益时序图
用于观察SMB、HML因子的长期收益走势:
# 计算累计净值 cum_ret_data <- port_result %>% arrange(Date) %>% # 注意:如果你的收益率是小数格式(如0.01代表1%),去掉下面代码里的/100 mutate( SMB = cumprod(1 + SMB/100) - 1, HML = cumprod(1 + HML/100) - 1 ) %>% select(Date, SMB, HML) %>% pivot_longer(cols = -Date, names_to = "因子", values_to = "累计收益率") # 绘图 ggplot(cum_ret_data, aes(x = Date, y = 累计收益率, color = 因子)) + geom_line(linewidth = 0.8) + scale_y_continuous(labels = scales::percent) + labs(title = "SMB与HML因子累计收益走势") + theme_minimal()
2. 6个基础组合平均收益对比图
用于对比不同规模-特征分组的收益差异:
# 计算各组合全样本平均收益 mean_ret_data <- port_result %>% select(Small.Low, Small.Neutral, Small.High, Big.Low, Big.Neutral, Big.High) %>% summarise(across(everything(), ~mean(., na.rm = TRUE))) %>% pivot_longer(everything(), names_to = "组合", values_to = "平均期收益率") # 绘图 ggplot(mean_ret_data, aes(x = 组合, y = 平均期收益率, fill = 组合)) + geom_col() + scale_y_continuous(labels = scales::percent) + labs(title = "2×3分组组合平均收益率对比", x = "组合(规模.特征分组)") + theme_minimal() + theme(legend.position = "none", axis.text.x = element_text(angle = 30, hjust = 1))
如果需要观察分组断点的变化,可以在函数中额外返回Bkpts.NYSE数据集,对每期的规模中位数、特征30%/70%分位值做时序图即可。
内容的提问来源于stack exchange,提问作者35mmongol
相关产品推荐
相关产品推荐

