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):