我的任务的子问题需要通过Black和Scholes期权估值公式计算隐含波动率σ,该公式为:
更具体地说,当所有参数都给定值时,它需要通过对σ进行根解来数值求解方程。
我正在尝试使用MATLAB的fzero
函数来估算σ。我创建了两个脚本。
第一个脚本包括:
S_0 = 1403; % Stock Price
K = 1350 ; % Strike Price
rf = 0.0534; % Risk Free Rate
div=0.0118; % Divident Rate
T=0.1028; % Maturity Period
C=81;% Call option value
fixed_input=[S_0,K,rf,div,T,C];% Construct vector input values
save ('fixed_input.mat','fixed_input');
imp_vol_ini=0.1; % Initial Implied Volatility Value
BlackScholes = @BSF;
[imp_vol,y]=fzero(BlackScholes,imp_vol_ini)
虽然第二个脚本包含代码:
function y=BSF(imp_vol)
load fixed_input
S_0=fixed_input(1);
K=fixed_input(2);
rf=fixed_input(3);
div=fixed_input(4);
T=fixed_input(5);
C=fixed_input(6);
d1_nominator=log(S_0/K)+(rf-div+(imp_vol^2)/2)*T;
d1_denominator=imp_vol*sqrt(T);
d1=d1_nominator/d1_denominator;
d2=d1-imp_vol*sqrt(T);
y=C-(exp(-div*T))*S_0*normcdf(d1)+K*(exp(-rf/T))*normcdf(d2);
end
代码有效,但数字不合理。通常,在求解之后,y
应接近零,而σ
应位于区间[0.1,0.3]之间,但事实并非如此。我检索的数字是y=81
σ=-2.7018e-16
。
我觉得这与fzero
的约束和选项有关。你能帮我吗?
答案 0 :(得分:1)
错误位于BSF
函数的最后一行,即:
y=C-(exp(-div*T))*S_0*normcdf(d1)+K*(exp(-rf/T))*normcdf(d2);
% ↑
你写了一个/
而不是*
。应该是这样的:
y=C-(exp(-div*T))*S_0*normcdf(d1)+K*(exp(-rf*T))*normcdf(d2);
% ↑