FAQ > 金融建模 > 应用案例 > 回测应用

Q:如何在回测中计算组合换手率指标    

简述
在回测中获取换手率指标,可以通过交易明细和资产配置数据,调用组合换手率接口pf_TurnoverRate得到。
  • 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;


    回测结果展示:

    组合区间还手率序列展开如下: