A:
场景:在回测返回结果中加入换手率指标
实现方法:
在执行回测BackTest方法后,可以通过函数GetTradeData和函数GetAssetData获取对应的区间交易明细和区间资产配置数据,对这些数据进行处理后,调用函数pf_TurnoverRate,计算出组合区间平均日换手率。
组合换手率算法:
MethodType:换手率计算方法
=0,T-1日&T日市值平均法(主要是计算组合换手率)
=1,T日市值+T日卖出法(主要是计算分类资产换手率)
注:回测中使用不同的成交价类别时(回测中当日市值是基于收盘价计算的),可能会导致开仓时的换手率大于100%
案例实现:
Function TSDN_BTHSLTest_Demo();
Begin
BegT:=20210901T;
EndT:=20210928T;
obj:=createobject('PercentPortfolio');
//********************回测基本设置*************************//
//回测开始时间
obj.FBegT:=BegT;
//回测截止时间
obj.FEndT:=EndT;
//调仓周期(以日线为例)
obj.FCycle:=cy_day();
//组合类别(比例类组合)
obj.FGroupType:=1;
//基准代码
obj.FIndexId:="SH000300";
//初始资金
obj.FIniCash:=1000000;
//资金配比方式-流通股本加权
obj.FRateType:=1;
//成交价类别-开盘价
obj.FPriceType:=4;
//成交量取整模式
obj.FVolModType:=-1;
//是否分红再投资
obj.FDividendType:=1;
//是否参与配股
obj.FAllotmentType:=1;
//********************用户自定义参数***********************//
//每期样本个数
obj.FTopN:=10;
obj.FFeeRate:=0.03;
//回测
obj.BackTest();
tTurnOver:=array();
//换手率计算方式,0:T-1日&T日市值平均法,1:T日市值+T日卖出法
MethodType:=1;
//交易明细
jymx:=obj.GetTradeData(BegT,EndT);
//资产配置
zcpz:=obj.GetAssetData(BegT,EndT);
tAllJYMX:=Select *,ifthen(['动作']=0,'买入','卖出') as '动作' from jymx end;
tSubZCPZ:=Select ['截止日'],['股票市值'] as '资产净值' from zcpz end;
r:=pf_TurnoverRate(tAllJYMX,tSubZCPZ,MethodType,tTurnOver);
//获取返回结果(返回结果可根据需要选择)
return array(
//---组合基础
"交易明细":jymx,
"资产配置":zcpz,
"持仓明细":obj.GetHoldData(BegT,EndT),
//---组合盈亏、交易
"组合盈亏":obj.GetGainandLoss(BegT,EndT),
"交易汇总":obj.GetTradingAmount(BegT,EndT),
"组合盈亏(按证券)":obj.GetGainandLossBySecurity(BegT,EndT),
"交易汇总(按证券)":obj.GetTradingAmountBySecurity(BegT,EndT),
//---组合收益
"区间组合收益率":obj.GetPortfolioReturn(BegT,EndT),
"组合和基准收益率序列":obj.GetPortfolioReturn2(BegT,EndT),
"阶段收益":obj.GetTrailingReturn(EndT),
"滚动收益":obj.GetRollingReturn(BegT,EndT,cy_month()),
//---组合评价
"风险回报":obj.GetReturnandRisk(BegT,EndT),
"相对回报":obj.GetRelativePerformance(BegT,EndT),
//---组合其他指标
"组合区间换手率序列":tTurnOver,
"组合区间平均换手率":r
);
End;
Type PercentPortfolio=class(TSBackTesting)
FTopN; //样本个数
FFeeRate;
//重写GetTradeOrder,获取T日选股结果(TSFL_CL_PE_EndT即T日根据PE选股结果)
function GetTradeOrder(vEndT);override;
begin
t:=TSFL_CL_PE_EndT("沪深300",vEndT,FTopN);
Update t set ['开仓费率(%)']=FFeeRate,['平仓费率(%)']=FFeeRate end;
return t;
end
End;
回测结果展示:
组合区间还手率序列展开如下:
