|
- function [beta,stderror,V,it,Chi_sta,Pvalue]=gmmestimation(moment,be0,Y,X,Z,number,K)
- %input:
- %moment: moment conditions function defined by users
- %be0: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:
- %beta:parameters estimated
- %stderror:standard errors
- %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
- nlag=0;%lag lenth
- W(:,:,1)=eye(K);
- [be(:,1),fv(:,1)]=fminsearch(moment,be0,[],1,Y,X,Z,W(:,:,1));
- % update weight matrix and find optimal solution
- for i=2:number
- mom=feval(moment,be(:,i-1),2,Y,X,Z,W(:,:,i-1));
- W(:,:,i)=gmmweightmatrix(mom,nlag);
- [be(:,i),fv(:,i)]=fminsearch(moment,be(:,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
- beta=be(:,it);% optimal bemeter
- f0=feval(moment,beta,3,Y,X,Z,W(:,:,it));% optimal function value
- % find covariance matrix of estimated parameter vector, using numerical method
- for j=1:length(be0)
- a=zeros(length(be0),1);
- eps=max(beta(j)*1e-6,1e-5);
- a(j)=eps;
- M(:,j)=(feval(moment,beta+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=beta./(stderror);
- Chi_sta=size(Y,1)*fv(it);
- Pvalue=1-chi2cdf(Chi_sta,K-length(be0));
-
- %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);
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%moment conditions
- function f=linearmodel01(be,num,Y,X,Z,W)
- [T,q]=size(Y);
- alpha=be(1);beta=be(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
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%moment conditions
- function f=linearmodel02(be,num,Y,X,Z,W)
- [T,q]=size(Y);
- beta=be(1);
- eta=[Y-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
复制代码 上面是用(Generalized Method of Moments) 同时估计6个CAPM模型(6个 α's 和 6个β's) 及它们共同的market excess return(γ)的matlab程序,由于空间限制,最后一部分程序在下面第一个回帖,程序没有问题,求修改成一份或两份(最好两份,每份程序悬赏500金币,可追加悬赏)跟上面程序看起来不大一样的程序(比如修改一下函数的名字,变量的名称,顺序,matlab程序表达方式,甚至是逻辑思路比如把(a-b)/a趋于无限小改成a-b趋于无限小。。。),但最后求出来的结果要一样。
|