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

Q:如何计算公募基金相对其业绩比较基准的超额收益数据    

简述
比如某个基金的比较基准是50%*中证银行指数+30*中证全债指数+20%*三年期定期存款利率,相对它的超额收益
  • A:可封装函数FundExtraZF,用函数FundBenchmarkReturn4计算出业绩基准指定日收益率得到超额收益,具体实现如下:
    取数代码:
    先封装一个函数——基金超额收益率(%)
    定义:FundExtraZF(FundID:String,BegT,EndT:TDateTime,ReturnType:Bool):Real
    说明:计算基金的超额收益率(%)
    参数: FundID 字符串,基金代码
       BegT  开始日期
       EndT  截止日期
       ReturnType 返回类型,0或nil返回实数超额收益率(%),
         1返回数组array('基金':FundID,
             '基金收益率(%)':FundZF,
             '业绩基准收益率(%)':IndexZF,
             '超额收益率(%)':v);
    返回:实数,超额收益率(%)
    单基金超额收益:

    Function FundExtraZF(FundID,BegT,EndT,ReturnType);
    Begin
    // 计算一段时间内单基金相对于业绩基准的超额收益率
     // 指定当前基金、截止时间
     with *,array(pn_stock():FundID,pn_date():EndT) do
     Begin
      // 取基金区间累计收益率
      FundZF := FundNAWZf(BegT,EndT);

      if FundBenchmarkReturn4(EndT)<>10001 then
      // 判断基准是否可计算
      begin
       // 取基准-区间日收益率序列
       Tarr:=MarketTradeDayQk(BegT,EndT);
       IndexZFDay:=select thisrow as '截止日',
         FundBenchmarkReturn4(thisrow) as '收益率(%)'
         from Tarr end;
       // 由日收益率计算区间收益率
       IndexZF:=pf_CumulativeReturn(IndexZFDay,'收益率(%)');
      end
      else
      // 若基准不可计算则用沪深300替代
       IndexZF:=spec(stockzf(BegT,EndT),'SH000300');
     End

     // 超额收益率:FundZF - IndexZF
     v:=FundZF - IndexZF;
     
     if ifnil(returntype) or returntype=0 then
      return v;
     else
      return array('基金':FundID,
             '基金收益率(%)':FundZF,
             '业绩基准收益率(%)':IndexZF,
             '超额收益率(%)':v);
    End;


    范例一:

    // 获取OF000008在2020-01-01至2020-12-31区间的超额收益
      FundID := 'OF000008';
      BegT := 20200101T;
      EndT := 20201231T;
      return FundExtraZF(FundID,BegT,EndT);
    // 返回(结果是百分比数据):1.42678100546163


    多基金超额收益:
    范例二:

    // 计算当前股票型基金各基金在2020-01-01至2020-12-31区间的超额收益率
      FundArr := getbk('股票型');
      BegT := 20200101T;
      EndT := 20201231T;
      r:=array();
      for i in FundArr do
      begin
       r[i]:=FundExtraZF(FundArr[i],BegT,EndT,1);
      end
      return r;


    返回: