楼主: sarah89323
16922 72

[问答] 跪求CKLS GMM法参数估计T_T [推广有奖]

11
sarah89323 发表于 2011-8-31 22:01:44
感谢大家的留言,以下是我写的用Nowman Gaussian Estimation做CKLS的matlab code, 但是结果运行不出来,错误显示,“??? Undefined function or method 'NEW' for input arguments of type 'char'.” 请教指点。我用的是fmincon做minimizing log likilihood value.

%Main program
function main()

opts=optimset( 'Display',             'notify', ...
                    'MaxIter',              1000,   ...
                    'MaxFunEvals',          4000,   ...
                    'LargeScale',           'off',  ...
                    'HessUpdate',           'bfgs', ...
                    'TolX',                 1e-8,   ...
                    'TolFun',               1e-11   ...
                       );   
% option settings for optimization algorithm

    load CKLSdata;
    n=length(X);
    dt=1/260;

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('CKLS_Calibration',ini_P,[],[],[],[],low_P,up_P,[],opts);
[P2,lnL2]=fmincon('Merton_Calibration',ini_P,A2,B,[],[],low_P,up_P,[],opts);
[P3,lnL3]=fmincon('Vasicek_Calibration',ini_P,A3,B,[],[],low_P,up_P,[],opts);
[P4,lnL4]=fmincon('CIR_Calibration',ini_P,A4,B,[],[],low_P,up_P,[],opts);
[P5,lnL5]=fmincon('Dothan_Calibration',ini_P,A5,B,[],[],low_P,up_P,[],opts);
[P6,lnL6]=fmincon('Brennan_Schwartz_Calibration',ini_P,A6,B,[],[],low_P,up_P,[],opts);

% P is parameters estimation
% lnL is minus maximized likelihood value

format long
disp(num2str([P1,lnL1],5));
disp(num2str([P2,lnL2],5));
disp(num2str([P3,lnL3],5));
disp(num2str([P4,lnL4],5));
disp(num2str([P5,lnL5],5));
disp(num2str([P6,lnL6],5));

end % end main program

function lnL1 = CKLS_Calibration(P,X) % The minus log likelihood function of CKLS model
   
    for i =2:n
        sum=0;
        v=zeros(n,1);
        v(i,1)=((P(3,1)^2)*X(i-1)^(2*P(4,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;
    lnL1=-0.5*sum;
    lnL1=-lnL1;%% minimizing minus log likelihood, which is equal to maximizing log
% likelihood
end


function lnL2 = Merton_Calibration(P,X) % The minus log likelihood function of Merton model
    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,X)% The minus log likelihood function of Vasicek model
    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,X) % The minus log likelihood function of CIR model
    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,X) % The minus log likelihood function of Dothan model
    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,X) % The minus log likelihood function of BS model
    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

12
epoh 发表于 2011-8-31 23:15:39

先改一个供你参考,

结果跟ini_P息息相关.

%%%%%%%%%%%
load ckls.dat
data=ckls;
dt=1/12;
% option settings for optimization algorithm
opts=optimset( 'Display',             'notify', ...
                    'MaxIter',              1000,   ...
                    'MaxFunEvals',          4000,   ...
                    '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
[P1,lnL1]=fmincon(@(P)CKLS_Calibration(P,data,dt),ini_P,[],[],[],[],low_P,up_P,[],opts)
P1 =

    0.3766
    0.0013
    0.9054
   -0.1675


lnL1 =

   -3.6264

%%%%%%%%
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

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
ywh19860616 + 1 + 1 + 1 热心助人

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

13
sarah89323 发表于 2011-8-31 23:43:52
epoh 发表于 2011-8-31 23:15
先改一个供你参考,结果跟ini_P息息相关.%%%%%%%%%%%
load ckls.dat
data=ckls;
THXS!!!!!epoh!!!!
I LOVE YOU SOOOOOOO MUCH!!!!!!
Yeah, i got the parameters for CKLS, which turns out to be nearly the same as what i have done using Excel solver.
P1 =

   -0.1253
   -0.3716
    4.3992
    3.5434


lnL1 =

  -12.1230

I will do several others in a moment and will let you know how its going. Thxs again!!
U r such a nice person and wish you all the best!:)

14
sarah89323 发表于 2011-9-1 00:28:10
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


15
epoh 发表于 2011-9-1 13:33:10

更改如下:

1.我把数据名称data改回你原来的X,以免部分没更正到

    6 log likelihood function.rar (2.32 KB)

2.似乎不需linear inequalities A*x =< B,

  我改依Nowman Ppaper page 4/13,Table 1

  照不同模型分别设置 lower &upper bound

%%%%%%%%%%%%
load ckls.dat
data=ckls(1:(end-1),3);
X=data/100;
dt=1/12;
% option settings for optimization algorithm
opts=optimset( 'Display',             'notify', ...
                    'MaxIter',              1000,   ...
                    'MaxFunEvals',          4000,   ...
                    'LargeScale',           'off',  ...
                    'HessUpdate',           'bfgs', ...
                    'TolX',                 1e-8,   ...
                    'TolFun',               1e-11   ...
                       );   

ini_P=rand(4,1);%initial parameters [alpha,beta,sigma,gamma] as a vector.
%ini_P=[0.1656 ;   0.6020;    0.2630 ;   0.65410];

low_P=-100*ones(4,1);       %lower bounds of parameters
up_P=100*ones(4,1);         %upper bounds of parameters
low_P2=[-400;0;-400;0];     % parameter restriction for Merton
up_P2=[400;0;400;0];
low_P3=[-400;-400;-400;0];  %parameter restriction for Vasicek
up_P3=[400;400;400;0];
low_P4=[-400;-400;-400;0.5];%parameter restriction for CIR
up_P4=[400;400;400;0.5];
low_P5=[0;0;-400;1];        %parameter restriction for Dothan
up_P5=[0;0;400;1];
low_P6=[-400;-400;-400;1];  %parameter restriction for Brennan and Schwartz
up_P6=[400;400;400;1];

[P1,lnL1]=fmincon(@(P)CKLS_Calibration(P,X,dt),ini_P,[],[],[],[],low_P,up_P,[],opts)
[P2,lnL2]=fmincon(@(P)Merton_Calibration(P,X,dt),ini_P,[],[],[],[],low_P2,up_P2,[],opts)
[P3,lnL3]=fmincon(@(P)Vasicek_Calibration(P,X,dt),ini_P,[],[],[],[],low_P3,up_P3,[],opts)
[P4,lnL4]=fmincon(@(P)CIR_Calibration(P,X,dt),ini_P,[],[],[],[],low_P4,up_P4,[],opts)
[P5,lnL5]=fmincon(@(P)Dothan_Calibration(P,X,dt),ini_P,[],[],[],[],low_P5,up_P5,[],opts)
[P6,lnL6]=fmincon(@(P)Brennan_Schwartz_Calibration(P,X,dt),ini_P,[],[],[],[],low_P6,up_P6,[],opts)


P1 =
    0.0346
   -0.5488
    0.6964
    3.5288
lnL1 =
  -10.6499


P2 =
   -0.0078
         0
    0.0001
         0
lnL2 =
  -10.3478

P3 =
   -0.0515
    0.5664
   -0.0001
         0
lnL3 =
  -10.3335

P4 =

   -0.0329
    0.3256
    0.0001
    0.5000
lnL4 =
  -11.9802

P5 =
         0
         0
    0.4314
    1.0000
lnL5 =

   NaN

P6 =
    0.1451
   -1.9804
   -0.0071
    1.0000
lnL6 =
   -8.8241

16
epoh 发表于 2011-9-1 14:55:00

我把revised后的GMM library传上来.

   GMM_Libraries.rar (496.62 KB)

内有三个文件夹 gmm,minz,Utilities

你运行时rows(ckls)出错

不是缺Utilities,就是没设好path

1.安装时,很重要!!记得点选

  file\set path\add with subfolders

2.我填加了两个文件ckls_info.m,ckls_prep.m

  方便你单独做模型时不会出错

3.执行文件:ckls_d

4.亦可单独执行如下:

5.请注意看gout=gmm(b0,gmmopt,dr,r,Z);

  gout包含了你所有需要的数据.

%  gmmout.f     function value
%  gmmout.J     chi-square stat for model fit
%  gmmout.p     p-value for model fit
%  gmmout.b     coefficient estimates
%  gmmout.se    standard errors for each parameter
%  gmmout.bcov  cov matrix of parameter estimates
%  gmmout.t     t-stats for parms = null
%  gmmout.pb    p-values for coefficients
%  gmmout.m     moments
%  gmmout.mse   standard errors of moments
%  gmmout.varm  covariance matrix of moments
%  gmmout.mt    t-stats for moments = 0
%  gmmout.mp    p-vals for moments
%  gmmout.nobs  number of observations
%  gmmout.north number of orthogonality conditions
%  gmmout.neq   number of equations
%  gmmout.nz    number of instruments
%  gmmout.nvar  number of parameters
%  gmmout.df    degrees of freedom for model

........

........

% --- Initializations ----------------------------------------------------
load ckls.dat    % Load Data
T = rows(ckls)-1;   % nb. obs.
r = ckls(1:T,3)/100;   % Rt
dr = ckls(2:end,3)/100-r;  % Rt+1 - Rt
Z = [ones(T,1) r];   % Instruments
b0=[mean(r); 0; 12*var(dr)/var(r); .5]; % Parameter Starting Values
null = [0 0 0 .5]';   % Null hypothesis
vname = strvcat('alpha','beta','sigma^2','gamma'); % Names


% --- Print Summary Stats -----------------------------------------------
in.rnames = strvcat('Mean','Std',[repmat('Rho_',6,1) int2str([1:6]')]);
in.cnames = strvcat('r(t)','r(t)-r(t-1)');
mprint1([mean([r dr]); std([r dr]); autocorr([r dr],6)],in);

% --- GMM Options -------------------------------------------------------
gmmopt.W0='Z';    % Initial Weighting Matrix
gmmopt.infoz.hess = 'gn';  % Search Direction
gmmopt.infoz.momt='ckls_dm';  % Moment Conditions
gmmopt.infoz.jake='ckls_dj';  % Jacobian of Moments
gmmopt.lags=7;       % Lags in weighting matrix
gmmopt.vname = vname;
gmmopt.null = null;
gmmopt.infoz.parms = [NaN NaN NaN NaN]'; % Special field used by ckls_dm
gmmopt.infoz
disp('These are the gmmopt and infoz structures.');
disp('Strike a key to Start Estimation.');

% --- Estimate the Full model with gmm() -------------------------------
gout=gmm(b0,gmmopt,dr,r,Z);
condvar0 = ckls_info(gout,repmat(NaN,4,1),vname,dr,r);
pause;


% --- Estimate the CIR model with gmm() --------------------------------
parms = [NaN NaN NaN .5]';  % Specify Restriction
[bin, opt] = ckls_prep(parms,b0,gmmopt,null,vname);
gout=gmm(bin,opt,dr,r,Z);
condvar = ckls_info(gout,parms,vname,dr,r);

% --- Estimate Nine Nested Models -------------------------------------
gmmopt.prt = 1;
gmmopt.infoz.prt = 1
;
gmmopt.plot = 0;
Plist = strvcat('Full','Merton','Vasicek','CIR SR','Dothan','GBM',...
  'Brennan-Schwarz','CIR VR','CEV');
Parms = repmat(NaN,9,4);
out1 = Parms;
out2 = out1;
out3 = repmat(NaN,9,5);
Parms(2,[2 4]) = [0 0];  % Merton
Parms(3,4) = 0;   % Vasicek
Parms(4,4) = 0.5;  % CIR SR
Parms(5,[1 2 4]) = [0 0 1]; % Dothan
Parms(6,[1 4]) = [0 1];  % GBM
Parms(7,4) = 1;   % Brennan-Schwartz
Parms(8,[1 2 4]) = [0 0 1.5]; % CIR VR
Parms(9,1) = 0;   % CEV

for i = 1:rows(Parms)
  fprintf(1,'%s\n',Plist(i,:));
  [bin, opt] = ckls_prep(Parms(i,:)',b0,gmmopt,null,vname);
  gout=gmm(bin,opt,dr,r,Z);
  [condvar,temp] = ckls_info(gout,Parms(i,:)',vname,dr,r);
  out1(i,:) = temp(1,1:4);
  out2(i,:) = temp(2,1:4);
  out3(i,:) = [temp(1,5) temp(2,5) temp(1,6:end)];
end

rnames = Plist;
fprintf('\t\t  alpha\t\t  beta\t\t Sigma^2\t gamma\n');
for i = 1:rows(Plist)
  fprintf('%s\t',rnames(i,:));
  fprintf(' %7.4f \t %7.4f \t %7.4f \t %7.4f \n',out1(i,:));
  s = sprintf('(%7.4f)\t(%7.4f)\t(%7.4f)\t(%7.4f)\n',out2(i,:));
  s = strrep(s,'(    NaN)','         ');
  fprintf('\t\t%s\n',s);
end
in.rnames = rnames;
in.cnames = strvcat('J_T','p-value','df','R^2_1','R^2_2');
in.fmt = strvcat('%7.4f','%7.4f','%1d','%7.4f','%7.4f');
mprint1(out3,in);

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
esir + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

17
zhangtao 发表于 2011-9-1 15:21:48
epoh 发表于 2011-8-31 18:35
哈哈zhangtao兄也有兴趣.GMM Libraries for Matlab:主网站目前已不提供下载 http://www.feweb.vu.nl/econom ...
epoh老师,您好!
     为什么在我的matlab7上运行会提示以下错误:
>> ckls_d
??? Error using ==> autocorr
Input 'Series' must be a vector.

Error in ==> ckls_d at 42
mprint1([mean([r dr]); std([r dr]); autocorr([r dr],6)],in);

>>
数学好就是要天天学

18
epoh 发表于 2011-9-1 15:55:40

zhangtao兄:

??? Error using ==> autocorr

表示你的程序抓到garch toolbox的autocorr()

而非GMM\ Utilities\ autocorr()

请依16楼说明安装.

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
zhangtao + 5 + 5 + 5 向epoh大师致以最崇高的敬意和感谢!

总评分: 学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

19
epoh 发表于 2011-9-1 20:37:34
希望我的直觉是错的
总觉得LLF太小.
就CIR model而言
为何没见到P(4,1)=0.5
function lnL4 = CIR_Calibration(P,X,dt) % The minus log likelihood function of CIR model
    n=length(X);
    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

20
sarah89323 发表于 2011-9-1 21:08:14
epoh 发表于 2011-9-1 20:37
希望我的直觉是错的
总觉得LLF太小.
就CIR model而言
epoh:

我的data
CKLSdata.rar (8.5 KB) 本附件包括:
  • CKLSdata.dat


我觉得parameters restriction 还是有问题, 因为Vasicek, CIR, BS中应该有alpha, sigma >0, beta<0
Dothan model 原先我也是用的beta=0, 但是Prof Brigo认为应该是dr=beta*dt+sigma*dWt. 所以我是用的他建议的那个model, which is equal to GBM.
对于Dothan和Merton, 参数都应该>0.

当我把main code中的parameters restriction改成:
low_P=-100*ones(4,1);       %lower bounds of parameters
up_P=100*ones(4,1);         %upper bounds of parameters
low_P2=[0;0;0;0];     % parameter restriction for Merton
up_P2=[400;0;400;0];
low_P3=[0;-400;0;0];  %parameter restriction for Vasicek
up_P3=[400;0;400;0];
low_P4=[0;-400;0;0.5];%parameter restriction for CIR
up_P4=[400;0;400;0.5];
low_P5=[0;0;0;1];        %parameter restriction for Dothan
up_P5=[0;400;400;1];
low_P6=[0;-400;0;1];  %parameter restriction for Brennan and Schwartz
up_P6=[400;0;400;1];

带入附近中的data,结果是非常的奇怪
P1 =

   -0.1199
    0.6458
    7.6813
    3.5770


lnL1 =

  -11.7233

P2 =

         0
         0
    0.3005
         0


lnL2 =

   -3.6362

P3 =

    0.9575
         0
    0.1576
         0


lnL3 =

   NaN
P4 =

    0.9575
         0
    0.1576
    0.5000


lnL4 =

   NaN
P5 =

         0
         0
    6.6331
    1.0000


lnL5 =

   NaN
P6 =

    0.9575
         0
    0.1576
    1.0000


lnL6 =

   NaN
这个结果显然是有错误的。 你觉得问题在哪? 难道Vasicek,CIR 那些模型也不需要给参数大于或者小于0的限制么

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-3 02:51