我正在尝试在MATLAB中查找隐含波动率。我使用的是fsolve
而不是blsimpv
。我收到此错误:
警告:FSOLVE的Trust-region-dogleg算法无法处理 非正方形系统;而是使用Levenberg-Marquardt算法。
fsolve停止了,因为根据 梯度,但函数值的向量不接近零 用功能公差的默认值测量。
我导入的数据是35种不同的执行价格和看跌价格。非常感谢您提供有关我的代码不正确之处的反馈。 K是行使价。
hw_3_dat=[homework3{1:32,1:2}];
iniGuess = 1;
Interest (1:32,1)=.004
Stock(1:32,1)=158.69
timetomaturity=1/35
put_price=hw_3_dat(:,2)
K=hw_3_dat(:,1)
volatility = fsolve(@(x) myfunc(x,put_price,Interest,Stock, K, timetomaturity),iniGuess);
%%
function C = bs ( Interest, Volatility, Stock, StrikePrice, TimeToMaturity )
d1 = (log(Stock ./ StrikePrice) + (Interest + (Volatility .^ 2) ./ 2) .* TimeToMaturity) ./ (Volatility .* sqrt(TimeToMaturity));
d2 = (log(Stock ./ StrikePrice) + (Interest - (Volatility .^ 2) ./ 2) .* TimeToMaturity) ./ (Volatility .* sqrt(TimeToMaturity));
C = normcdf(d1) .* Stock - normcdf(d2) .* StrikePrice .* exp(-Interest .* TimeToMaturity);
end
%%
function F = myfunc(vol,C,Interest, Stock, StrikePrice, TimeToMaturity)
F = C - bs(Interest,vol,Stock,StrikePrice,TimeToMaturity);
end