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; 

    返回结果:

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