FAQ > 金融建模 > 应用案例 > 策略模板 > 债券组合

策略案例ZQ01-跨品种策略-基于DNS模型曲率预测的活跃券蝶式多头组合    

简述
跨品种策略-基于DNS模型曲率预测的活跃券蝶式多头组合
  • 策略案例-跨品种策略-基于DNS模型曲率预测的活跃券蝶式多头组合
    策略原理
    预测NS曲率因子的变动产生交易信号
         (1)曲率因子增加:做多长短期
         (2)曲率因子减少:做多中期

    策略参数:
    交易标的:国债期货可交割券的活跃券
    回测区间:20200101~20251110
    回测周期:月
    交易说明:当日收盘成交
    费用:0
    分红不投资

    策略代码
    //开始日
    BegT := 43831;
      //截止日
    EndT := 45961;
      //回测周期
    cycle := "月线";
      //基准指数
    IndexID := "SH000012";
      //初始资金
    IniCash := 10000000;
      //费率(%)
    FeeRate := 0.0;
    //TSBackTesting
      sp_s(pn_bonddataprovider(),5); //天软估值清算


      obj := new PercentPortfolio();

      obj.FBegT:=BegT;    //回测开始时间
      obj.FEndT:=EndT;    //回测截止时间
      obj.FCycle:=cycle;   //调仓周期
      obj.FIndexId:=IndexID; //基准代码
     
      obj.FGroupType:=1;   //组合类别(比例类组合)
      //obj.FRateType:=4;    //等权
      obj.FRateType:=-1;    //自定义
      obj.FPriceType:=2;   //收盘价成交
     
      obj.FIniCash:=IniCash; //初始资金
      obj.FFeeRate:=FeeRate; //费率(%)


        //回测
      obj.BackTest();

      return array(
             //---组合基础
            "交易明细":obj.GetTradeData(0,EndT),
            "资产配置":obj.GetAssetData(BegT,EndT),
            "持仓明细":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),
          

            );

    End;


    Type PercentPortfolio=class(TSBackTesting)

      FFeeRate;

      function GetTradeOrder(vEndT);override;
      begin
       echo "vEndT*****",datetostr(vEndT);
       
       //1、根据曲率因子产生交易信号
       t1 := YieldCurvePredict_Butterfly(vEndT,FCycle,36);
       N:=3;
       echo "交易信号****",t1["预测变动2"]>0;
       
       if t1["预测变动2"]>0 then //2.1、曲率因子增加:做多长短期
       begin
         Bonds_S := GetActiveBondsByCTD(vEndT,0,N);
         Bonds_M := GetActiveBondsByCTD(vEndT,1,N);
         Bonds_L := GetActiveBondsByCTD(vEndT,2,N);
         D_S := mean(Bonds_S[:,"修正久期"]);
         D_M := mean(Bonds_M[:,"修正久期"]);
         D_L := mean(Bonds_L[:,"修正久期"]);

         q_S := (D_M-D_L)/(D_L-D_S);
         q_L := (D_S-D_M)/(D_L-D_S);
       
         Bonds_S[:,'比例(%)']:=1/length(Bonds_S)*100;
         Bonds_S[:,'比例(%)']:=abs(q_S)*Bonds_S[:,'比例(%)'];
        
         Bonds_L[:,'比例(%)']:=1/length(Bonds_L)*100;
         Bonds_L[:,'比例(%)']:=abs(q_L)*Bonds_L[:,'比例(%)'];
        
         Data := Bonds_S Union Bonds_L;
       end
       else      //2.2、曲率因子增加:做多中期
       begin
         Bonds_M := GetActiveBondsByCTD(vEndT,1,N);
         Bonds_M[:,'比例(%)']:=1/length(Bonds_M)*100;
         Data := Bonds_M;
       end

       //3、生成交易明细
       Update Data set ["截止日"]=vEndT,["方向"]=1,['开仓费率(%)']=FFeeRate,['平仓费率(%)']=FFeeRate end;
       echo "组合久期***",sum(Data[:,"修正久期"]*Data[:,"比例(%)"])/100;

       return data;
      end

    End;

    中间函数
    GetActiveBondsByCTD、YieldCurvePredict_Butterfly 等中间函数见附件附件:2025-11-24-ZQ01-中间函数.tslfunc