楼主: forex95
6168 12

[问答] 这么简单的程序,为什么结果为NaN呢? [推广有奖]

  • 2关注
  • 32粉丝

副教授

17%

还不是VIP/贵宾

-

威望
0
论坛币
5913 个
通用积分
8.7300
学术水平
18 点
热心指数
23 点
信用等级
14 点
经验
14239 点
帖子
418
精华
0
在线时间
775 小时
注册时间
2010-3-6
最后登录
2023-12-23

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
a=zeros(4,4);
D=[1096853709
1422513664
1080412570
1099330560
];
a(:,1)=D;
b=zeros(4,4);
E=[5482334
112522064
57679892
4537800
];
b(:,1)=E;
t1=log(b/a);
为什么t1为:
  NaN   NaN   NaN   NaN         
  NaN   NaN   NaN   NaN   
  NaN   NaN   NaN   NaN
  NaN   NaN   NaN   NaN   
请各位高手指点?
二维码

扫码加我 拉你入群

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

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

关键词:zeros eros zero 高手指点 ROS 程序

情绪只是时间的消耗品,所谓非理性行为就是对时间的量化。
沙发
far_faraway 发表于 2012-2-15 18:26:12 |只看作者 |坛友微信交流群
你别直接用矩阵相除,换成循环肯定没问题。

使用道具

藤椅
syslon 发表于 2012-2-15 18:34:25 |只看作者 |坛友微信交流群
矩阵奇异,不明白楼主为何这么做?两个矩阵的那么多元素为 0,相除就出问题了

使用道具

板凳
syslon 发表于 2012-2-15 18:34:48 |只看作者 |坛友微信交流群
可否告知这样做的目的?

使用道具

报纸
forex95 发表于 2012-2-17 14:00:41 |只看作者 |坛友微信交流群
far_faraway 发表于 2012-2-15 18:26
你别直接用矩阵相除,换成循环肯定没问题。
我就是在循环中使用的。可是我调试了下,第一次就遇到为nan的情况。不知道怎么回事
情绪只是时间的消耗品,所谓非理性行为就是对时间的量化。

使用道具

地板
forex95 发表于 2012-2-17 14:26:37 |只看作者 |坛友微信交流群
syslon 发表于 2012-2-15 18:34
可否告知这样做的目的?
就是算一下上市公司的信用风险。这是我全部的代码?可是结果都是NaN
function[Va,SigmaVa]=CalV(E,SigmaE,D,r,T)
a=zeros(8,8);
D=[
1096853709
1422513664
1080412570
1099330560
821720
676976
196840
37877619
];
a(:,1)=D;
b=zeros(8,8);
E=[
5482334
112522064
57679892
4537800
751520
1882103.375
285241.125
3833159
];
b(:,1)=E;
c=zeros(8,8);
SigmaE=[
0.401835787
0.543863954
0.609681884
0.741317746
0.917986928
0.931843334
1.004589468
1.02883818
];
c(:,1)=SigmaE;
%计算Va'SigmaVa
key=0;
r=0.0225;
T=1;
PI=4*atan(1);
Va=b;%va以E为迭代的初值
newVa=Va;
SigmaVa=c; %SigmaVa以SigmaE为迭代的初值
for k=1:10  %迭代SigmaVa
for j=1:10 %迭代Va
oldVa=newVa;
% Va=(E+D*exp(-r,T)*Nd2)/Ndl;
% SigmaVa=E*SigmaE/(E+D*exp(-r,T)*Nd2);
%t1=log(oldVa/a);
d1=(log(oldVa/a)+(r+(SigmaVa^2)/2)*T)/(SigmaVa*(T^(1/2)));
d2=d1-(SigmaVa*(T^(1/2)));
Nd1=normcdf(d1,0,1);
Nd2=normcdf(d2,0,1);
fV=oldVa*Nd1-a*exp(-r*T)*Nd2-b;
dfV=Nd1+exp(-d1*d1/2)/((2*PI*T)^0.5*SigmaVa)-a*exp(-r*T)*exp(-d2*d2/2)/((2*PI*T)^0.5*oldVa*SigmaVa);
if dfV==0
dfV
pause;
end
dV=-fV/dfV;
newVa=oldVa+dV;   %前后两次的值认为非常接近,则迭代成功
newVa
if newVa==0
oldVa
newVa
pause;
end
if(dV/newVa)<1e-7 & (dV/newVa)>-1e-7
break;
end
end
Va=newVa;
d1=(log(Va/a)+(r+(SigmaVa^2)/2)*T)/(SigmaVa*(T^(1/2)));
d2=d1-(SigmaVa*(T^(1/2)));
Nd1=normcdf(d1,0,1);
Nd2=normcdf(d2,0,1);  %方程右边与左边的比值
diff=(Va*Nd1-a*exp(-r*T)*Nd2)/b;
if diff<1-1e-5 | diff>1+1e-5
assert('迭代出现错误'); %迭代出现错误
else
key=key+1;
end
newSigmaVa=b*c/(b+a*exp(-r*T)*Nd2);
if((SigmaVa-newSigmaVa)/newSigmaVa)<1e-5 & ((SigmaVa-newSigmaVa)/newSigmaVa)>(-1e-5)
break;
key=key+1;
else
SigmaVa=newSigmaVa;
end
end
if key==2
%else
% Va=一l:
% SigmaVa=-1:
end
情绪只是时间的消耗品,所谓非理性行为就是对时间的量化。

