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;
返回结果:
如果只保留第一个非线性不等式约束,则结果为: