???输入参数“r”未定义。
==>中的错误BlackScholesPriceTmp at 8 B = R等
代码:
%function [price,delta,gamma,vega,theta]=BlackScholesPriceTmp(CallPutFlag,S,X,T,r,v,noutparams)
function [price,delta,gamma,vega,theta]=BlackScholesPriceTmp(CallPutFlag,S,X,T,r,v,noutparams)
delta=0;
gamma=0;
vega=0;
theta=0;
b=r;
d1 = (log(S / X) + (b + v ^ 2 / 2) * T) / (v * T^0.5);
d2 = d1 - v * T^0.5;
price=0;
if CallPutFlag == 'c' ,
price = S * normal_cdf(d1) - X * exp(-r * T) * normal_cdf(d2);
%endif
end
if noutparams>1,
delta=exp((b-r)*T)*normal_cdf(d1);
theta_tmp1= -( S*exp((b-r)*T)*normal_pdf(d1)*v )/(2*T^0.5);
theta_tmp2= -(b-r)*S*exp((b-r)*T)*normal_cdf(d1);
theta_tmp3= -r*X*exp(-r*T)*normal_cdf(d2);
theta=theta_tmp1+theta_tmp2+theta_tmp3;
%end
%endif
else
%price = X * exp(-r * T) * normal_cdf(-d2) - S * normal_cdf(-d1);
price = X * exp(-r * T) * normalcdf(-d2) - S * normcdf(-d1);
end
if noutparams>1,
delta=exp((b-r)*T)*(normal_cdf(d1)-1);
theta_tmp1= -( S*exp((b-r)*T)*normal_pdf(d1)*v )/(2*T^0.5);
theta_tmp2= (b-r)*S*exp((b-r)*T)*normal_cdf(-d1);
theta_tmp3= r*X*exp(-r*T)*normal_cdf(-d2);
theta=theta_tmp1+theta_tmp2+theta_tmp3;
endif
end
if noutparams>1,
gamma=(normal_pdf(d1)*exp((b-r)*T)) / (S*v*T^0.5);
vega=S * exp((b-r)*T)*normal_pdf(d1)*T^0.5;
endif
end
作为Matlab的新手,为什么它会抱怨r参数而不是其他参数。我不明白为什么其他人被抱怨?我在休息时做的是什么,而不是在r?
答案 0 :(得分:2)
在MATLAB中,您可以调用一个小于声明的输入参数数量的函数。如果被调用函数尝试访问存储在未指定的参数中的值,则只会出错。在这种情况下,错误消息将是您获得的消息,即“输入参数” parameterName “未定义。”。
MATLAB函数可以使用nargin
函数在运行时确定传递的实际参数的数量。通常,以下习惯用于为未指定的参数提供默认值:
function foo(a, b)
if nargin < 1
a = 0; % default for a is 0
end
if nargin < 2
b = 1; % default for b is 1
end
... code that uses a and/or b ...
可以通过以下任何一种方式调用函数foo
:
foo(); % equivalent to foo(0, 1);
foo(5); % equivalent to foo(5, 1);
foo(5, 6);
答案 1 :(得分:1)
我认为除了r
之外还有几个问题使用包含normal_pdf(),normal_cdf(),mormalcdf()的行,正确的形式是normpdf(),normcdf()
你也有几个endif语句,matlab使用end语句。
我可以使用Matlab 7.9或GNU Octave 3.2.3成功调用以下函数。
function [price,delta,gamma,vega,theta]=BlackScholesPriceTmp(CallPutFlag,S,X,T,r,v,noutparams)
delta=0; gamma=0; vega=0; theta=0;
b=r;
d1 = (log(S / X) + (b + v ^ 2 / 2) * T) / (v * T^0.5);
d2 = d1 - v * T^0.5;
price=0;
if CallPutFlag == 'c' ,
price = S * normcdf(d1) - X * exp(-r * T) * normcdf(d2);
end
if noutparams>1,
delta=exp((b-r)*T)*normcdf(d1);
theta_tmp1= -( S*exp((b-r)*T)*normpdf(d1)*v )/(2*T^0.5);
theta_tmp2= -(b-r)*S*exp((b-r)*T)*normcdf(d1);
theta_tmp3= -r*X*exp(-r*T)*normcdf(d2);
theta=theta_tmp1+theta_tmp2+theta_tmp3;
else
price = X * exp(-r * T) * normcdf(-d2) - S * normcdf(-d1);
end
if noutparams>1,
delta=exp((b-r)*T)*(normcdf(d1)-1);
theta_tmp1= -( S*exp((b-r)*T)*normpdf(d1)*v )/(2*T^0.5);
theta_tmp2= (b-r)*S*exp((b-r)*T)*normcdf(-d1);
theta_tmp3= r*X*exp(-r*T)*normcdf(-d2);
theta=theta_tmp1+theta_tmp2+theta_tmp3;
end
if noutparams>1,
gamma=(normpdf(d1)*exp((b-r)*T)) / (S*v*T^0.5);
vega=S * exp((b-r)*T)*normpdf(d1)*T^0.5;
end
答案 2 :(得分:0)
您很可能正在尝试运行该功能。您必须在命令窗口(控制台)中使用[price,delta,gamma,vega,theta]=BlackScholesPriceTmp(CallPutFlag,S,X,T,r,v,noutparams)
在外部调用该函数。但是,请确保使用您想要的值初始化每个输入,否则您将再次收到错误。