策略案例-跨品种策略-基于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