epoh 发表于 2011-8-31 23:15 
先改一个供你参考,结果跟ini_P息息相关.%%%%%%%%%%%
load ckls.dat
data=ckls;
epoh:
Aftering changing it like what u wrote, the first one works, but others all get stuck...
Errors show:??? Error using ==> optimfcnchk at 300
NONLCON must be a function.
Error in ==> fmincon at 382
confcn = optimfcnchk(NONLCON,'fmincon',length(varargin),funValCheck,flags.gradconst,false,true);
Error in ==> CKLS at 25
[P1,lnL1]=fmincon(@(P)CKLS_Calibration(P,data,dt),ini_P,[],[],[],[],low_P,up_P,opts);
Hope to hear from you asap~~
Following given is my modified code:
function main()
load CKLSdata.dat
data=CKLSdata;
dt=1/260;
% option settings for optimization algorithm
opts=optimset( 'Display', 'notify', ...
'MaxIter', 1000, ...
'MaxFunEvals', 10000, ...
'LargeScale', 'off', ...
'HessUpdate', 'bfgs', ...
'TolX', 1e-8, ...
'TolFun', 1e-11 ...
);
ini_P=rand(4,1);%initial parameters [alpha,beta,sigma,gamma] as a vector.
low_P=-100*ones(4,1);%lower bounds of parameters
up_P=100*ones(4,1);%upper bounds of parameters
A2=[-1,0,0,0;0,0,0,0;0,0,-1,0;0,0,0,0];% parameter restriction for Merton
A3=[-1,0,0,0;0,1,0,0;0,0,-1,0;0,0,0,0];%parameter restriction for Vasicek
A4=[-1,0,0,0;0,1,0,0;0,0,-1,0;0,0,0,0];%parameter restriction for CIR
A5=[0,0,0,0;0,-1,0,0;0,0,-1,0;0,0,0,0];%parameter restriction for Dothan
A6=[-1,0,0,0;0,1,0,0;0,0,-1,0;0,0,0,0];%parameter restriction for Brennan and Schwartz
B=[0,0,0,0];
[P1,lnL1]=fmincon(@(P)CKLS_Calibration(P,data,dt),ini_P,[],[],[],[],low_P,up_P,opts);
[P2,lnL2]=fmincon(@(P)Merton_Calibration(P,data,dt),ini_P,[],[],[],[],low_P,up_P,[],opts);
[P3,lnL3]=fmincon(@(P)Vasicek_Calibration(P,data,dt),ini_P,[],[],[],[],low_P,up_P,[],opts);
[P4,lnL4]=fmincon(@(P)CIR_Calibration(P,data,dt),ini_P,[],[],[],[],low_P,up_P,[],opts);
[P5,lnL5]=fmincon(@(P)Dothan_Calibration(P,data,dt),ini_P,[],[],[],[],low_P,up_P,[],opts);
[P6,lnL6]=fmincon(@(P)Brennan_Schwartz_Calibration(P,data,dt),ini_P,[],[],[],[],low_P,up_P,[],opts);
end
%%%%%%%%
function lnL1 = CKLS_Calibration(P,data,dt) % The minus log likelihood function of CKLS
n=length(data);
for i =2:n
sum=0;
v=zeros(n,1);
v(i,1)=((P(3)^2)*data(i-1)^(2*P(4))*(exp(2*P(2)*dt)-1))/(2*P(2));
ita=zeros(n,1);
ita(i,1)=data(i)-exp(P(2)*dt)*data(i-1)-(P(1)*(exp(P(2)*dt)-1))/P(2);
sum=sum+log(v(i,1)+(ita(i,1)^2)/v(i,1));
end;
lnL1=-0.5*sum;
lnL1=-lnL1;%% minimizing minus log likelihood, which is equal to maximizing log
% likelihood
end
function lnL2 = Merton_Calibration(P,data,dt) % The minus log likelihood function of Merton model
n=length(data);
for i =2:n
sum=0;
v=zeros(n,1);
v(i,1)=(P(3,1)^2)*dt;
ita=zeros(n,1);
ita(i,1)=X(i)-X(i-1)-P(1,1)*dt;
sum=sum+log(v(i,1)+(ita(i,1)^2)/v(i,1));
end;
lnL2=-0.5*sum;
lnL2=-lnL2;%% minimizing minus log likelihood, which is equal to maximizing log
% likelihood
end
function lnL3 = Vasicek_Calibration(P,data,dt)% The minus log likelihood function of Vasicek model
n=length(data);
for i =2:n
sum=0;
v=zeros(n,1);
v(i,1)=((P(3,1)^2)*(exp(2*P(2,1)*dt)-1))/(2*P(2,1));
ita=zeros(n,1);
ita(i,1)=X(i)-exp(P(2,1)*dt)*X(i-1)-(P(1,1)*(exp(P(2,1)*dt)-1))/P(2,1);
sum=sum+log(v(i,1)+(ita(i,1)^2)/v(i,1));
end;
lnL3=-0.5*sum;
lnL3=-lnL3;%% minimizing minus log likelihood, which is equal to maximizing log
% likelihood
end
function lnL4 = CIR_Calibration(P,data,dt) % The minus log likelihood function of CIR model
n=length(data);
for i =2:n
sum=0;
v=zeros(n,1);
v(i,1)=((P(3,1)^2)*X(i-1)*(exp(2*P(2,1)*dt)-1))/(2*P(2,1));
ita=zeros(n,1);
ita(i,1)=X(i)-exp(P(2,1)*dt)*X(i-1)-(P(1,1)*(exp(P(2,1)*dt)-1))/P(2,1);
sum=sum+log(v(i,1)+(ita(i,1)^2)/v(i,1));
end;
lnL4=-0.5*sum;
lnL4=-lnL4;%% minimizing minus log likelihood, which is equal to maximizing log
% likelihood
end
function lnL5 = Dothan_Calibration(P,data,dt) % The minus log likelihood function of Dothan model
n=length(data);
for i =2:n
sum=0;
v=zeros(n,1);
v(i,1)=((P(3,1)^2)*(X(i-1)^2)*(exp(2*P(2,1)*dt)-1))/(2*P(2,1));
ita=zeros(n,1);
ita(i,1)=X(i)-exp(P(2,1)*dt)*X(i-1);
sum=sum+log(v(i,1)+(ita(i,1)^2)/v(i,1));
end;
lnL5=-0.5*sum;
lnL5=-lnL5;%% minimizing minus log likelihood, which is equal to maximizing log
% likelihood
end
function lnL6 = Brennan_Schwartz_Calibration(P,data,dt) % The minus log likelihood function of BS model
n=length(data);
for i =2:n
sum=0;
v=zeros(n,1);
v(i,1)=((P(3,1)^2)*(X(i-1)^2)*(exp(2*P(2,1)*dt)-1))/(2*P(2,1));
ita=zeros(n,1);
ita(i,1)=X(i)-exp(P(2,1)*dt)*X(i-1)-(P(1,1)*(exp(P(2,1)*dt)-1))/P(2,1);
sum=sum+log(v(i,1)+(ita(i,1)^2)/v(i,1));
end;
lnL6=-0.5*sum;
lnL6=-lnL6;%% minimizing minus log likelihood, which is equal to maximizing log
% likelihood
end