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;

    返回结果: