全部版块 我的主页
论坛 金融投资论坛 六区 金融学(理论版) 金融工程(数量金融)与金融衍生品
8058 3
2015-05-08
求E1_mean的程序没问题,function定义也没问题,问题出在fsolve。fsolve是为了求每个E1_mean元素对应的x(1),x(2),也就是V和sigmaV,E1_mean包含10000个数据,怎样才能一次性求出对应的10000对V和sigmaV?   matlab为R2013b。程序如下:
global E1_mean
beta01=zeros(1,10000);beta01(1,: )=0.00000901;beta1=0.93095390;beta2=0.06165110;r=zeros(1,10000);r(1,: )=0.00196230; theta=zeros(1,10000);theta(1,: )=-0.00032120 ;path1=zeros(245,10000);    path1(1,: )=0.001218392 ^2;R1=zeros(245,10000);
for i=2:245
    path1(i,: )=beta01+beta1*path1(i-1,: )+beta2*path1(i-1,: ).*(randn(1,10000)-theta).^2 ;  
    R1(i,: )=r+(path1(i,: ).^0.5).*randn(1,10000);     
end
R1_cumsum=cumsum(R1,1);
E1=zeros(244,10000);
for i=1:244
    E1(i,: )=180970333.4*exp(R1_cumsum(i+1,: ));
end
E1_mean=mean(E1,1);

function F = blsprice(x)
global E1_mean j
%   x(1) : V; 银行总资产
%   x(2) : sigmav; 资产波动率
rf = 3.6/100;      %无风险利率
B = 2055510000000.00 /(10^12) ;      %股权的执行价格 B/(10^12)
sigmaE = 0.545240875  ;        
T = 1;     % 时间周期
t = 0;     % 时间
for j=1:10000
d1 = (log(x(1)/(0.97*B))+rf*(T-t)+x(2)^2*(T-t)/2) / (x(2)*sqrt(T-t));
d2 = d1-x(2)*sqrt(T-t);
F(1) = x(1)* normcdf(d1) - 0.97*B* normcdf(d2) -(E1_mean(1,j))/10^12;   
F(2) = x(1)*normcdf(d1)*x(2) - sigmaE*(E1_mean(1,j))/10^12;
end

global  j
V1=zeros(1,10000);
sigmaV1=zeros(1,10000);
for j=1:10000
x0 = [1.2;1];  
options=optimset('Display','off','MaxFunEvals',10000,'MaxIter',10000);
[x,fval] = fsolve(@blsprice,x0,options);
V1(1,j)=x(1);
sigmaV1(1,j)=x(2);
end

程序运行后显示Error using erfc

Input must be real and full.

Error in normcdf>localnormcdf (line 124)

p(todo) = 0.5 * erfc(-z ./ sqrt(2));

Error in normcdf (line 46)

[varargout{1:max(1,nargout)}] =localnormcdf(uflag,x,varargin{:});

Error in blsprice (line 20)

F(1) = x(1)* normcdf(d1) - 0.97*B*normcdf(d2) -(E1_mean(1,j))/10^12;   

Error in trustnleqn (line 200)

    F= feval(funfcn{3},reshape(xTrial,sizes.xRows,sizes.xCols),varargin{:});

Error in fsolve (line 366)

   [x,FVAL,JACOB,EXITFLAG,OUTPUT,msgData]=...

Error in solve_blsprice (line 9)

[x,fval] = fsolve(@blsprice,x0,options);


二维码

扫码加我 拉你入群

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

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

全部回复
2015-5-9 10:16:13
d1 =

   0.3927 + 2.0360i


d2 =

  -1.1503 + 2.0360i

Error using erfc
Input must be real and full.

...

out put d1 d2你就会发现   solve在寻找解得过程中迭代到了复数,因此normcdf出了错,error msg里面最上层才是出问题的函数,而不是最下面。检查你的code,我看你j=1的时候就找了半天,说明你的目标函数的形状很差,solver收敛不了,所以找了好久解最后找到了复数。复数可能是log取负数的时候出现的,因为solver不知道x的定义域,他在寻找解得过程中用负数去试显然会出问题。我觉得应该是你的code有地方有bug,否则肯定一下子就能找到。



二维码

扫码加我 拉你入群

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

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

2015-5-9 20:03:38
Chemist_MZ 发表于 2015-5-9 10:16
d1 =

   0.3927 + 2.0360i
多谢大神!!!能不能提一些改进建议?
二维码

扫码加我 拉你入群

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

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

2023-3-3 09:30:31
请问楼主解决了吗?
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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