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;
返回结果: