FAQ > 金融建模 > 建模问题 > 金融框架

Q:如何在使用组合优化框架(TSPortfolioOptimizer)时设置多个非线性不等式约束    

  • 如何在使用组合优化框架(TSPortfolioOptimizer)时设置多个非线性不等式约束
    1.属性FConType设置为-1,表示使用自定义约束 
    2.重写GetCon(w)函数,返回数组中的第一个元素是非线性不等式约束。第一个元素以数组的方式给出,增加数组内的值即为增加非线性不等式约束条件。 

    例子: 
     obj:=CreateObject("TSPO_UserDefinedObj"); 
     obj.FBegT:=20190101T; 
     obj.FEndT:=20191231T; 
     obj.FIndexId:="SH000300"; 
     obj.FPortfolioData:=Array(("代码":"SH000300"),("代码":"SH000012")); 
     obj.FConType:=-1;  //自定义约束 
     obj.FObjType:=-1; 
     Ret:=obj.PortfolioOptimize(); 
     Return obj.GetPortfolioData(); 

    type TSPO_UserDefinedObj = class(TSPortfolioOptimizer) 
     public 
     Function GetObj(w);Override; 
     Begin 
      //预期收益率最大 
      return -mean(fxdata:*`w)[0]; 
     End 
     function GetCon(w);override; 
     begin 
      eq:=Array();//非线性等式约束 
      neq:=Array();//非线性不等式约束 
      //权重和等于 1 
      eq[0]:=sum(w) - 1; 
      //非线性不等式约束1:年化收益率<=10%
      neq[0]:=mean((FXdata:*`w)[:,0])-10/250/100; 
      //非线性不等式约束2:收益率标准差<=0.2% 
      neq[1]:=StdDev((FXdata:*`w)[:,0])-0.002; 
      Return Array(neq,eq); 
     end 
    End;

    返回结果:

    如果只保留第一个非线性不等式约束,则结果为: