Я пытаюсь найти подразумеваемую волатильность в MATLAB. Я использую fsolve
вместо blsimpv
. Я получаю эту ошибку:
Предупреждение: алгоритм Trust-region-dogleg FSOLVE не может обработать
неквадратные системы; используя вместо этого алгоритм Левенберга-Марквардта.
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