Matlab (2012b)의 Black-Scholes 공식을 사용하여 내재 변동성을 계산하려고하지만 일부 파업 가격에 문제가 있습니다. 예를 들어 blsimpv (1558,1440,0.0024, (1/12), 116.4)는 NaN을 반환합니다. 아마 함수에 문제가있을 것이라고 생각하여 인터넷에서 다른 MATLAB 스크립트를 검색하고 사용자 정의 요구 사항에 맞게 사용자 정의했지만 불행히도 유효한 암시 적 변동성을 반환 할 수는 없습니다.Matlab의 내재 변동성
function sigma=impvol(C,S,K,r,T)
%F=S*exp((r).*T);
%G=C.*exp(r.*T);
%alpha=log(F./K)./sqrt(T);
%beta=0.5*sqrt(T);
%a=beta.*(F+K);
%b=sqrt(2*pi)*(0.5*(F-K)-G);
%c=alpha.*(F-K);
%disc=max(0,b.^2-4*a.*c);
%sigma0=(-b+sqrt(disc))./(2*a);
i=-1000;
while i<=5000
sigma0=i/1000;
sigma=NewtonMethod(sigma0);
if sigma<=10 && sigma>=-10
fprintf('This is sigma %f',sigma)
end
i=i+1;
end
end
function s1=NewtonMethod(s0)
s1=s0;
count=0;
[email protected](x) call(S,K,r,x,T)-C;
[email protected](x) call_vega(S,K,r,x,T);
max_count=1e4;
while max(abs(f(s1)))>1e-7 && count<max_count
count=count+1;
s0=s1;
s1=s0-f(s0)./fprime(s0);
end
end
end
function d=d1(S,K,r,sigma,T)
d=(log(S./K)+(r+sigma.^2*0.5).*(T))./(sigma.*sqrt(T));
end
function d=d2(S,K,r,sigma,T)
d=(log(S./K)+(r-sigma.^2*0.5).*(T))./(sigma.*sqrt(T));
end
function p=Phi(x)
p=0.5*(1.+erf(x/sqrt(2)));
end
function p=PhiPrime(x)
p=exp(-0.5*x.^2)/sqrt(2*pi);
end
function c=call(S,K,r,sigma,T)
c=S.*Phi(d1(S,K,r,sigma,T))-K.*exp(-r.*(T)).*Phi(d2(S,K,r,sigma,T));
end
function v=call_vega(S,K,r,sigma,T)
v=S.*PhiPrime(d1(S,K,r,sigma,T)).*sqrt(T);
end
그러나 impvol (116.4,1558,1440,0.0024, (1/12))을 실행하면 'Inf'값이 반환됩니다. 여하튼 수렴하지 않는 Newton-Rhapson 방법의 문제가 있습니다. 그러나 저는 이것을 해결하는 방법을 알지 못합니다. 누구든지이 문제를 해결하는 방법을 알고 있거나 묵시적 변동성을 계산하는 방법을 알고 있습니까?
이미 도움을 주셔서 감사합니다. 종류와 관련,
헹크 내재 변동성 잘 작동하지 않습니다
이것은 상당히 많은 코드입니다. 문제를 일으키는 부분을 분리 할 수 있습니까?/예상 한대로하지 않습니까? –