alittlecom 2021-11-24 14:03 采纳率: 100%
浏览 165
已结题

求各位matlab的能手解答,为什么我这个输出的值全是0呢?

问题遇到的现象和发生背景

我迭代计算Vt和σ,还想计算DD和P的值,但是DD和P的值输出全为0

问题相关代码,请勿粘贴截图
a = importdata('./1.csv');
codes=a.data(:,1);
Ts = a.data(:,2);
rs = a.data(:,3);
EquityThetas = a.data(:,4);
Bs = a.data(:,5);
Es = a.data(:,6);
ret_Vts = zeros(1,length(Ts))';
ret_sigmas = zeros(1,length(Ts))';
ret_DDs = zeros(1,length(Ts))';
ret_Ps = zeros(1,length(Ts))';
for i=1:1:length(Ts)
    T=Ts(i)/12;
    r=rs(i);
    EquityTheta=EquityThetas(i);
    B=Bs(i);
    E=Es(i);

    [Vt,sigma,DDs,Ps]=iteration_fun(r,T,EquityTheta,E,B);
    ret_Vts(i)=Vt;
    ret_sigmas(i)=sigma;
    ret_DDs(i)=DDs;
    ret_Ps(i) = Ps;
    
    i
end
function [Vt,sigma_a,DDs,Ps]=iteration_fun(r,T,sigma_e,E,B)
    max_iter=1000;
    % 因为资产价值和股权价值的值都太大了,所以这里设置的变量为资产价值(V)除以负债(B)
    % 设置最多迭代1000次?
    VToBs=zeros(1,max_iter);
    sigma=zeros(1,max_iter);   %迭代次数的结果
    
    VToBs(1)=1;
    sigma(1)=1;  %估值初值
    
    iter=1;
    while iter<=max_iter
        % 通过V和sigma 计算d1
        d1=(log(VToBs(iter))+(r+sigma(iter)^2/2)*T)/(sigma(iter)*sqrt(T));
        % d2计算,得到DD,以及P
        d2=d1-sigma(iter)*sqrt(T); 
        DD=d2;
        P=normcdf(-d2);
        % 通过d1 d2计算新的V
        V=(E+B*exp(-r*T)*normcdf(d2))/normcdf(d1);
        % 保存新的V和sigma
        VToBs(iter+1)=V/B;
        sigma(iter+1)=sigma_e*E/V/normcdf(d1);
        DD(iter+1)=d2;
        P(iter+1)=normcdf(-d2);
        
        %当sigma值收敛了就停止迭代?
        if abs(sigma(iter+1)-sigma(iter))<=1e-6
           break 
        end

        iter=iter+1;
    end
    
     % 输出sigma_a和Vt
    sigma_a=sigma(iter);
    Vt = VToBs(iter)*B;
    DDs = DD(iter);
    Ps = P(iter);
end

运行结果及报错内容

img

img

img

我想要达到的结果
   要怎样才能输出有值呢?是我哪里出错了吗?
  • 写回答

1条回答 默认 最新

  • 技术专家团-Joel 2021-11-24 15:05
    关注

    你好,你的iteration_fun.m的

    DD=d2;
    P=normcdf(-d2);
    

    跟后面28行的

    DD(iter+1)=d2;
    P(iter+1)=normcdf(-d2);
    

    重复了,删除DD=d2; P=normcdf(-d2);即可
    修改后如下:

    function [Vt,sigma_a,DDs,Ps]=iteration_fun(r,T,sigma_e,E,B)
        max_iter=1000;
        % 因为资产价值和股权价值的值都太大了,所以这里设置的变量为资产价值(V)除以负债(B)
        % 设置最多迭代1000次?
        VToBs=zeros(1,max_iter);
        sigma=zeros(1,max_iter); %迭代次数的结果
        DD=zeros(1,max_iter);
        P=zeros(1,max_iter);
        
        VToBs(1)=1;
        sigma(1)=1;  %估值初值
        DD(1)=1;
        P(1)=1;
        
        iter=1;
        while iter<=max_iter
            % 通过V和sigma 计算d1
            d1=(log(VToBs(iter))+(r+sigma(iter)^2/2)*T)/(sigma(iter)*sqrt(T));
            % d2计算,得到DD,以及P
            d2=d1-sigma(iter)*sqrt(T); 
            % DD=d2; % 我这里注释掉了
            % P=normcdf(-d2);
            % 通过d1 d2计算新的V
            V=(E+B*exp(-r*T)*normcdf(d2))/normcdf(d1);
            % 保存新的V和sigma
            VToBs(iter+1)=V/B;
            sigma(iter+1)=sigma_e*E/V/normcdf(d1);
            DD(iter+1)=d2;
            P(iter+1)=normcdf(-d2);
            
            %当sigma值收敛了就停止迭代?
            if abs(sigma(iter+1)-sigma(iter))<=1e-6
               break 
            end
    
            iter=iter+1;
        end
        
         % 输出sigma_a和Vt
        sigma_a=sigma(iter);
        Vt = VToBs(iter)*B;
        DDs = DD(iter);
        Ps = P(iter);
    end
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    1人已打赏

报告相同问题?

问题事件

  • 系统已结题 12月8日
  • 已采纳回答 11月30日
  • 创建了问题 11月24日

悬赏问题

  • ¥15 Centos7 / PETGEM
  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