fmincon error nonlcon must be a function

조회 수: 26 (최근 30일)
DrLoz
DrLoz 2018년 10월 8일
답변: Walter Roberson 2018년 10월 9일
I get the following error when using fmincon:
NONLCON must be a function.
Error in fmincon (line 409)
confcn = optimfcnchk(NONLCON,'fmincon',length(varargin),funValCheck,flags.gradconst,false,true);
This is the code I am using:
nAssets = size(ExpCovariance,2);
%Constraints and data for fmincon
options = optimoptions(@fmincon,'Algorithm','interior-point');
nFrontierPts = 20;
pWts = zeros(nFrontierPts, nAssets);
pExitFlag = zeros(nFrontierPts, 1);
StaticFXhedgeReturns = AssetReturns(t-59:t,1)+AssetReturns(t-59:t,2:7)*exp1';
StaticVol5y = std(StaticFXhedgeReturns)*sqrt(12);
StaticTE5y = std(AssetReturns(t-59:t,2:7)*exp1')*sqrt(12);
teCap=StaticTE5y;
covMat=cov(equRet(t-2-59:t-2),AssetReturns(t-59:t,2:7)*exp1')*12; %Covariance of exposure resulting from country specific hedging with equities
covCap=covMat(1,2);
iniWt = ones(1,nAssets).*(1/nAssets);
Aud6040ret = AssetReturns(t-x-59:t-x,1);
FXret_1 = AssetReturns(t-x-59:t-x,2:7);
equRet_1 = equRet(t-59-2:t-2);
%min variance portfolio
minVarWts = fmincon(@(pWts) -pWts*ExpCovariance'*pWts', iniWt, [], [], [], [],...
LowerBound', UpperBound',nonlconFr(pWts,StaticVol5y,teCap,Aud6040ret,FXret_1,equRet_1,covCap), options);
and this is the nonlcon function I am using:
function [c, ceq] = nonlconFr(w,volcap,teCap,Aud6040ret,FXret,equRet,covCap)
% nonlcon1: add TE constraint
% nonlcon2: add equity beta/correlation constraint
w = w(2:7)'; %Need extra line for frontier code
ret_w = Aud6040ret+FXret*w;
covMat=cov(equRet,FXret*w)*12;
%Inequality Constraints (Less than zero)
c(1) = std(ret_w)*sqrt(12) - volcap; %Vol to be less than 60/40 with country specific hedging strategy
c(2) = std(FXret*w)*sqrt(12) - teCap; %Tracking error to exogenous 60/40 asset allocation constraint
c(3) = covMat(1,2) - covCap; %Covariance of FX overlay to be less than covariance of FX exposure resulting from benchmark hedging strategy
%Equality Constraint
ceq = [];
end
I'm not sure what I've done wrong! Thanks!

채택된 답변

Walter Roberson
Walter Roberson 2018년 10월 9일
In your fmincon call start that parameter with @(pWts)
The @(pWts) you have for the first parameter to fmincon only applies to the first parameter.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Risk Management Toolbox에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by