커뮤니티

수정부탁드립니다.

프로필 이미지
회원
2008-04-03 02:31:27
1382
글번호 15178
답변완료
예전에 수식지왕님이 올려주신 자료입니다. YES3.1로 업그레이드 되면서 검증이 되지 않습니다. 수정부탁드립니다. _NormSDist.yfu (표준정규분포사용자함수) input:z(numeric); var : a1(0.31938153), a2(-0.356563782), a3(1.781477937), a4(-1.821255978), a5(1.330274429), R(0.2316419), Exp(2.71828182846), k(0), N(0); k = 1 / (1 + (R * Abs(z))); N = 1 / (Sqrt(2 * Pie())) * Exp^(-(z^2) / 2); _NormSDist = 1 - N * (a1 * k + a2 * (k ^ 2) + a3 * (k ^ 3) + a4 * (k ^ 4) + a5 * (k ^ 5)); If z < 0 Then _NormSDist = 1 - _NormSDist; _BlackSholes.yfu (BS 모델이론가 사용자함수) input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric); var:Exp(2.71828182846); var1 = (log(S/X) + (r + (Sig^2) / 2) * T) / (Sig*sqrt(T)); var2 = var1 - Sig*sqrt(T); if cpflag == 1 then { _BlackSholes = S * _NormSDist(var1) - X * (Exp^((-r)*T)) * _NormSDist(var2); } else if cpflag == 2 then { _BlackSholes = X * (Exp^((-r)*T)) * _NormSDist(var2) - S * _NormSDist(var1); } _ImVol.yfu (내재변동성 사용자함수) input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Price(numeric); var:vLow(0), vHigh(0), vi(0),cLow(0), cHigh(0), Epsilon(0.001), j(0), n(5000); vLow = 0.01; vHigh = 2; cLow = _BlackSholes(cpFlag, S, X, T, r, q, vLow); cHigh = _BlackSholes(cpFlag, S, X, T, r, q, vHigh); vi = vLow + (Price - cLow) * (vHigh - vLow) / (cHigh - cLow); for j = 0 to n { If _BlackSholes(cpFlag, S, X, T, r, q, vi) < Price Then vLow = vi; Else vHigh = vi; cLow = _BlackSholes(cpFlag, S, X, T, r, q, vLow); cHigh = _BlackSholes(cpFlag, S, X, T, r, q, vHigh); vi = vLow + (Price - cLow) * (vHigh - vLow) / (cHigh - cLow); if Abs(Price - _BlackSholes(cpFlag, S, X, T, r, q, vi)) <= Epsilon then { var1 = vi; j = n; } } _ImVol = vi; _Delta.yfu (델타 사용자함수) input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric); var:Exp(2.71828182846); var1 = (log(S/X) + (q + (Sig^2) / 2)*T) / (Sig*sqrt(T)); if cpflag == 1 then { _Delta = Exp^((q-r)*T) * _NormSDist(var1); } else if cpflag == 2 then { _Delta = Exp^((q-r)*T) * (_NormSDist(var1)-1); } _Gamma.yfu (감마 사용자함수) input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric); var:Exp(2.71828182846); var1 = (log(S/X) + (q + (Sig^2) / 2)*T) / (Sig*sqrt(T)); var3 = (1 / Sqrt(2 * pie())) * (1 / Exp^((var1^2) / 2)); _Gamma = Exp^((q-r)*T) * var3 / (S*Sig*Sqrt(T)); _Vega.yfu (베가 사용자함수) input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric); var:Exp(2.71828182846); var1 = (log(S/X) + (q + (Sig^2) / 2)*T) / (Sig*Sqrt(T)); var3 = (1 / Sqrt(2*pie())) * (1 / Exp^((var1^2) / 2)); _Vega = S * Exp^((q-r)*T) * var3 * Sqrt(T) /100; _Theta.yfu (쎄타 사용자함수) input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric); var:Exp(2.71828182846); var1 = (log(S/X) + (q + (Sig^2) / 2)*T) / (Sig*sqrt(T)); var2 = var1 - Sig*sqrt(T); var3 = (1 / Sqrt(2 * pie())) * (1 / Exp^((var1^2) / 2)); if cpflag == 1 then { _Theta = (-1) * (S * Exp^((q-r)*T) * var3 * Sig) / (2*Sqrt(T)) - (q-r) * S * Exp^((q-r)*T) * _NormSDist(var1) - r * X * Exp^((-r)*T) * _NormSDist(var2); } else if cpflag == 2 then { _Theta = (-1) * (S * Exp^((q-r)*T) * var3 * Sig) / (2*Sqrt(T)) + (q-r) * S * Exp^((q-r)*T) * _NormSDist(-var1) + r * X * Exp^((-r)*T) * _NormSDist(-var2); } _Theta = _Theta / 365; _Rho.yfu (로 사용자함수) input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric); var:Exp(2.71828182846); var1 = (log(S/X) + (q + (Sig^2) / 2)*T) / (Sig*sqrt(T)); var2 = var1 - Sig*sqrt(T); if cpflag == 1 then { _Rho = X * T * Exp^((q-r)*T) * _NormSDist(var2); } else if cpflag == 2 then { _Rho = -X * T * Exp^((q-r)*T) * _NormSDist(-var2); } 옵션민감도.yin (지표식) /*cpFlag : Call,Put 구분, 1,2로 표현 S : 기초자산가격의 가격, 예)주가지수(KOSPI200) X : 행사가격 T : 잔존만기(연율) r : 무위험 이자율, 예) CD금리 q : 배당률 Sig : 변동성 */ input: cpflag(1), //콜풋 입력 InS(0), //현재 지수를 입력 안하면 data 참조를 통해 실시간 가격을 이용. 테스트시 이용 x(145.0), //행사가 입력 ex(20050908), //만기일 r(0.0351), //CD 금리, 요기서 볼 수 있음 ==> http://stock.koscom.co.kr/ q(0), //배당률 InSig(0), //내재변동성을 입력 안하면 자체 계산된 변동성을 사용. 단, 오차 감안해야 함 InPrice(0); //역시 테스트를 목적으로 함 var:S(0),T(0),sig(0),price(0),ImVol(0),bs(0),delta(0),gamma(0),vega(0),theta(0),rho(0); S = iff(inS!=0,inS,data1("c")); //kospi종합을 같이 띄워 놓아야 합니다. T = (DateToJulian(ex) - DateToJulian(date) + 1)/365; price = iff(inPrice!=0,inPrice,c); imvol = _ImVol(cpFlag, S, X, T, r, q, price); sig = iff(insig!=0,insig,ImVol); bs = _BlackSholes(cpFlag, S, X, T, r, q, sig); delta = _Delta(cpFlag, S, X, T, r, q, sig); gamma = _gamma(cpFlag, S, X, T, r, q, sig); theta = _theta(cpFlag, S, X, T, r, q, sig); vega = _vega(cpFlag, S, X, T, r, q, sig); rho = _rho(cpFlag, S, X, T, r, q, sig); plot1(imvol*100,"내재변동성"); plot2(bs,"이론가"); plot3(delta,"델타"); plot4(gamma,"감마"); plot5(theta,"쎄타"); plot6(vega,"베가"); plot7(rho,"로");
지표
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2008-04-03 11:00:43

