FAQ > 金融建模 > 建模问题 > 回测框架相关问题

Q:数量类回测:从外部导入交易数据    

  • 问题描述:回测框架文档中有提供比例类-从外部导入组合配置数据的范例,数量类能不能也提供一个类似的范例?
    A:当然可以,我们提供了实现该需求的函数,用户可以自行导入或根据自身需求进行修改
    附件:附件:TSFL_TSBackTesting_File_02.fun
    使用范例如下:
      //截止日
      EndT := 20241230T;
      //基准代码
      IndexId := "SH000300";
      //初始资金
      IniCash := 100000000;
      //成交价类别(收盘价)
      PriceType := 2;
      //成交量取整模式(不取整)
      VolModType := -1;
      //分红不再投资
      DividendType := 0;
      //不参与配股
      AllotmentType := 0;
      //开仓模式(固定成交量)
      OpenVolType := 1;
      //平仓模式(固定成交量)
      CloseVolType := 1;
      //费用类别(费率法)
      FeeType := 1;
      rdo2 importFile(ftCSV(),'',"C:\\Users\\Test\\Desktop\\配置组合.csv",MyPortfolioArr);
      backtest_result:=TSFL_TSBackTesting_File_02(EndT,MyPortfolioArr,IndexId,IniCash,PriceType,VolModType,DividendType,AllotmentType,OpenVolType,CloseVolType,FeeType);
      return backtest_result;

    其中,外部组合配置数据如下

    结果:


    注:附件中函数代码如下
    Function TSFL_TSBackTesting_File_02(EndT,MyPortfolioArr,IndexId,IniCash,PriceType,VolModType,DividendType,AllotmentType,OpenVolType,CloseVolType,FeeType);
    Begin
      BegT := vselect minof(['截止日'])from MyPortfolioArr end;
      obj := CreateObject('TSMyBackTestingQuantity');
      //用户导入的配置数据
      obj.MyPortfolioArr := MyPortfolioArr;
      //回测开始时间
      obj.FBegT := BegT;
      //回测截止时间
      obj.FEndT := EndT;
      //组合类型(数量类组合)
      obj.FGroupType := 2;
      //基准代码
      obj.FIndexId := IndexId;
      //初始资金
      obj.FIniCash := IniCash;
      //成交价类别
      obj.FPriceType := PriceType;
      //成交量取整模式
      obj.FVolModType := VolModType;
      //是否分红再投资
      obj.FDividendType := DividendType;
      //是否参与配股
      obj.FAllotmentType := AllotmentType;
      //数量类成员变量
      //开仓模式
      obj.FOpenVolType := OpenVolType;
      //平仓模式
      obj.FCloseVolType := CloseVolType;
      //费用类别
      obj.FFeeType := FeeType;
      //回测
      obj.BackTest();
      //获取返回结果(返回结果可根据需要选择)
      return array(
        //---组合基础
        '交易明细':obj.GetTradeData(BegT,EndT),
        "资产配置":obj.GetAssetData(BegT,EndT),
        "持仓明细":obj.GetHoldData(BegT,EndT),
        "行业配置":obj.GetSectorAllocation(BegT),

        //---组合盈亏、交易
        "组合盈亏":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 TSMyBackTestingQuantity=class(TSBackTesting)
      public
      MyPortfolioArr;
      function GetTimeSeries();override;
      function GetTradeOrder(vEndT);override;
    end;
    function TSMyBackTestingQuantity.GetTimeSeries();override;
    begin
      //从导入的配置文件中获取调仓日序列
      return SSelect distinct['截止日']from MyPortfolioArr order by['截止日'] end;
    end;
    function TSMyBackTestingQuantity.GetTradeOrder(vEndT);override;
    begin
      //查询某个调仓日的配置数据
      t := Select * from MyPortfolioArr where['截止日']=vEndT end;
      return t;
    end;