使用道具

7
syslon 发表于 2012-2-18 12:47:29 |只看作者 |坛友微信交流群
b-s公式倒是明白,但是没用来计算过 credit risk,楼主的程序我给帮忙改了改,不知道是不是楼主的意思了
function[Va,SigmaVa]=CalV(E,SigmaE,D,r,T)
%a=zeros(8,8);
D=[
    1096853709
    1422513664
    1080412570
    1099330560
    821720
    676976
    196840
    37877619
    ];
a=D;
%b=zeros(8,8);
E=[
    5482334
    112522064
    57679892
    4537800
    751520
    1882103.375
    285241.125
    3833159
    ];
b=E;
%c=zeros(8,8);
SigmaE=[
    0.401835787
    0.543863954
    0.609681884
    0.741317746
    0.917986928
    0.931843334
    1.004589468
    1.02883818
    ];
c=SigmaE;
%计算Va'SigmaVa
key=0;
r=0.0225;
T=1;
PI=4*atan(1);
Va=b;%va以E为迭代的初值
newVa=Va;
SigmaVa=c; %SigmaVa以SigmaE为迭代的初值
for k=1:10  %迭代SigmaVa
    for j=1:10 %迭代Va
        oldVa=newVa;
        % Va=(E+D*exp(-r,T)*Nd2)/Ndl;
        % SigmaVa=E*SigmaE/(E+D*exp(-r,T)*Nd2);
        %t1=log(oldVa/a);
        d1=(log(oldVa./a)+(r+(SigmaVa.^2)/2)*T)./(SigmaVa.*(T^(1/2)));
        d2=d1-(SigmaVa*(T^(1/2)));
        Nd1=normcdf(d1,0,1);
        Nd2=normcdf(d2,0,1);
        fV=oldVa.*Nd1-a.*exp(-r*T).*Nd2-b;
        temp111=exp(-d1.^2/2)./((2*PI*T)^0.5.*SigmaVa)
        dfV=Nd1+temp111-a.*exp(-r*T).*exp(-d2.^2/2)./((2*PI*T)^0.5.*oldVa.*SigmaVa);
        if dfV==0
            dfV
            pause;
        end
        dV=-fV./dfV;
        newVa=oldVa+dV;   %前后两次的值认为非常接近,则迭代成功
        newVa
        if newVa==0
            oldVa
            newVa
            pause;
        end
        if(dV/newVa)<1e-7 & (dV/newVa)>-1e-7
            break;
        end
    end
    Va=newVa;
    d1=(log(Va./a)+(r+(SigmaVa.^2)/2)*T)./(SigmaVa.*(T^(1/2)));
    d2=d1-(SigmaVa*(T^(1/2)));
    Nd1=normcdf(d1,0,1);
    Nd2=normcdf(d2,0,1);  %方程右边与左边的比值
    diff=(Va.*Nd1-a.*exp(-r*T).*Nd2)./b;
    if diff<1-1e-5 | diff>1+1e-5
        assert('迭代出现错误'); %迭代出现错误
    else
        key=key+1;
    end
    newSigmaVa=b.*c./(b+a.*exp(-r*T).*Nd2);
    if((SigmaVa-newSigmaVa)./newSigmaVa)<1e-5 & ((SigmaVa-newSigmaVa)./newSigmaVa)>(-1e-5)
        break;
        key=key+1;
    else
        SigmaVa=newSigmaVa;
    end
end
if key==2
    %else
    % Va=一l:
    % SigmaVa=-1:
end

使用道具

8
syslon 发表于 2012-2-18 12:48:49 |只看作者 |坛友微信交流群
烦请楼主多看看基础的matlab知识,还有就是那两个for 循环,其实没有用到,

使用道具

9
syslon 发表于 2012-2-18 12:49:33 |只看作者 |坛友微信交流群
我把运行的结果给贴在这了,烦请楼主看看正确与否

ans =

  1.0e+009 *

                 NaN
   1.502597151647248
   1.113130803312277
   1.079132735700452
   0.001534193015389
   0.002534900899513
   0.000471079307586
   0.039933626244482

使用道具

10
forex95 发表于 2012-2-20 17:14:37 |只看作者 |坛友微信交流群
syslon 发表于 2012-2-18 12:49
我把运行的结果给贴在这了,烦请楼主看看正确与否

ans =
哇,大师,你太牛了。送你500论坛币。请你在这个链接里面回复任何东东,我就把悬赏币给您。https://bbs.pinggu.org/thread-1285211-1-1.html
不过还有个小问题,程序倒是能算出来Va,可是SigmaVa为什么就没有算出来呢?

情绪只是时间的消耗品,所谓非理性行为就是对时间的量化。

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-22 09:34