안녕하세요 예스스탁입니다. 사용자 함수의 몇부분을 수정했습니다. 시용자 함수를 zip파일로 묶어 첨부해 드립니다. 지표식은 변경사항이 없습니다. 원식 그대로 사용하시면 됩니다. 즐거운 하루되세요 > CJ_MINSUNG 님이 쓴 글입니다. > 제목 : 수정부탁드립니다. > 예전에 수식지왕님이 올려주신 자료입니다. YES3.1로 업그레이드 되면서 검증이 되지 않습니다. 수정부탁드립니다. _NormSDist.yfu (표준정규분포사용자함수) input:z(numeric); var : a1(0.31938153), a2(-0.356563782), a3(1.781477937), a4(-1.821255978), a5(1.330274429), R(0.2316419), Exp(2.71828182846), k(0), N(0); k = 1 / (1 + (R * Abs(z))); N = 1 / (Sqrt(2 * Pie())) * Exp^(-(z^2) / 2); _NormSDist = 1 - N * (a1 * k + a2 * (k ^ 2) + a3 * (k ^ 3) + a4 * (k ^ 4) + a5 * (k ^ 5)); If z < 0 Then _NormSDist = 1 - _NormSDist; _BlackSholes.yfu (BS 모델이론가 사용자함수) input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric); var:Exp(2.71828182846); var1 = (log(S/X) + (r + (Sig^2) / 2) * T) / (Sig*sqrt(T)); var2 = var1 - Sig*sqrt(T); if cpflag == 1 then { _BlackSholes = S * _NormSDist(var1) - X * (Exp^((-r)*T)) * _NormSDist(var2); } else if cpflag == 2 then { _BlackSholes = X * (Exp^((-r)*T)) * _NormSDist(var2) - S * _NormSDist(var1); } _ImVol.yfu (내재변동성 사용자함수) input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Price(numeric); var:vLow(0), vHigh(0), vi(0),cLow(0), cHigh(0), Epsilon(0.001), j(0), n(5000); vLow = 0.01; vHigh = 2; cLow = _BlackSholes(cpFlag, S, X, T, r, q, vLow); cHigh = _BlackSholes(cpFlag, S, X, T, r, q, vHigh); vi = vLow + (Price - cLow) * (vHigh - vLow) / (cHigh - cLow); for j = 0 to n { If _BlackSholes(cpFlag, S, X, T, r, q, vi) < Price Then vLow = vi; Else vHigh = vi; cLow = _BlackSholes(cpFlag, S, X, T, r, q, vLow); cHigh = _BlackSholes(cpFlag, S, X, T, r, q, vHigh); vi = vLow + (Price - cLow) * (vHigh - vLow) / (cHigh - cLow); if Abs(Price - _BlackSholes(cpFlag, S, X, T, r, q, vi)) <= Epsilon then { var1 = vi; j = n; } } _ImVol = vi; _Delta.yfu (델타 사용자함수) input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric); var:Exp(2.71828182846); var1 = (log(S/X) + (q + (Sig^2) / 2)*T) / (Sig*sqrt(T)); if cpflag == 1 then { _Delta = Exp^((q-r)*T) * _NormSDist(var1); } else if cpflag == 2 then { _Delta = Exp^((q-r)*T) * (_NormSDist(var1)-1); } _Gamma.yfu (감마 사용자함수) input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric); var:Exp(2.71828182846); var1 = (log(S/X) + (q + (Sig^2) / 2)*T) / (Sig*sqrt(T)); var3 = (1 / Sqrt(2 * pie())) * (1 / Exp^((var1^2) / 2)); _Gamma = Exp^((q-r)*T) * var3 / (S*Sig*Sqrt(T)); _Vega.yfu (베가 사용자함수) input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric); var:Exp(2.71828182846); var1 = (log(S/X) + (q + (Sig^2) / 2)*T) / (Sig*Sqrt(T)); var3 = (1 / Sqrt(2*pie())) * (1 / Exp^((var1^2) / 2)); _Vega = S * Exp^((q-r)*T) * var3 * Sqrt(T) /100; _Theta.yfu (쎄타 사용자함수) input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric); var:Exp(2.71828182846); var1 = (log(S/X) + (q + (Sig^2) / 2)*T) / (Sig*sqrt(T)); var2 = var1 - Sig*sqrt(T); var3 = (1 / Sqrt(2 * pie())) * (1 / Exp^((var1^2) / 2)); if cpflag == 1 then { _Theta = (-1) * (S * Exp^((q-r)*T) * var3 * Sig) / (2*Sqrt(T)) - (q-r) * S * Exp^((q-r)*T) * _NormSDist(var1) - r * X * Exp^((-r)*T) * _NormSDist(var2); } else if cpflag == 2 then { _Theta = (-1) * (S * Exp^((q-r)*T) * var3 * Sig) / (2*Sqrt(T)) + (q-r) * S * Exp^((q-r)*T) * _NormSDist(-var1) + r * X * Exp^((-r)*T) * _NormSDist(-var2); } _Theta = _Theta / 365; _Rho.yfu (로 사용자함수) input:cpflag(numeric),S(numeric),X(numeric),T(numeric),r(numeric),q(numeric),Sig(numeric); var:Exp(2.71828182846); var1 = (log(S/X) + (q + (Sig^2) / 2)*T) / (Sig*sqrt(T)); var2 = var1 - Sig*sqrt(T); if cpflag == 1 then { _Rho = X * T * Exp^((q-r)*T) * _NormSDist(var2); } else if cpflag == 2 then { _Rho = -X * T * Exp^((q-r)*T) * _NormSDist(-var2); } 옵션민감도.yin (지표식) /*cpFlag : Call,Put 구분, 1,2로 표현 S : 기초자산가격의 가격, 예)주가지수(KOSPI200) X : 행사가격 T : 잔존만기(연율) r : 무위험 이자율, 예) CD금리 q : 배당률 Sig : 변동성 */ input: cpflag(1), //콜풋 입력 InS(0), //현재 지수를 입력 안하면 data 참조를 통해 실시간 가격을 이용. 테스트시 이용 x(145.0), //행사가 입력 ex(20050908), //만기일 r(0.0351), //CD 금리, 요기서 볼 수 있음 ==> http://stock.koscom.co.kr/ q(0), //배당률 InSig(0), //내재변동성을 입력 안하면 자체 계산된 변동성을 사용. 단, 오차 감안해야 함 InPrice(0); //역시 테스트를 목적으로 함 var:S(0),T(0),sig(0),price(0),ImVol(0),bs(0),delta(0),gamma(0),vega(0),theta(0),rho(0); S = iff(inS!=0,inS,data1("c")); //kospi종합을 같이 띄워 놓아야 합니다. T = (DateToJulian(ex) - DateToJulian(date) + 1)/365; price = iff(inPrice!=0,inPrice,c); imvol = _ImVol(cpFlag, S, X, T, r, q, price); sig = iff(insig!=0,insig,ImVol); bs = _BlackSholes(cpFlag, S, X, T, r, q, sig); delta = _Delta(cpFlag, S, X, T, r, q, sig); gamma = _gamma(cpFlag, S, X, T, r, q, sig); theta = _theta(cpFlag, S, X, T, r, q, sig); vega = _vega(cpFlag, S, X, T, r, q, sig); rho = _rho(cpFlag, S, X, T, r, q, sig); plot1(imvol*100,"내재변동성"); plot2(bs,"이론가"); plot3(delta,"델타"); plot4(gamma,"감마"); plot5(theta,"쎄타"); plot6(vega,"베가"); plot7(rho,"로");