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

如何在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月”的需求。

注意事项

  1. 确保DATE是SAS可识别的日期格式,如果是字符型(比如YYYYMM),需要先转换成日期格式;
  2. 若存在公司在再平衡周期内退市的情况,可在Company_Market_Value数据步中处理缺失值(比如退市后RETURN设为0,或停止累算该公司市值);
  3. 可加入验证步骤,比如检查每年6月的总市值是否和初始投资总金额匹配,确保权重计算正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:24:07