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