FAQ > 金融建模 > 应用案例 > 回测应用 > 期现对冲

Q:回测-比例类-指定资产占比的条件下进行市值等量对冲    

  • A:由于比例回测中,用户提供的持仓数据中"比例(%)"代表的是占总市值比例,所以,等市值对冲,若无其它要求,可以各给50%,若考虑留备用仓位防止暴仓,一般可留用10%的现金,则可各分配45%,即期货与现货比例相等即可达到目的。
    但若要加上其它条件,比如,股票占用的资金,想占到总资产的75%,又要如何给这个市值比例呢?
    所以,这里分享一个股票占用指定资金比例的,期货与股票进行等市值对冲的案例,供有类似需求的用户进行参考。

    首先,关于比例类回测中,市值占比与资产净值占比的推算,可参考文档:FAQ:2014-03-31-应用专题-回测框架02:比例类组合回测框架中关于设置比例的升级
    其中,重点公式:

    案例实现:

    Function BL_Test_06();
    Begin
    { 案例策略说明:期货与股票市值等量对冲的实现
    期货:IF01 保证金比例15%
    股票:取上证50前5支票,股票占用75%资金,并使期货市值与股票总市值达到一致
    }
      BegT:=20210101T;    //回测开始时间
      EndT:=20210601T;
      obj := createobject('Hedging');

      //********************回测基本设置***************************//
      obj.FBegT:=BegT;    //回测开始时间
      obj.FEndT:=EndT;    //回测截止时间
      obj.FCycle:=cy_month();
      obj.FGroupType:=1;   //比例组合类型
      obj.FIndexId:='SH000001'; //基准代码
      obj.FIniCash:=1000000;  //初始资金
      obj.FPriceType:=2;   //成交价类别:2-收盘价,4-开盘价,-1-用户自定义,需要提供“成交价”列
      obj.FVolModType:=0;   //0-成交量不取整,-1-成交量自适应取整
      obj.FRateType:=-1;   // 用户自定义,提供"比例(%)"
      obj.FFeeType:=1;    //采用费率法,自己提供开仓费率、平仓费率
       //回测
      obj.BackTest();

       //获取返回结果(返回结果可根据需要选择)
      return array(
             //---组合基础
            "交易明细":obj.GetTradeData(BegT,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;
      //新建类Hedging继承回测基类TSBackTesting
    Type Hedging=class(TSBackTesting)

       //重写GetTradeOrder
      function GetTradeOrder(vEndT);override;
      begin
    { 用户给的比例是最终的市值占比
    现需求是,股票要占用资金的75%,并使期货市值与股票市值一致
    则,股票与期货,比出的比例是一致的。
    推算过程
         IF01  股票  现金
    资金占比例  x   75   y
    保证金比例  15   100  100
    市值比例   m   m    n
    则 m+m+n=1;
    由于,单个证券占资产净值比例为 (市值比例*保证金比例)/各股(市值比例*保证金比例)和
    则 股票资金占比=(m*100/100)/(m*15/100+m*100/100+n*100/100)=75/100
    即m/(m*15/100+m+1-2m)=75/100,解其方程得出m的值,即为目标市值配比
    }

        stocks:=getbk('上证50')[0:0];//取1个票可比查看对比结果,-这里可以改成多个股票
        fID:='IF01';
        lens:=length(stocks);
        gpZ:=75; //股票资金占用比例
        IFBZJ:=15;//期货保证金比例
        IFPB:=(gpZ/100/(1-IFBZJ/100*gpZ/100+gpZ/100))*100; //计算出期货与股票占总市值比例
        echo IFPB;
        IFPB:=int(IFPB*100)/100;//截取两位小数,而不四舍五入,防止比例总体偏大
        echo IFPB;
        t:=select thisrow as '代码',1 as '方向',IFPB/lens as '比例(%)',100 as '保证金比例(%)',
             0 as'开仓费率(%)',0 as '平仓费率(%)'
             from stocks end;
        len:=length(t);
        t[len,'代码']:=fID;
        t[len,'方向']:=1;
        t[len,'比例(%)']:=IFPB;
        t[len,'保证金比例(%)']:=IFBZJ;
        t[len,'开仓费率(%)']:=0; //费率设置为0,不考虑费用的情况进方便验证
        t[len,'平仓费率(%)']:=0;
        return t;
      end
    End;

    回测结果中,持仓市值对比(其中,初始资金为1000000):