Wind --- --- matlab GMM

This is statas it? https://blog.csdn.net/chachaness/article/details/80411857

In addition a statas achieve  https://blog.csdn.net/arlionn/article/details/89494130

python realization: https://blog.csdn.net/qq_38120760/article/details/83216812

The following,

function [paraest,t_sta,V,it,Chi_sta,Pvalue]=my_gmmestimation(moment,para0,Y,X,Z,number,K)
%This program is for GMM estimation
%input:
%moment:   moment conditions function defined by users
%para0:    initial value for estimated parameters
%Y,X:      data used to estimate parameters
%Z:        data for instrument variables
%number:   maximum convergence number when choosing optimal weighting matrix
%K:        number of moment conditions
%output:  
%para est: parameters estimated
%t_sta:    T statistics for each estimated parameter
%V:        covariance matrix for estimated parameters
%it:       number of iteration
%Chi_sta and Pvalue: overidentifying test, null hypothesis is moment
%conditions are feasible \\条件可变

example1


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%example1
%to estimate the following model:Y=alpha+beta*X+eta
%moment conditions:[E(eta);E(X*eta)]=0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear
kk=1000;
X=randn(kk,1);Y=1+2*X+randn(kk,1)/3;Z=[ones(kk,1),X];number=100;
para0=[0;1];
[paraest,t_sta,V]=gmmestimation('linearmodel01',para0,Y,X,Z,number,2)


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% moment conditions
function f=linearmodel01(para,num,Y,X,Z,W)
[T,q]=size(Y);
alpha=para(1);beta=para(2);
eta=[Y-(alpha+beta*X)];
for i=1:T
   m_t(i,:)=kron(eta(i,:),Z(i,:));
   end
m=mean(m_t)';
obj=m'*W*m;
if num==1
   f=obj;
   elseif num==2
   f=m_t;
   elseif num==3
   f=m;
   end

example2

%%%%%%%%%%%%%%%%%%%%%%%%%%%
%example2
%to estimate the following model:
%dr_t =(alpha+beta*r_t)*dt+sigma*r_t^(gamma)*dW_t,
%where W_t is a Brownian motion
%r_t is interest rate at time t, and dr_t=r_t-r_t-1=y_t,
%x_t=r_t-1,dW_t=sqrt(dt)*eta_t
%eta_t is a standard normal random variable,define y=[y_t],x=[x_t], x,y are colummn vectors
%rewrite the model: y=(alpha+beta*x)*dt+sigma*x^(gamma)*dW
%instrument variables:z=[1,x]
%moment conditions;
%kron([E(y-(alpha+beta*x)*dt);
%E(y-((alpha+beta*x)*dt)^2-sigma^2*x^(2*gamma)*dt)],z)=0
%kron(A,B) means Kroneker product of A and B


%%%%%%%%%%%%%%% moment function
function f=cklstest01(para,num,Y,X,Z,W)
[T,q]=size(Y);
alpha=para(1);beta=para(2);sigsq=para(3);gamma=para(4);
eta=[Y-(alpha+beta*X)/12,(Y-(alpha+beta*X)/12).^2-sigsq*X.^(2*gamma)/12];
for i=1:T
    m_t(i,:)=kron(eta(i,:),Z(i,:));
end
m=mean(m_t)';
obj=m'*W*m;
if num==1
    f=obj;
elseif num==2
   f=m_t;
elseif num==3
    f=m;
end
%%%%%%%%%%%%%%%%%

 

 


clear
x(1)=0.01;alpha=0.4;beta=-0.1;sigmasq=0.1;gamma=0.6;dt=1/12;
t=1:dt:50;
for i=1:length(t)
    x(i+1)=x(i)+(alpha+beta*x(i))*dt+sqrt(sigmasq)*x(i)^(gamma)*randn(1)*sqrt(dt);
end
Y=diff(x)';
X=x(1:end-1)';
Z=[ones(length(Y),1),X];
para0=[0.05;-0.6;0.5;1.6];number=20;moment='cklstest01';K=4;
[paraest,t_sta,V,it,Chi_sta,Pvalue]=gmmestimation(moment,para0,Y,X,Z,number,K)

 

%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  main code for GMM
nlag=round(size(Y,1)^(1/3));
W(:,:,1)=eye(K);
[para(:,1),fv(:,1)]=fminsearch(moment,para0,[],1,Y,X,Z,W(:,:,1));
% update weight matrix and find optimal solution 更新矩阵权重,发现优化解法
for i=2:number
mom=feval_r(moment,para(:,i-1),2,Y,X,Z,W(:,:,i-1));
W(:,:,i)=gmmweightmatrix(mom,nlag);
[para(:,i),fv(:,i)]=fminsearch(moment,para(:,i-1),[],1,Y,X,Z,W(:,:,i));
if abs(fv(:,i)-fv(:,i-1))/abs(fv(:,i-1))<1e-4|fv(i)<=1e-10
 break
end
end
it=i;
if it==number
   error('number of iteration exceeds defined maximum number')
else
   paraest=para(:,it);% optimal parameter
   f0=feval_r(moment,paraest,3,Y,X,Z,W(:,:,it));% optimal function value
% find covariance matrix of estimated parameter vector, using numerical method
   for j=1:length(para0)
       a=zeros(length(para0),1);
       eps=max(paraest(j)*1e-6,1e-5);
       a(j)=eps;
       M(:,j)=(feval_r(moment,paraest+a,3,Y,X,Z,W(:,:,it))-f0)/eps;
   end
end
V=pinv(M'*W(:,:,it)*M)/size(Y,1);
stderror=sqrt(diag(V));
t_sta=paraest./(stderror);
Chi_sta=size(Y,1)*fv(it);
Pvalue=1-chi2cdf(Chi_sta,K-length(para0));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 

 

%%%%%% find the weight matrix using Newey and West method
function W=gmmweightmatrix(mom,nlag)
q=size(mom,2);T=size(mom,1);
a2=zeros(q,q);a3=zeros(q,q);
for j=1:nlag
   a1=zeros(q,q);
   for i=1:(T-j)
      a1=mom(i+j,:)'*mom(i,:)+a1;
   end
   S(:,:,j)=1/T*a1;
   a2=(1-j/(nlag+1))*S(:,:,j)+a2;
   a3=(1-j/(nlag+1))*S(:,:,j)'+a3;
end
b1=zeros(q,q);
for i=1:T
   b1=mom(i,:)'*mom(i,:)+b1;
end
if nlag==0
   newS=b1*1/T;
else
   newS=a2+a3+b1*1/T;
end
W=pinv(newS);

 

 

 

 

 

 

 

 

 

Published 458 original articles · won praise 138 · views 240 000 +

Guess you like

Origin blog.csdn.net/zjc910997316/article/details/104176913