全部版块 我的主页
论坛 金融投资论坛 六区 金融学(理论版)
806 0
2014-12-19
特别傻瓜了一个问题~
卡尔曼滤波的状态向量作图,请问怎么做啊???

function bestpara = kalmanfilterfun700()
    retdata=load('f:\newratedata.txt','-ascii');
    Y=retdata';
    para0=[0.0573,0.0262,0.0163,-0.7968,-2.4818,-5.5475,-6.7156,-8.1745,-13.0229,-65.8941,-8.1000,-7.0900,-0.8566,-3.4768];
    [xv,fv]=fminsearch(@(para) subfun(para),para0,optimset('MaxFunEvals',50000,'MaxIter',50000));
    bestpara=xv;
    disp(fv);
    function lf=subfun(para)
        delta0=para(1);
        delta1=para(2);
        delta2=para(3);
        lambda1=exp(para(4));
        lambda2=exp(para(5));
        sigma=[1:7];
        for i=1:7
            sigma(i)=exp(para(5+i));
        end
        q1=exp(para(13))+0.0001;
        q2=exp(para(14))+0.0001;
        tau=[1,2,3,4,5,7,10];
        A=zeros(1,7);
        for i=1:7
            A(1,i)=value2(delta1,lambda1,tau(i))*(-q1/lambda1)+value2(delta2,lambda2,tau(i))*(-q2/lambda2)+delta0+value1(delta1,lambda1,tau(i))+value1(delta2,lambda2,tau(i));
        end
        H=zeros(2,7);
        for i=1:7
            H(1,i)=value2(delta1,lambda1,tau(i));
            H(2,i)=value2(delta2,lambda2,tau(i));
        end
        R=zeros(7,7);
        for i=1:7
            R(i,i)=sigma(i)^2;
        end
        F=zeros(2,2);
        F(1,1)=exp(-1*lambda1/12);
        F(2,2)=exp(-1*lambda2/12);
        Q=zeros(2,2);
        Q(1,1)=(1-exp(-2*lambda1/12))/(2*lambda1);
        Q(2,2)=(1-exp(-2*lambda2/12))/(2*lambda2);
        LnL=0;
        St=zeros(2,1);
        vp=inv(eye(4)-kron(F,F))*reshape(Q,4,1);
        Pt=reshape(vp,2,2);
        obs=length(Y(1,:));
        for t=1:obs
            Eyt=A'+H'*St;
            yt=Y(:,t);
            res=yt-Eyt;
            Zt=H'*Pt*H+R;
            Lt=-0.5*log(det(Zt))-0.5*res'*inv(Zt)*res;
            LnL=LnL+Lt;
            Kt=F*Pt*H*inv(Zt);
            St=F*St+Kt*res;
            Pt=F*(Pt-Pt*H*inv(Zt)*H'*Pt)*F'+Q;
        end
        lf=-1*LnL;
    end
    function variablevalue=value1(delta,lambda,tau)
        variablevalue=-(delta^2)*(tau-exp(-2*lambda*tau)/(2*lambda)+1/(2*lambda)+2*exp(-1*lambda*tau)/lambda-2/lambda)/(2*(lambda^2)*tau);
    end
    function variablevalue=value2(delta,lambda,tau)
        variablevalue=delta*(1-exp(-1*lambda*tau))/(lambda*tau);
    end
end

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群