FAQ > 金融建模 > 应用案例 > 指标或功能实现

Q:如何计算个股对板块的涨跌贡献度?    

  • A:计算个股在指定日对指定市场或指数的涨跌产生的影响,下面提供两种实现方式计算贡献度供用户参考:
    算法一(适合板块):
        个股贡献度 = 个股市值变动量/板块市值变动量*100
        

    算法二(适合指数或自定义权重的组合):
        变动比例 = 成份股个股涨幅*成份股初始配比
        个股贡献度(个股市值变动占比) = 个股变动比例/sum(成份股变动比例)  即归一化处理
        贡献点位  = 个股贡献度*组合价格变动量

    两个算法计算出的结果会存在差异
    原因:初始权重不一样,算法一中由成份股总市值(或流通市值)计算出变动量,
    而算法二中,由指数公司提供的昨日权重数据(来源于自由流通市值)作为初始配比,或用户自定义的其它配比(若用户将配比改为市值加权比例,结果也能与算法一相近)

    实现案例:计算创业板指在2022-04-20日每个个股对板块的贡献度

    算法一的实现:调用模型StocksDR,通过总市值变动量的计算得到,得到的贡献度方向与板块涨跌方向一致,若介意的可以进行适当调整,如下示例

          endt:=20220420T;
          indexid:='SZ399006';
          stocks:=getbkbydate(indexid,endt,1);//指定日成份股
          //stocks:=getbk('创业板指'); //若无成份股变化,可直接用getbk
          //由于该板块历史有成份变动,所以需要临时添加历史的成份股作为板块
          SaveBK('创业板指-bk','我的一级分类\\我的二级分类',stocks);
          ret:=array();
          setsysparam(pn_date(),endt); //设置指定日
          zf:=spec(close()-SectionPrevClose(),indexid);//指数点位变动量--若仅是板块可忽略该步骤
          for i:=0 to length(stocks)-1 do
          begin
              ret[i,'StockID']:=stocks[i];
              ret[i,'名称']:=stockname(stocks[i]);
              //注意,最后一个参数是指定的板块名(可能getbk取到成份股的板块名)
              ret[i,'贡献度(%)']:=StocksDR(array(stocks[i]),endt,endt,0,'创业板指-bk');
              ret[i,'贡献点位']:=ret[i,'贡献度(%)']*zf/100;
          end
          //调整贡献度方向,负即产生反向贡献 
          return select *,['贡献度(%)']*(zf>0?1:-1) as '贡献度(%)' from ret order by ['贡献点位'] end;

    返回:

    算法二的实现:

        endt:=20220420T;
        indexid:='SZ399006';
        setsysparam(pn_date(),endt);
        GetBkWeightByDate(Indexid,endt-1,t);//初始权重来源于自由流通市值
        //计算个股涨幅 *原比例
        t:= select *,spec(stockzf3(),['代码'])/100*['比例(%)'] as '市值变动比' from t end;
        //归一化处理,市值变动占比反应指数点变动占比即贡献度
        sumt:=sum(t[:,'市值变动比']);
        t:= select *,['市值变动比']/sumt*100 as '贡献度(%)' from t end;
        zspd:=spec(close()-SectionPrevClose(),indexid); //指数点位变动量
        t:= select *,['贡献度(%)']/100*zspd as '贡献点位' from t end;
         //调整贡献度方向,负即产生反向贡献
        return select *,['贡献度(%)']*(zspd>0?1:-1) as '贡献度(%)' from t order by ['贡献点位'] end;

    返回结果: