如何在SAS中实现基于6月市值的买入持有型市值加权收益计算
看起来你需要实现每年6月再平衡的买入持有市值加权组合,这个逻辑比普通的月度市值加权要复杂一些——权重只在每年6月根据当时的市值调整,之后12个月里让权重随各公司的收益自然变化,直到下一年6月再重新平衡。我来一步步拆解怎么用SAS实现这个需求:
步骤1:预处理日期,定义再平衡周期
首先我们需要给每个观测标记它属于哪个再平衡周期:每年6月做的权重调整,要覆盖当年7月到次年6月的所有月份。假设你的DATE是SAS可识别的日期格式(比如DATE9.),先提取年份和月份,生成REBAL_YEAR标识:
DATA Data1_prep; SET Data1; YEAR = YEAR(DATE); MONTH = MONTH(DATE); * 规则: - 1-6月的观测属于上一年的再平衡周期(用上年6月的权重) - 7-12月的观测属于当年的再平衡周期(用当年6月的权重); IF MONTH <= 6 THEN REBAL_YEAR = YEAR - 1; ELSE REBAL_YEAR = YEAR; RUN;
步骤2:计算每年6月的初始权重
接下来提取每年6月各公司的市值,计算该时点的全市场总市值,进而得到每个公司的初始权重(6月市值占总市值的比例):
* 提取每年6月的公司市值; PROC SUMMARY NWAY DATA = Data1_prep; WHERE MONTH = 6; CLASS REBAL_YEAR COMPNAME; VAR CAP; OUTPUT OUT = June_CAP (DROP = _TYPE_ _FREQ_) SUM(CAP) = JUNE_CAP; RUN; * 计算每年6月的全市场总市值; PROC SUMMARY NWAY DATA = June_CAP; CLASS REBAL_YEAR; VAR JUNE_CAP; OUTPUT OUT = Total_June_CAP (DROP = _TYPE_ _FREQ_) SUM(JUNE_CAP) = TOTAL_JUNE_CAP; RUN; * 合并得到初始权重; DATA Initial_Weight; MERGE June_CAP Total_June_CAP; BY REBAL_YEAR; INIT_WEIGHT = JUNE_CAP / TOTAL_JUNE_CAP; RUN;
步骤3:将初始权重匹配到对应周期的所有观测
把刚才计算的初始权重,关联到它所覆盖的整个再平衡周期的所有月份数据中:
DATA Data1_with_weight; MERGE Data1_prep Initial_Weight; BY REBAL_YEAR COMPNAME; RUN;
步骤4:逐月累算市值,计算买入持有组合收益
这是核心部分:模拟买入持有过程——从每年7月开始,用6月的市值作为初始投资基数,每个月根据公司收益更新市值,再用当月市值占比计算组合的月度收益:
* 计算每个公司在再平衡周期内的月度市值; DATA Company_Market_Value; SET Data1_with_weight; BY REBAL_YEAR COMPNAME; RETAIN MONTHLY_MV; * 保留上一期市值,用于累算; IF FIRST.COMPNAME THEN DO; * 首次进入该公司的再平衡周期: - 6月观测先记录初始市值(用于后续7月投资) - 7月及以后直接用6月市值乘以当月收益,得到投资后的初始市值; IF MONTH = 6 THEN MONTHLY_MV = JUNE_CAP; ELSE MONTHLY_MV = JUNE_CAP * (1 + RETURN); END; ELSE DO; * 非周期内首次观测:用上一期市值乘以当月收益,得到当月市值; MONTHLY_MV = MONTHLY_MV * (1 + RETURN); END; RUN; * 计算每月的全市场总市值; PROC SUMMARY NWAY DATA = Company_Market_Value; CLASS DATE; VAR MONTHLY_MV; OUTPUT OUT = Total_MV (DROP = _TYPE_ _FREQ_) SUM(MONTHLY_MV) = TOTAL_MV; RUN; * 计算当月权重和组合收益贡献; DATA MKTRET_BuyHold; MERGE Company_Market_Value Total_MV; BY DATE; * 当月权重 = 公司当月市值 / 全市场总市值; MONTHLY_WEIGHT = MONTHLY_MV / TOTAL_MV; * 单个公司对组合收益的贡献; RETURN_CONTRIB = RETURN * MONTHLY_WEIGHT; RUN; * 汇总得到每月的组合收益; PROC SUMMARY NWAY DATA = MKTRET_BuyHold; CLASS DATE; VAR RETURN_CONTRIB; OUTPUT OUT = MKTRET_FINAL (DROP = _TYPE_ _FREQ_) SUM(RETURN_CONTRIB) = MONTHLYRETURN; RUN;
关键逻辑说明
- 再平衡周期的划分确保了每年6月的权重只会应用到当年7月至次年6月的观测;
- 用
RETAIN语句实现市值累算,完美模拟了“买入后不主动调整,权重随收益自然变化”的买入持有逻辑; - 组合收益基于当月实际市值占比计算,完全匹配你例子中“7月后权重随收益变化至次年6月”的需求。
注意事项
- 确保
DATE是SAS可识别的日期格式,如果是字符型(比如YYYYMM),需要先转换成日期格式; - 若存在公司在再平衡周期内退市的情况,可在
Company_Market_Value数据步中处理缺失值(比如退市后RETURN设为0,或停止累算该公司市值); - 可加入验证步骤,比如检查每年6月的总市值是否和初始投资总金额匹配,确保权重计算正确。
内容的提问来源于stack exchange,提问作者user30609
相关产品推荐
相关产品推荐

